Cypher

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

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 }