static public byte[] Decrypt(Ep M1, Ep M2) { //平文に対応する点の計算 Ep M = M2 - (ECC._Kp * M1); //楕円曲線上の点から平文への変換 byte[] m = ECC.EpToMsg(M); return(m); }
static public void Encrypt(byte[] m, out Ep M1, out Ep M2) { //平文mをEpに対応付ける Ep M = ECC.MsgToEp(new BigInteger(m)); //Mに掛ける回数kを設定 BigInteger k = IntegerCalclator.RandamBigInteger(Program.KEYLENGTH); //暗号文の生成 M1 = k * ECC.P; Ep temp = k * ECC.B; M2 = temp + M; }
//復号 public void DecryptMode(string arg) { //暗号文の読み込み FileManager.LoadEncryption(string.Concat(arg, "_enc"), out Ep M1, out Ep M2); //秘密鍵の読み込み BigInteger Kp = FileManager.LoadPrivateKey("PrivateKey.bin"); ECC.SetPrivateKey(Kp); //復号の実行 byte[] m = ECC.Decrypt(M1, M2); //復号文の出力 FileManager.OutputDecryptedMsg(m, string.Concat(arg, "_dec")); }
//復号 public void DecryptMode(string arg) { //暗号文の読み込み FileManager.LoadEncryption(string.Concat(arg), out Ep M1, out Ep M2); //秘密鍵の読み込み BigInteger Kp = FileManager.LoadPrivateKey("PrivateKey.bin"); ECC.SetPrivateKey(Kp); //復号の実行 byte[] m = ECC.Decrypt(M1, M2); //復号文の出力 FileManager.OutputDecryptedMsg(m, string.Concat(arg, "_dec")); Console.WriteLine("出力が完了しました."); Console.WriteLine("出力ファイル名_decの生成を確認してください."); }
public void EncryptMode(string pathin) { //公開鍵の読み取り Ep P, B; FileManager.LoadEncryption("PublicKey.bin", out P, out B); ECC.SetPublicKey(B, P); //バイナリファイルの読み取り byte[] m = FileManager.LoadBinaryFile(pathin); //暗号文の生成 Ep M1, M2; ECC.Encrypt(m, out M1, out M2); //点の位置のチェック //暗号文の出力 FileManager.OutputEncryptFile(M1, M2, string.Concat(pathin, "_enc")); }
//Main関数からどの処理に進むのかを分岐 static void Main(string[] args) { //初期設定 Program program = new Program(); Console.WriteLine("楕円曲線のパラメータをセット…"); ECC.SetECCParams(); //楕円曲線のパラメータ初期設定 //デバッグの分岐 if (ISDEBUGMODE) { //モードの入力 Console.WriteLine("モードを入力してください"); Console.WriteLine("1:ファイル読み取りのテスト"); Console.WriteLine("2:BigInteger乱数生成テスト"); Console.WriteLine("3:楕円曲線上の有理点生成テスト"); Console.WriteLine("4.平方剰余の計算テスト"); byte mode = byte.Parse(Console.ReadLine()); //モードによる分岐 switch ((EDebugMode)mode) { //ファイル読み取りテスト case EDebugMode.FileReadTest: program.FileReadTest(args[0]); break; case EDebugMode.RandomBintTest: program.RandomBIntTest(); break; case EDebugMode.MakeEpTest: program.MakeEpTest(); break; case EDebugMode.SqrtModTest: program.SqrtModTest(); break; } } else { //モードによる分岐 switch (MODE) { case EExcuteMode.MakeKey: Console.WriteLine("鍵生成プログラムを起動..."); program.MakeKey(); break; case EExcuteMode.Encrypt: Console.WriteLine("暗号化プログラムを起動..."); program.EncryptMode(args[0]); break; case EExcuteMode.Decrypt: Console.WriteLine("復号プログラムを起動..."); program.DecryptMode(args[0]); break; } } }