Cypher

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

SortProgram.cs (8151B)


      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 
      8 namespace Cypher
      9 {
     10     internal class SortProgram
     11     {
     12         public void sort()
     13         {
     14             //復号プログラム
     15 
     16             //変数宣言
     17             int[] order = new int[1000];
     18             int inNumber = 0;
     19 
     20             SHA512 shaM = new SHA512Managed(); //インスタンス
     21 
     22             //質問
     23             string whereEncrypted;
     24             string whereKeyFile;
     25             string whereSortedFile;
     26             string howLongDate;
     27 
     28             /*
     29             //自動テスト
     30             whereEncrypted = @"h:\encrypted.txt";
     31             whereKeyFile = @"h:\key.txt";
     32             whereSortedFile = @"h:\sorted.txt";
     33             howLongDate = "390";
     34             */
     35 
     36             Question question = new Question();
     37             whereEncrypted = question.Questions("Where is encrypted file?", false);
     38             while (Directory.Exists(whereEncrypted) == false)
     39             {
     40                 Console.WriteLine("The folder not exists.");
     41                 Console.WriteLine("Plese try another folder.");
     42             }
     43             whereKeyFile = question.Questions("Where is KeyFile?", true);
     44             whereSortedFile = question.Questions("Where will you create sorted file?", false);
     45             howLongDate = question.Questions("How Long the date file?", false);
     46 
     47             int howLongDateInt = int.Parse(howLongDate);
     48 
     49             //ハッシュ関数を用いてデータサイズを知らないかどうかで判断
     50             //元のハッシュ値を持ってくる
     51             byte[] hashOriginal = File.ReadAllBytes(whereEncrypted + @"\" + "Number.cypherN");
     52             byte[] hashNumber;
     53             byte[] LengthByte = BitConverter.GetBytes(howLongDateInt);
     54             hashNumber = shaM.ComputeHash(LengthByte);
     55 
     56             if (BitConverter.ToInt32(hashOriginal) != BitConverter.ToInt32(hashNumber))
     57             {
     58                 Console.WriteLine("You mistaken!");
     59                 Console.WriteLine("The date Number is wrong!");
     60                 Console.WriteLine("This program will stop by 10seconds.");
     61                 Thread.Sleep(10000);
     62                 Environment.Exit(0);
     63             }
     64 
     65             //byteのデータを長さの数だけ用意
     66             int lenghtOfDate;
     67             if (howLongDateInt < 1000)
     68             {
     69                 lenghtOfDate = 1000;
     70             }
     71             else
     72             {
     73                 lenghtOfDate = howLongDateInt;
     74             }
     75             byte[] dates = new byte[lenghtOfDate];
     76             byte[] sorded = new byte[lenghtOfDate];
     77 
     78             int quotient;
     79             int amari;
     80             bool multipleJudgment;
     81             //データサイズに適した数ずつ引っこ抜く
     82             if (howLongDateInt % 1000 == 0)
     83             {
     84                 quotient = howLongDateInt / 1000;
     85                 amari = howLongDateInt % 1000;
     86                 multipleJudgment = true;
     87             }
     88             else
     89             {
     90                 //1000で割り切れない場合は、999で割って、その余りをすべてamariにぶち込む
     91                 quotient = howLongDateInt / 999;
     92                 amari = howLongDateInt - quotient * 999;
     93                 multipleJudgment = false;
     94             }
     95 
     96             //ReadkeyFile
     97             try
     98             {
     99                 ResdFiles resdFiles = new ResdFiles();
    100                 order = resdFiles.ReadKeyFile(whereKeyFile);
    101             }
    102             catch (Exception e)
    103             {
    104                 Console.WriteLine(e + "was happend.");
    105                 Console.WriteLine("try again.");
    106                 Task.Delay(10000);
    107                 Environment.Exit(0);
    108             }
    109 
    110 
    111             //Read Encrypted File
    112             inNumber = 0;
    113             FileStream fs = new FileStream(whereEncrypted + @"\" + "Encrypted.cypher", FileMode.Open);
    114             byte[] encrypted = new byte[fs.Length];
    115             try
    116             {
    117                 fs.Read(encrypted, 0, encrypted.Length);
    118                 fs.Close();
    119             }
    120             catch(Exception e)
    121             {
    122                 Console.WriteLine(e + "was happend.");
    123                 Console.WriteLine("try again.");
    124                 Task.Delay(10000);
    125                 Environment.Exit(0);
    126             }
    127             Console.WriteLine("Encrypted date was readed");
    128 
    129 
    130 
    131             //sort
    132             inNumber = 0;
    133             int arreyNumber = 0;
    134             int indexNumber = 0;
    135             int indexStartNumber = 0;
    136             int indexEndNumber = 0;
    137             int outNumber = 0;
    138             if (multipleJudgment)
    139             {
    140                 //1000で割り切れないとき
    141                 while (arreyNumber < 1000)
    142                 {
    143                     //参照すべき番号を検索
    144                     indexNumber = Array.IndexOf(order, arreyNumber);
    145                     //参照始めの行
    146                     indexStartNumber = indexNumber * quotient;
    147                     //参照終わり+1の行
    148                     indexEndNumber = (indexNumber + 1) * quotient;
    149 
    150                     //参照して"written"に代入
    151                     outNumber = indexStartNumber;
    152                     while (indexNumber < indexEndNumber)
    153                     {
    154                         sorded[inNumber] = encrypted[outNumber];
    155                         indexNumber++;
    156                         outNumber++;
    157                     }
    158                     arreyNumber++;
    159                 }
    160             }
    161             else
    162             {
    163                 //1000で割り切れない数の場合
    164                 //余りの位置を特定
    165                 int whereAmari = Array.IndexOf(order, 999);
    166 
    167                 while (arreyNumber < 1000)
    168                 {
    169                     indexNumber = Array.IndexOf(order, arreyNumber); //inNumber 80
    170                     //indexNumberとamariの関係で場合分け
    171                     if (indexNumber < whereAmari)
    172                     {
    173                         //indexNumberがamariの方が小さいとき。
    174                         indexStartNumber = indexNumber * quotient;
    175                         indexEndNumber = (indexNumber + 1) * quotient;
    176                     }
    177                     else if (indexNumber == whereAmari)
    178                     {
    179                         indexStartNumber = indexNumber * quotient;
    180                         indexEndNumber = indexNumber * quotient + amari;
    181                     }
    182                     else
    183                     {
    184                         indexStartNumber = (indexNumber - 1) * quotient + amari;
    185                         indexEndNumber = indexNumber * quotient + amari;
    186                     }
    187                     outNumber = indexStartNumber;
    188                     while (outNumber < indexEndNumber)
    189                     {
    190                         sorded[inNumber] = encrypted[outNumber];
    191                         outNumber++;
    192                         inNumber++;
    193                     }
    194                     arreyNumber++;
    195                 }
    196             }
    197             Console.WriteLine("The date was sorted.");
    198 
    199 
    200             //データを元の長さに整理
    201             //ファイルサイズが1000未満の場合
    202             if (howLongDateInt < 1000)
    203             {
    204                 Array.Copy(sorded, 0, dates, 0, 1000 - howLongDateInt);
    205             }
    206             else
    207             {
    208                 dates = sorded;
    209             }
    210 
    211             //元のデータのハッシュと突き合わせ
    212             byte[] hashdate;
    213             hashdate = shaM.ComputeHash(dates);
    214             byte[] hashOriginalDate;
    215             hashOriginalDate = File.ReadAllBytes(whereEncrypted + @"\" + "Date.cypherD");
    216             if (BitConverter.ToInt32(hashdate) != BitConverter.ToInt32(hashOriginalDate))
    217             {
    218                 Console.WriteLine("The sorted file was not Original File.");
    219                 Console.WriteLine("Something wrong. ex,key.");
    220             }
    221             else
    222             {
    223                 //あっていたら、書きこみ。
    224                 File.WriteAllBytes(whereSortedFile, dates);
    225             }
    226 
    227         }
    228     }
    229 }