예제 #1
0
        static public byte[] Decrypt(Ep M1, Ep M2)
        {
            //平文に対応する点の計算
            Ep M = M2 - (ECC._Kp * M1);

            //楕円曲線上の点から平文への変換
            byte[] m = ECC.EpToMsg(M);
            return(m);
        }
예제 #2
0
        //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());
        }
예제 #3
0
        //暗号文の読み取り
        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]));
        }
예제 #4
0
        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;
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        //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);
        }
예제 #8
0
        //公開鍵と秘密鍵をランダムに生成する
        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");
        }
예제 #9
0
        static public byte[] EpToMsg(Ep M)
        {
            BigInteger m = M.x / 100;

            return(m.ToByteArray());
        }
예제 #10
0
 static public void SetPublicKey(Ep B, Ep P)
 {
     ECC.P = P;
     ECC.B = B;
 }