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 }