CypherChecker.cs (15854B)
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Security.Cryptography; 5 using System.Text; 6 using System.Threading.Tasks; 7 using Cypher; 8 9 namespace Cypher 10 { 11 internal class CypherChecker 12 { 13 public void Inspection() 14 { 15 int countChecker = 0; 16 bool complete = false; 17 //鍵の読み込み 18 Question question = new Question(); 19 ResdFiles resdFiles = new ResdFiles(); 20 //int[] key; 21 //string whereKeyFile = question.Questions("Where key file", true); 22 //key = resdFiles.ReadKeyFile(whereKeyFile); 23 double[] key2Double; 24 Key key1 = new Key(); 25 26 //鍵を作って比較 27 Console.WriteLine("Please wait a minuits"); 28 Console.WriteLine("Starting the inspection..."); 29 var sw = new System.Diagnostics.Stopwatch(); 30 sw.Start(); 31 Task.Run(() => 32 { 33 Console.ReadKey(); 34 Console.WriteLine("Number of verifications is " + countChecker); 35 Console.WriteLine("Time taken is " + sw.ElapsedMilliseconds); 36 }); 37 key2Double = key1.GeneratKey(); 38 //復号プログラム 39 40 //変数宣言 41 double[] order = new double[1000]; 42 int inNumber = 0; 43 SHA512 shaM = new SHA512Managed(); //インスタンス 44 45 //質問 46 string whereEncrypted; 47 string whereSortedFile; 48 string howLongDate; 49 50 51 //自動テスト 52 whereEncrypted = @"e:\enc"; 53 whereSortedFile = @"e:\sorted.txt"; 54 howLongDate = "390"; 55 56 57 /* 58 Question question = new Question(); 59 whereEncrypted = question.Questions("Where is encrypted file?", false); 60 while (Directory.Exists(whereEncrypted) == false) 61 { 62 Console.WriteLine("The folder not exists."); 63 Console.WriteLine("Plese try another folder."); 64 } 65 whereKeyFile = question.Questions("Where is KeyFile?", true); 66 whereSortedFile = question.Questions("Where will you create sorted file?", false); 67 howLongDate = question.Questions("How Long the date file?", false); 68 */ 69 70 int howLongDateInt = int.Parse(howLongDate); 71 72 //ハッシュ関数を用いてデータサイズを知らないかどうかで判断 73 //元のハッシュ値を持ってくる 74 byte[] hashOriginal = File.ReadAllBytes(whereEncrypted + @"\" + "Number"); 75 byte[] hashNumber; 76 byte[] LengthByte = BitConverter.GetBytes(howLongDateInt); 77 hashNumber = shaM.ComputeHash(LengthByte); 78 79 if (BitConverter.ToInt32(hashOriginal) != BitConverter.ToInt32(hashNumber)) 80 { 81 Console.WriteLine("You mistaken!"); 82 Console.WriteLine("The date Number is wrong!"); 83 Console.WriteLine("This program will stop by 10seconds."); 84 Thread.Sleep(10000); 85 Environment.Exit(0); 86 } 87 88 //byteのデータを長さの数だけ用意 89 byte[] dates = new byte[howLongDateInt]; 90 byte[] sorded = new byte[howLongDateInt]; 91 92 int quotient; 93 int amari; 94 bool multipleJudgment; 95 //データサイズに適した数ずつ引っこ抜く 96 if (howLongDateInt % 1000 == 0) 97 { 98 quotient = howLongDateInt / 1000; 99 amari = howLongDateInt % 1000; 100 multipleJudgment = true; 101 } 102 else 103 { 104 //1000で割り切れない場合は、999で割って、その余りをすべてamariにぶち込む 105 quotient = howLongDateInt / 999; 106 amari = howLongDateInt - quotient * 999; 107 multipleJudgment = false; 108 } 109 110 //ReadkeyFile 111 order = key2Double; 112 113 //Read Encrypted File 114 inNumber = 0; 115 FileStream fs = new FileStream(whereEncrypted + @"\" + "Encrypted", FileMode.Open); 116 byte[] encrypted = new byte[fs.Length]; 117 fs.Read(encrypted, 0, encrypted.Length); 118 fs.Close(); 119 Console.WriteLine("Encrypted date was readed"); 120 121 122 123 124 //sort 125 inNumber = 0; 126 int arreyNumber = 0; 127 int indexNumber = 0; 128 int indexStartNumber = 0; 129 int indexEndNumber = 0; 130 int outNumber = 0; 131 if (multipleJudgment) 132 { 133 //1000で割り切れないとき 134 while (arreyNumber < 1000) 135 { 136 //参照すべき番号を検索 137 indexNumber = Array.IndexOf(order, arreyNumber); 138 //参照始めの行 139 indexStartNumber = indexNumber * quotient; 140 //参照終わり+1の行 141 indexEndNumber = (indexNumber + 1) * quotient; 142 143 //参照して"written"に代入 144 outNumber = indexStartNumber; 145 while (indexNumber < indexEndNumber) 146 { 147 sorded[inNumber] = encrypted[outNumber]; 148 indexNumber++; 149 outNumber++; 150 } 151 arreyNumber++; 152 } 153 } 154 else 155 { 156 //1000で割り切れない数の場合 157 //余りの位置を特定 158 int whereAmari = Array.IndexOf(order, 999); 159 160 while (arreyNumber < 1000) 161 { 162 indexNumber = Array.IndexOf(order, arreyNumber); //inNumber 80 163 //indexNumberとamariの関係で場合分け 164 if (indexNumber < whereAmari) 165 { 166 //indexNumberがamariの方が小さいとき。 167 indexStartNumber = indexNumber * quotient; 168 indexEndNumber = (indexNumber + 1) * quotient; 169 } 170 else if (indexNumber == whereAmari) 171 { 172 indexStartNumber = indexNumber * quotient; 173 indexEndNumber = indexNumber * quotient + amari; 174 } 175 else 176 { 177 indexStartNumber = (indexNumber - 1) * quotient + amari; 178 indexEndNumber = indexNumber * quotient + amari; 179 } 180 outNumber = indexStartNumber; 181 while (outNumber < indexEndNumber) 182 { 183 sorded[inNumber] = encrypted[outNumber]; 184 outNumber++; 185 inNumber++; 186 } 187 arreyNumber++; 188 } 189 } 190 191 192 //データを元の長さに整理 193 //ファイルサイズが1000以下の場合 194 if (howLongDateInt < 1000) 195 { 196 Array.Copy(sorded, 0, dates, 0, 1000 - howLongDateInt); 197 } 198 else 199 { 200 dates = sorded; 201 } 202 203 //元のデータのハッシュと突き合わせ 204 byte[] hashdate; 205 hashdate = shaM.ComputeHash(dates); 206 byte[] hashOriginalDate; 207 hashOriginalDate = File.ReadAllBytes(whereEncrypted + @"\" + "Date"); 208 if (BitConverter.ToInt32(hashdate) == BitConverter.ToInt32(hashOriginalDate)) 209 { 210 complete = true; 211 } 212 countChecker++; 213 214 //繰り返し 215 while (complete == false) 216 { 217 Task.Run(() => 218 { 219 key2Double = key1.GeneratKey(); 220 221 //復号プログラム 222 223 //変数宣言 224 double[] order = new double[1000]; 225 int inNumber = 0; 226 SHA512 shaM = new SHA512Managed(); //インスタンス 227 228 //質問 229 string whereEncrypted; 230 string whereSortedFile; 231 string howLongDate; 232 233 234 //自動テスト 235 whereEncrypted = @"e:\enc"; 236 whereSortedFile = @"e:\sorted.txt"; 237 howLongDate = "390"; 238 239 240 /* 241 Question question = new Question(); 242 whereEncrypted = question.Questions("Where is encrypted file?", false); 243 while (Directory.Exists(whereEncrypted) == false) 244 { 245 Console.WriteLine("The folder not exists."); 246 Console.WriteLine("Plese try another folder."); 247 } 248 whereKeyFile = question.Questions("Where is KeyFile?", true); 249 whereSortedFile = question.Questions("Where will you create sorted file?", false); 250 howLongDate = question.Questions("How Long the date file?", false); 251 */ 252 253 int howLongDateInt = int.Parse(howLongDate); 254 255 //ハッシュ関数を用いてデータサイズを知らないかどうかで判断 256 //元のハッシュ値を持ってくる 257 byte[] hashOriginal = File.ReadAllBytes(whereEncrypted + @"\" + "Number"); 258 byte[] hashNumber; 259 byte[] LengthByte = BitConverter.GetBytes(howLongDateInt); 260 hashNumber = shaM.ComputeHash(LengthByte); 261 262 if (BitConverter.ToInt32(hashOriginal) != BitConverter.ToInt32(hashNumber)) 263 { 264 Console.WriteLine("You mistaken!"); 265 Console.WriteLine("The date Number is wrong!"); 266 Console.WriteLine("This program will stop by 10seconds."); 267 Thread.Sleep(10000); 268 Environment.Exit(0); 269 } 270 271 //byteのデータを長さの数だけ用意 272 byte[] dates = new byte[howLongDateInt]; 273 byte[] sorded = new byte[howLongDateInt]; 274 275 int quotient; 276 int amari; 277 bool multipleJudgment; 278 //データサイズに適した数ずつ引っこ抜く 279 if (howLongDateInt % 1000 == 0) 280 { 281 quotient = howLongDateInt / 1000; 282 amari = howLongDateInt % 1000; 283 multipleJudgment = true; 284 } 285 else 286 { 287 //1000で割り切れない場合は、999で割って、その余りをすべてamariにぶち込む 288 quotient = howLongDateInt / 999; 289 amari = howLongDateInt - quotient * 999; 290 multipleJudgment = false; 291 } 292 293 //ReadkeyFile 294 ResdFiles resdFiles = new ResdFiles(); 295 order = key2Double; 296 297 298 299 300 301 302 //sort 303 inNumber = 0; 304 int arreyNumber = 0; 305 int indexNumber = 0; 306 int indexStartNumber = 0; 307 int indexEndNumber = 0; 308 int outNumber = 0; 309 if (multipleJudgment) 310 { 311 //1000で割り切れないとき 312 while (arreyNumber < 1000) 313 { 314 //参照すべき番号を検索 315 indexNumber = Array.IndexOf(order, arreyNumber); 316 //参照始めの行 317 indexStartNumber = indexNumber * quotient; 318 //参照終わり+1の行 319 indexEndNumber = (indexNumber + 1) * quotient; 320 321 //参照して"written"に代入 322 outNumber = indexStartNumber; 323 while (indexNumber < indexEndNumber) 324 { 325 sorded[inNumber] = encrypted[outNumber]; 326 indexNumber++; 327 outNumber++; 328 } 329 arreyNumber++; 330 } 331 } 332 else 333 { 334 //1000で割り切れない数の場合 335 //余りの位置を特定 336 int whereAmari = Array.IndexOf(order, 999); 337 338 while (arreyNumber < 1000) 339 { 340 indexNumber = Array.IndexOf(order, arreyNumber); //inNumber 80 341 //indexNumberとamariの関係で場合分け 342 if (indexNumber < whereAmari) 343 { 344 //indexNumberがamariの方が小さいとき。 345 indexStartNumber = indexNumber * quotient; 346 indexEndNumber = (indexNumber + 1) * quotient; 347 } 348 else if (indexNumber == whereAmari) 349 { 350 indexStartNumber = indexNumber * quotient; 351 indexEndNumber = indexNumber * quotient + amari; 352 } 353 else 354 { 355 indexStartNumber = (indexNumber - 1) * quotient + amari; 356 indexEndNumber = indexNumber * quotient + amari; 357 } 358 outNumber = indexStartNumber; 359 while (outNumber < indexEndNumber) 360 { 361 sorded[inNumber] = encrypted[outNumber]; 362 outNumber++; 363 inNumber++; 364 } 365 arreyNumber++; 366 } 367 } 368 369 370 //データを元の長さに整理 371 //ファイルサイズが1000以下の場合 372 if (howLongDateInt < 1000) 373 { 374 Array.Copy(sorded, 0, dates, 0, 1000 - howLongDateInt); 375 } 376 else 377 { 378 dates = sorded; 379 } 380 381 //元のデータのハッシュと突き合わせ 382 byte[] hashdate; 383 hashdate = shaM.ComputeHash(dates); 384 byte[] hashOriginalDate; 385 hashOriginalDate = File.ReadAllBytes(whereEncrypted + @"\" + "Date"); 386 if (BitConverter.ToInt32(hashdate) == BitConverter.ToInt32(hashOriginalDate)) 387 { 388 complete = true; 389 } 390 countChecker++; 391 }); 392 393 } 394 sw.Stop(); 395 Console.WriteLine("Number of verifications is " + countChecker); 396 Console.WriteLine("Time taken is " + sw.ElapsedMilliseconds); 397 } 398 } 399 } 400