Cypher

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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