ECDiffieHellmanCng

来源:互联网 发布:邮政银行软件 编辑:程序博客网 时间:2024/05/21 09:30
 public class ChangeKey    {        static CngKey alicKey;        static CngKey bobKey;        static byte[] alicePubkeyBlob;        static byte[] bobPubkeyBlob;        /// <summary>        /// 交互密钥和安全传输        /// 双方有各自密钥,同时也有对方的公钥        /// 在传输过程中,先采用非对称加密,而后再进行对称加密        /// 对方获取后进行非对称解密,后进行对称解密        /// </summary>       public static void Smain()        {            CreateKeys();            byte[] encrytpedData = AliceSendsData("secret message");            BobReceiversData(encrytpedData);        }        /// <summary>        /// 生成密钥        /// </summary>        private static void CreateKeys()        {            alicKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256);//用指定算法生成密钥            bobKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256);            alicePubkeyBlob = alicKey.Export(CngKeyBlobFormat.EccPublicBlob);//获取公钥            bobPubkeyBlob = bobKey.Export(CngKeyBlobFormat.EccPublicBlob);        }        /// <summary>        /// 数据加密的时候,向量未进行加密处理        /// </summary>        /// <param name="message"></param>        /// <returns></returns>        private static byte[] AliceSendsData(string message)        {            Console.WriteLine("Alice sends message:{0}", message);            byte[] rawData = Encoding.UTF8.GetBytes(message);            byte[] encryptedData = null;            using (var aliceAlgorithm = new ECDiffieHellmanCng(alicKey))            using (CngKey bobPubKey = CngKey.Import(bobPubkeyBlob, CngKeyBlobFormat.EccPublicBlob))            {                byte[] symmkey = aliceAlgorithm.DeriveKeyMaterial(bobPubKey);                Console.WriteLine("Alice creates this sysmmetric key with " +                    "Bobs public key information:{0}", Convert.ToBase64String(symmkey));                var aes = new AesCryptoServiceProvider();                aes.Key = symmkey;                aes.GenerateIV();                using (ICryptoTransform encryptor = aes.CreateEncryptor())                using (MemoryStream ms = new MemoryStream())                {                    var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write);                    ms.Write(aes.IV, 0, aes.IV.Length);                    cs.Write(rawData, 0, rawData.Length);                    cs.Close();                    encryptedData = ms.ToArray();                }                aes.Clear();            }            Console.WriteLine("Alice :Message is encrypted:{0}", Convert.ToBase64String(encryptedData));            Console.WriteLine();            return encryptedData;        }        private static void BobReceiversData(byte[] encrytpedData)        {            Console.WriteLine("Bob receives encrypted data");            byte[] rawData = null;            var aes = new AesCryptoServiceProvider();                        int nBytes=aes.BlockSize>>3;//主要是向量未加密直接写入流中,此处直接读取            byte[] iv = new byte[nBytes];            for (int i = 0; i < iv.Length; i++)            {                iv[i] = encrytpedData[i];            }            using(var bobAlgorithm=new ECDiffieHellmanCng(bobKey))            using (CngKey alicePubKey = CngKey.Import(alicePubkeyBlob,CngKeyBlobFormat.EccPublicBlob))            {                byte[] symmKey = bobAlgorithm.DeriveKeyMaterial(alicePubKey);                Console.WriteLine("Bob Creates this symmetric key with " +                    "Alices public key information:{0}", Convert.ToBase64String(symmKey));                aes.Key = symmKey;                aes.IV = iv;                using (ICryptoTransform decryptor = aes.CreateDecryptor())                using (MemoryStream ms = new MemoryStream())                {                    var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write);                    cs.Write(encrytpedData, nBytes, encrytpedData.Length-nBytes);                    cs.Close();                    rawData = ms.ToArray();                    Console.WriteLine("Bob decrypts message to :{0}", Encoding.UTF8.GetString(rawData));                }                aes.Clear();            }        }    }