static public byte[] Decrypt(Ep M1, Ep M2) { //平文に対応する点の計算 Ep M = M2 - (ECC._Kp * M1); //楕円曲線上の点から平文への変換 byte[] m = ECC.EpToMsg(M); return(m); }
//Ep対応テスト //失敗率は1/(2^100)であることに注意 public void MakeEpTest() { BigInteger p = IntegerCalclator.RandamBigInteger(KEYLENGTH); Ep P = new Ep(p); Console.Write("Ep.x: "); Console.WriteLine(P.x.ToString()); Console.Write("Ep.y: "); Console.WriteLine(P.y.ToString()); }
//暗号文の読み取り public static void LoadEncryption(string str, out Ep M1, out Ep M2) { byte[] buf = BasicLoad(str); string encryption = Encoding.ASCII.GetString(buf); string[] allM = encryption.Split('_'); M1 = new Ep(BigInteger.Parse(allM[0]), BigInteger.Parse(allM[1])); M2 = new Ep(BigInteger.Parse(allM[2]), BigInteger.Parse(allM[3])); }
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 static void OutputPublicKey(Ep B, Ep P, string path) { //BigIntegerをstring化 string str1x = B.x.ToString(); string str1y = B.y.ToString(); string str2x = P.x.ToString(); string str2y = P.y.ToString(); string str = str1x + "_" + str1y + "_" + str2x + "_" + str2y; //_を目印に区切れるようにする //stringをByte[]に変換 byte[] buf = Encoding.ASCII.GetBytes(str); //データの出力 File.WriteAllBytes(@path, buf); }
public static void OutputEncryptFile(Ep M1, Ep M2, string path) { //BigIntegerをstring化 string str1x = M1.x.ToString(); string str1y = M1.y.ToString(); string str2x = M2.x.ToString(); string str2y = M2.y.ToString(); string str = str1x + "_" + str1y + "_" + str2x + "_" + str2y; //_を目印に区切れるようにする //stringをByte[]に変換 byte[] buf = Encoding.ASCII.GetBytes(str); //データの出力 File.WriteAllBytes(@path, buf); }
//a回の群演算 public static Ep operator *(BigInteger a, Ep P) { Ep Q = P; String bin = IntegerCalclator.BigIntegerToBin(a); for (int item = bin.Length - 1; item >= 0; item--) { //桁数を上げる度に Q = Q + Q; if (bin[item] == 1) { Q = Q + P; } } Q += P; return(Q); }
//公開鍵と秘密鍵をランダムに生成する public void MakeKey() { //ランダムに公開鍵Pを生成 BigInteger p = IntegerCalclator. RandamBigInteger(KEYLENGTH); Ep P = new Ep(p); //ランダムに秘密鍵Kpを生成 BigInteger Kp = IntegerCalclator. RandamBigInteger(KEYLENGTH); //PとKpから公開鍵Bを生成 //(通常の乗算ではなく //Kp回の楕円曲線上の群演算をしている事に注意) Ep B = Kp * P; //出力 FileManager.OutputPublicKey(B, P, "PublicKey.bin"); FileManager.OutputPrivateKey(Kp, "PrivateKey.bin"); }
static public byte[] EpToMsg(Ep M) { BigInteger m = M.x / 100; return(m.ToByteArray()); }
static public void SetPublicKey(Ep B, Ep P) { ECC.P = P; ECC.B = B; }