Esempio n. 1
0
        /// <summary>
        /// 以ECC演算法加密資料
        /// </summary>
        /// <param name="originalData">原始資料</param>
        /// <param name="anotherPubKey">解密者使用的公鑰資料</param>
        /// <param name="derivation">The derivation parameter for the KDF function.</param>
        /// <param name="encoding">The encoding parameter for the KDF function.</param>
        public byte[] EncryptData(byte[] originalData, byte[] anotherPubKey, byte[] derivation, byte[] encoding)
        {
            if (_ecLocalKeyPair == null)
            {
                Debug.WriteLine(String.Format("[EncryptData] Local key pair not create."));
                return(null);
            }

            byte[] ret = null;

            //ECPublicKeyParameters = public key header(24byte) + another public key(key field size - 24byte,)
            byte[] anoPubKeyInfoBytes            = ArrayHelpers.ConcatArrays(this.PubKeyHeaderBytes, anotherPubKey);
            ECPublicKeyParameters anoPubKeyParam = PublicKeyFactory.CreateKey(anoPubKeyInfoBytes) as ECPublicKeyParameters;

            IesEngine ies = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha256Digest()),
                new HMac(new Sha256Digest()));
            IesParameters iesParam = new IesParameters(derivation, encoding, 256);

            try
            {
                ies.Init(true, _ecLocalKeyPair.Private, anoPubKeyParam, iesParam);
                ret = ies.ProcessBlock(originalData, 0, originalData.Length);
            }
            catch (Exception e)
            {
                Debug.WriteLine(String.Format("[EncryptData] Init IES Enging fail:{0}", e.Message));
                return(null);
            }

            return(ret);
        }
Esempio n. 2
0
        /// <summary>
        /// 解密函数
        /// </summary>
        /// <param name="privKey">椭圆曲线私钥</param>
        /// <param name="pubRand">加密所用随机密钥对的公钥</param>
        /// <param name="ciphertext">密文</param>
        /// <returns>明文</returns>
        public byte[] Decrypt(ECPrivateKeyParameters privKey, ECPublicKeyParameters pubRand, byte[] ciphertext)
        {
            IesEngine engine = IesEngineFactory();

            engine.Init(false, privKey, pubRand, iesParam);
            return(engine.ProcessBlock(ciphertext, 0, ciphertext.Length));
        }
Esempio n. 3
0
        /// <summary>
        /// 加密函数
        /// </summary>
        /// <param name="pubKey">椭圆曲线公钥</param>
        /// <param name="privRand">一个随机密钥对的私钥</param>
        /// <param name="message">明文</param>
        /// <returns>密文</returns>
        public byte[] Encrypt(ECPublicKeyParameters pubKey, ECPrivateKeyParameters privRand, byte[] message)
        {
            IesEngine engine = IesEngineFactory();

            engine.Init(true, privRand, pubKey, iesParam);
            return(engine.ProcessBlock(message, 0, message.Length));
        }
Esempio n. 4
0
        //----------------------------------------------------------------------------------

        public virtual void Init(
            bool forEncryption,
            ICipherParameters privParameters,
            ICipherParameters pubParameters,
            ICipherParameters iesParameters)
        {
            engine.Init(this.forEncryption = forEncryption, privParameters, pubParameters, iesParameters);
        }
Esempio n. 5
0
        protected static IesEngine CreateCipherEngine(bool encrypt, ICipherParameters privParameters, ICipherParameters pubParameters)
        {
            var engine = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha256Digest()),
                new HMac(new Sha256Digest()),
                new PaddedBufferedBlockCipher(new CbcBlockCipher(new AesFastEngine())));

            var parameterSpec = new IesWithCipherParameters(derivation, encoding, 256, 256);

            engine.Init(encrypt, privParameters, pubParameters, parameterSpec);
            return(engine);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="forEncryption"></param>
        /// <param name="publicKeyBytes"></param>
        /// <returns></returns>
        protected IesEngine CreateIesEngine(bool forEncryption, byte[] publicKeyBytes)
        {
            // TODO ensure parameters are safe enough
            IesEngine iesEngine = new IesEngine(new ECDHBasicAgreement(), new Kdf2BytesGenerator(new Sha1Digest()), new HMac(new Sha1Digest()));

            byte[]        d          = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
            byte[]        e          = new byte[] { 8, 7, 6, 5, 4, 3, 2, 1 };
            IesParameters parameters = new IesParameters(d, e, 64);

            ECPublicKeyParameters publicKey = new ECPublicKeyParameters(X9.Curve.DecodePoint(publicKeyBytes), EcSpec);

            iesEngine.Init(forEncryption, KeyPair.Private, (AsymmetricKeyParameter)publicKey, parameters);
            return(iesEngine);
        }
Esempio n. 7
0
        public static string DecryptElliptical(this string data, string publicKey, string myPrivateKey)
        {
            var d = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
            var e = new byte[] { 8, 7, 6, 5, 4, 3, 2, 1 };
            var p = new IesWithCipherParameters(d, e, 64, 128);

            IesEngine e2 = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha1Digest()),
                new HMac(new Sha256Digest()),                                        // #1
                new PaddedBufferedBlockCipher(new CbcBlockCipher(new AesEngine()))); // #6

            e2.Init(false, ConvertPrivateToParameters(myPrivateKey), ConvertPublicToParameters(publicKey), p);
            var bytes = Convert.FromBase64String(data);

            return(Encoding.UTF8.GetString(e2.ProcessBlock(bytes, 0, bytes.Length)));
        }
Esempio n. 8
0
        public static string EncryptElliptical(this string data, string publicKey, string myPrivateKey)
        {
            IesEngine e1 = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha1Digest()),
                new HMac(new Sha256Digest()),                                        // #1
                new PaddedBufferedBlockCipher(new CbcBlockCipher(new AesEngine()))); // #6
            var d = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
            var e = new byte[] { 8, 7, 6, 5, 4, 3, 2, 1 };
            var p = new IesWithCipherParameters(d, e, 64, 128);

            //IesWithCipherParameters parameterSpec = new IesWithCipherParameters(null, null, 256, 256);
            e1.Init(true, ConvertPrivateToParameters(myPrivateKey), ConvertPublicToParameters(publicKey), p);
            byte[] bytes = Encoding.UTF8.GetBytes(data);
            return(Convert.ToBase64String(e1.ProcessBlock(bytes, 0, bytes.Length)));
            ////BufferedIesCipher c1 = new BufferedIesCipher(e1);
            ////c1.engineSetMode("DHAES");
            ////c1.Init(true, keyParameters);
            ////var ciphertext = c1.DoFinal(Encoding.UTF8.GetBytes(@"test"));

            //IesEngine e2 = new IesEngine(
            //   new ECDHBasicAgreement(),
            //   new Kdf2BytesGenerator(new Sha1Digest()),
            //   new HMac(new Sha256Digest()), // #1
            //   new PaddedBufferedBlockCipher(new CbcBlockCipher(new AesEngine()))); // #6
            //e2.Init(false, privateParameters, publicParameters, p);
            //var result = e2.ProcessBlock(ct, 0, ct.Length);
            //var text = Encoding.UTF8.GetString(result);
            ////IesParameterSpec parameterSpec = new IESParameterSpec(null, null, macKeySize, cipherKeySize);

            ////byte[] pubaddr = new byte[65];
            ////byte[] Y = dd.Y.ToBigInteger().ToByteArray();
            ////Array.Copy(Y, 0, pubaddr, 64 - Y.Length + 1, Y.Length);
            ////byte[] X = dd.X.ToBigInteger().ToByteArray();
            ////Array.Copy(X, 0, pubaddr, 32 - X.Length + 1, X.Length);
            ////pubaddr[0] = 4;

            //return null;
        }
Esempio n. 9
0
        private void StaticTest()
        {
            FpCurve curve = new FpCurve(
                new BigInteger("6277101735386680763835789423207666416083908700390324961279"),           // q
                new BigInteger("fffffffffffffffffffffffffffffffefffffffffffffffc", 16),                 // a
                new BigInteger("64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1", 16));                // b

            ECDomainParameters parameters = new ECDomainParameters(
                curve,
                curve.DecodePoint(Hex.Decode("03188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012")),           // G
                new BigInteger("6277101735386680763835789423176059013767194773182842284081"));                 // n

            ECPrivateKeyParameters priKey = new ECPrivateKeyParameters(
                "ECDH",
                new BigInteger("651056770906015076056810763456358567190100156695615665659"),                 // d
                parameters);

            ECPublicKeyParameters pubKey = new ECPublicKeyParameters(
                "ECDH",
                curve.DecodePoint(Hex.Decode("0262b12d60690cdcf330babab6e69763b471f994dd702d16a5")),                 // Q
                parameters);

            AsymmetricCipherKeyPair p1 = new AsymmetricCipherKeyPair(pubKey, priKey);
            AsymmetricCipherKeyPair p2 = new AsymmetricCipherKeyPair(pubKey, priKey);

            //
            // stream test
            //
            IesEngine i1 = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha1Digest()),
                new HMac(new Sha1Digest()));
            IesEngine i2 = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha1Digest()),
                new HMac(new Sha1Digest()));

            byte[]        d = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
            byte[]        e = new byte[] { 8, 7, 6, 5, 4, 3, 2, 1 };
            IesParameters p = new IesParameters(d, e, 64);

            i1.Init(true, p1.Private, p2.Public, p);
            i2.Init(false, p2.Private, p1.Public, p);

            byte[] message = Hex.Decode("1234567890abcdef");

            byte[] out1 = i1.ProcessBlock(message, 0, message.Length);

            if (!AreEqual(out1, Hex.Decode("2442ae1fbf90dd9c06b0dcc3b27e69bd11c9aee4ad4cfc9e50eceb44")))
            {
                Fail("stream cipher test failed on enc");
            }

            byte[] out2 = i2.ProcessBlock(out1, 0, out1.Length);

            if (!AreEqual(out2, message))
            {
                Fail("stream cipher test failed");
            }

            //
            // twofish with CBC
            //
            BufferedBlockCipher c1 = new PaddedBufferedBlockCipher(
                new CbcBlockCipher(new TwofishEngine()));
            BufferedBlockCipher c2 = new PaddedBufferedBlockCipher(
                new CbcBlockCipher(new TwofishEngine()));

            i1 = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha1Digest()),
                new HMac(new Sha1Digest()),
                c1);
            i2 = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha1Digest()),
                new HMac(new Sha1Digest()),
                c2);
            d = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
            e = new byte[] { 8, 7, 6, 5, 4, 3, 2, 1 };
            p = new IesWithCipherParameters(d, e, 64, 128);

            i1.Init(true, p1.Private, p2.Public, p);
            i2.Init(false, p2.Private, p1.Public, p);

            message = Hex.Decode("1234567890abcdef");

            out1 = i1.ProcessBlock(message, 0, message.Length);

            if (!AreEqual(out1, Hex.Decode("2ea288651e21576215f2424bbb3f68816e282e3931b44bd1c429ebdb5f1b290cf1b13309")))
            {
                Fail("twofish cipher test failed on enc");
            }

            out2 = i2.ProcessBlock(out1, 0, out1.Length);

            if (!AreEqual(out2, message))
            {
                Fail("twofish cipher test failed");
            }
        }
Esempio n. 10
0
        private void DoTest(
            AsymmetricCipherKeyPair p1,
            AsymmetricCipherKeyPair p2)
        {
            //
            // stream test
            //
            IesEngine i1 = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha1Digest()),
                new HMac(new Sha1Digest()));
            IesEngine i2 = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha1Digest()),
                new HMac(new Sha1Digest()));

            byte[]        d = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
            byte[]        e = new byte[] { 8, 7, 6, 5, 4, 3, 2, 1 };
            IesParameters p = new IesParameters(d, e, 64);

            i1.Init(true, p1.Private, p2.Public, p);
            i2.Init(false, p2.Private, p1.Public, p);

            byte[] message = Hex.Decode("1234567890abcdef");

            byte[] out1 = i1.ProcessBlock(message, 0, message.Length);

            byte[] out2 = i2.ProcessBlock(out1, 0, out1.Length);

            if (!AreEqual(out2, message))
            {
                Fail("stream cipher test failed");
            }

            //
            // twofish with CBC
            //
            BufferedBlockCipher c1 = new PaddedBufferedBlockCipher(
                new CbcBlockCipher(new TwofishEngine()));
            BufferedBlockCipher c2 = new PaddedBufferedBlockCipher(
                new CbcBlockCipher(new TwofishEngine()));

            i1 = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha1Digest()),
                new HMac(new Sha1Digest()),
                c1);
            i2 = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha1Digest()),
                new HMac(new Sha1Digest()),
                c2);
            d = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
            e = new byte[] { 8, 7, 6, 5, 4, 3, 2, 1 };
            p = new IesWithCipherParameters(d, e, 64, 128);

            i1.Init(true, p1.Private, p2.Public, p);
            i2.Init(false, p2.Private, p1.Public, p);

            message = Hex.Decode("1234567890abcdef");

            out1 = i1.ProcessBlock(message, 0, message.Length);

            out2 = i2.ProcessBlock(out1, 0, out1.Length);

            if (!AreEqual(out2, message))
            {
                Fail("twofish cipher test failed");
            }
        }
Esempio n. 11
0
        private void StaticTest()
        {
            BigInteger n = new BigInteger("6277101735386680763835789423176059013767194773182842284081");

            FpCurve curve = new FpCurve(
                new BigInteger("6277101735386680763835789423207666416083908700390324961279"), // q
                new BigInteger("fffffffffffffffffffffffffffffffefffffffffffffffc", 16),       // a
                new BigInteger("64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1", 16),       // b
                n, BigInteger.One);

            ECDomainParameters parameters = new ECDomainParameters(
                curve,
                curve.DecodePoint(Hex.Decode("03188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012")), // G
                n, BigInteger.One);

            ECPrivateKeyParameters priKey = new ECPrivateKeyParameters(
                "ECDH",
                new BigInteger("651056770906015076056810763456358567190100156695615665659"), // d
                parameters);

            ECPublicKeyParameters pubKey = new ECPublicKeyParameters(
                "ECDH",
                curve.DecodePoint(Hex.Decode("0262b12d60690cdcf330babab6e69763b471f994dd702d16a5")), // Q
                parameters);

            AsymmetricCipherKeyPair p1 = new AsymmetricCipherKeyPair(pubKey, priKey);
            AsymmetricCipherKeyPair p2 = new AsymmetricCipherKeyPair(pubKey, priKey);

            //
            // stream test
            //
            IesEngine i1 = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha1Digest()),
                new HMac(new Sha1Digest()));
            IesEngine i2 = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha1Digest()),
                new HMac(new Sha1Digest()));

            byte[]        d = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
            byte[]        e = new byte[] { 8, 7, 6, 5, 4, 3, 2, 1 };
            IesParameters p = new IesParameters(d, e, 64);

            i1.Init(true, p1.Private, p2.Public, p);
            i2.Init(false, p2.Private, p1.Public, p);

            byte[] message = Hex.Decode("1234567890abcdef");

            byte[] out1 = i1.ProcessBlock(message, 0, message.Length);

            if (!AreEqual(out1, Hex.Decode("468d89877e8238802403ec4cb6b329faeccfa6f3a730f2cdb3c0a8e8")))
            {
                Fail("stream cipher test failed on enc");
            }

            byte[] out2 = i2.ProcessBlock(out1, 0, out1.Length);

            if (!AreEqual(out2, message))
            {
                Fail("stream cipher test failed");
            }

            //
            // twofish with CBC
            //
            BufferedBlockCipher c1 = new PaddedBufferedBlockCipher(
                new CbcBlockCipher(new TwofishEngine()));
            BufferedBlockCipher c2 = new PaddedBufferedBlockCipher(
                new CbcBlockCipher(new TwofishEngine()));

            i1 = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha1Digest()),
                new HMac(new Sha1Digest()),
                c1);
            i2 = new IesEngine(
                new ECDHBasicAgreement(),
                new Kdf2BytesGenerator(new Sha1Digest()),
                new HMac(new Sha1Digest()),
                c2);
            d = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
            e = new byte[] { 8, 7, 6, 5, 4, 3, 2, 1 };
            p = new IesWithCipherParameters(d, e, 64, 128);

            i1.Init(true, p1.Private, p2.Public, p);
            i2.Init(false, p2.Private, p1.Public, p);

            message = Hex.Decode("1234567890abcdef");

            out1 = i1.ProcessBlock(message, 0, message.Length);

            if (!AreEqual(out1, Hex.Decode("b8a06ea5c2b9df28b58a0a90a734cde8c9c02903e5c220021fe4417410d1e53a32a71696")))
            {
                Fail("twofish cipher test failed on enc");
            }

            out2 = i2.ProcessBlock(out1, 0, out1.Length);

            if (!AreEqual(out2, message))
            {
                Fail("twofish cipher test failed");
            }
        }
 public override void Init(bool forEncryption, ICipherParameters parameters)
 {
     _engine.Init(forEncryption, parameters);
 }