Encrypt.cs (6848B)
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 Encrypt 11 { 12 public void encrypt() 13 { 14 //暗号化 15 16 //変数宣言 17 int[] order = new int[1000]; 18 string[] date = new string[1000]; 19 int quotient; //商 20 int amari = 0; //あまり 21 int inNumber = 0; //入力データ番号 22 int arrayNumber = 0; //配列番号 23 byte[] eByte = new byte[1]; 24 25 26 //質問 27 string whereDateFile; 28 string whereKeyFile; 29 string whereEncryptedFilefolder; 30 string whereEncryptedfileName; 31 string whereEncryptedFile; 32 33 /* 34 //自動テスト 35 whereDateFile = @"h:\date.txt"; 36 whereEncryptedFile = @"h:\encrypted.txt"; 37 whereKeyFile = @"h:\key.txt"; 38 */ 39 40 Question question = new Question(); 41 whereEncryptedFilefolder = question.Questions("Where will you create encrypted file? (folder Name)", false); 42 while (Directory.Exists(whereEncryptedFilefolder) == false) 43 { 44 Console.WriteLine("You selected not exis folder."); 45 Console.WriteLine("Please try another folder."); 46 whereEncryptedFilefolder = question.Questions("Where will you create encrypted file? (folder Name)", false); 47 } 48 whereEncryptedfileName = question.Questions("What will you create encrypted file name?", false); 49 whereEncryptedFile = whereEncryptedFilefolder + whereEncryptedfileName; 50 whereDateFile = question.Questions("Where is the file you want to encrypt?", true); 51 whereKeyFile = question.Questions("Where is keyFile?", true); 52 53 54 //順序ファイルの読み込み 55 try 56 { 57 StreamReader sr = new StreamReader(whereKeyFile); 58 } 59 catch (Exception e) 60 { 61 Console.WriteLine(e + "was happend."); 62 Console.WriteLine("Please try again."); 63 Task.Delay(10000); 64 Environment.Exit(0); 65 } 66 67 68 69 //配列に順序を書き込み 70 ResdFiles resdFiles = new ResdFiles(); 71 order = resdFiles.ReadKeyFile(whereKeyFile); 72 73 74 //ファイルの内容をすべて読み込む 75 FileStream fs = new FileStream(whereDateFile, FileMode.Open); 76 byte[] bs = new byte[fs.Length]; 77 fs.Read(bs, 0, bs.Length); 78 fs.Close(); 79 80 byte[] encrypted = new byte[bs.Length]; 81 82 int indexNumuber; 83 int indexEnd; 84 int indexStart; 85 int outNumber = 0; 86 inNumber = 0; 87 if (bs.Length % 1000 == 0) 88 { 89 quotient = bs.Length / 1000; 90 //百で割り切れる場合 91 while (arrayNumber < 1000) 92 { 93 indexNumuber = order[arrayNumber]; 94 indexStart = quotient * indexNumuber; 95 indexEnd = quotient * (indexNumuber + 1); 96 outNumber = indexStart; 97 while (outNumber < indexEnd) 98 { 99 encrypted[outNumber] = bs[inNumber]; 100 inNumber++; 101 outNumber++; 102 } 103 arrayNumber++; 104 } 105 } 106 else 107 { 108 //割り切れない場合 109 quotient = bs.Length / 999; 110 amari = bs.Length - quotient * 999; 111 int where999 = Array.IndexOf(order, 999); 112 113 while (arrayNumber < 1000) 114 { 115 indexNumuber = Array.IndexOf(order, arrayNumber); 116 if (indexNumuber < where999) 117 { 118 indexStart = quotient * indexNumuber; 119 indexEnd = quotient * (indexNumuber + 1); 120 } 121 else if (indexNumuber == where999) 122 { 123 indexStart = indexNumuber * quotient; 124 indexEnd = indexNumuber * quotient + amari; 125 } 126 else 127 { 128 indexStart = (indexNumuber - 1) * quotient + amari; 129 indexEnd = indexNumuber * quotient + amari; 130 } 131 132 133 outNumber = indexStart; 134 while (outNumber < indexEnd) 135 { 136 encrypted[outNumber] = bs[inNumber]; 137 outNumber++; 138 inNumber++; 139 } 140 141 arrayNumber++; 142 } 143 144 } 145 //ハッシュ関数で元のファイルおよび、ファイル固有値をハッシュ化 146 SHA512 shaM = new SHA512Managed(); //インスタンス 147 //元のファイルにハッシュをかける 148 //元データ:bs ハッシュ後:hashdate 149 byte[] hashdate; 150 hashdate = shaM.ComputeHash(bs); 151 //元データ:encrypted.Length ハッシュ後:hashlength 152 byte[] Encryptlength; 153 Encryptlength = BitConverter.GetBytes(encrypted.Length); 154 byte[] hashLength; 155 hashLength = shaM.ComputeHash(Encryptlength); 156 157 //フォルダを作成 158 Directory.CreateDirectory(whereEncryptedFile); 159 160 //ハッシュ値を別ファイルに保存する 161 try 162 { 163 File.WriteAllBytes(whereEncryptedFile + @"\" + "Date.cypherD", hashdate); 164 File.WriteAllBytes(whereEncryptedFile + @"\" + "Number.cypherN", hashLength); 165 } 166 catch(Exception e) 167 { 168 Console.WriteLine(e + "was happend."); 169 Console.WriteLine("try again."); 170 Task.Delay(10000); 171 Environment.Exit(0); 172 } 173 174 175 //書きこみ 176 177 try 178 { 179 File.WriteAllBytes(whereEncryptedFile + @"\" + "Encrypted.cypher", encrypted); 180 }catch(Exception e) 181 { 182 Console.WriteLine(e + "was happend."); 183 Console.WriteLine("try again."); 184 Task.Delay(10000); 185 Environment.Exit(0); 186 } 187 Console.WriteLine("Encrypt was ended."); 188 Console.WriteLine("The date key is " + encrypted.Length + "."); 189 Console.WriteLine("You have to remember it!"); 190 } 191 192 } 193 }