C#学习日记 对称密钥

来源:互联网 发布:招标代理服务费的算法 编辑:程序博客网 时间:2024/05/17 08:27

July Joyn 分别有自己的密钥对 用july的密钥对和joyn的公钥合成一个对称密钥 对数据进行加密 再用joyn的密钥对和july的公钥 对数据解密。大概意思就是这样的,但是具体实现我不是很理解,以后慢慢弄懂。

using System;using System.IO;using System.Text;using System.Security.Cryptography;using System.Threading.Tasks;namespace Sample{public class MainEntryPoint{static int Main(string[] args){Run();Console.ReadKey();return 0;}static CngKey julyKey;static CngKey joynKey;static byte[] julyPubKeyBlob;static byte[] joynPubKeyBlob;private async static void Run(){try{CreateKeys();byte[] encrytpedData = await JulySendsData("secret message");JoynReceivesData(encrytpedData);}catch(Exception ex){Console.WriteLine(ex.Message);}}private static void CreateKeys(){julyKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256);joynKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256);julyPubKeyBlob = julyKey.Export(CngKeyBlobFormat.EccPublicBlob);joynPubKeyBlob = joynKey.Export(CngKeyBlobFormat.EccPublicBlob);}private async static Task<byte[]> JulySendsData(string message){Console.WriteLine("July sends message : {0}", message);byte[] rawData = Encoding.UTF8.GetBytes(message);byte[] encryptedData = null;using(var julyAlgorithm = new ECDiffieHellmanCng(julyKey))using(CngKey joynPubKey = CngKey.Import(joynPubKeyBlob, CngKeyBlobFormat.EccPublicBlob)){byte[] symmKey = julyAlgorithm.DeriveKeyMaterial(joynPubKey);Console.WriteLine("July creates this symmetric key with "+ "Joyn public key information : {0}", Convert.ToBase64String(symmKey));using(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);await ms.WriteAsync(aes.IV, 0, aes.IV.Length);cs.Write(rawData, 0, rawData.Length);cs.Close();encryptedData = ms.ToArray();}aes.Clear();}}Console.WriteLine("July : message is encrypted : {0}", Convert.ToBase64String(encryptedData));Console.WriteLine();return encryptedData;}private static void JoynReceivesData(byte[] encryptedData){Console.WriteLine("Joyn 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] = encryptedData[i];using(var joynAlgorithm = new ECDiffieHellmanCng(joynKey))using(CngKey julyPubKey = CngKey.Import(julyPubKeyBlob, CngKeyBlobFormat.EccPublicBlob)){byte[] symmKey = joynAlgorithm.DeriveKeyMaterial(julyPubKey);Console.WriteLine("Joyn creates this symmetric key with "+"July public key information {0}", 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(encryptedData, nBytes, encryptedData.Length - nBytes);cs.Close();rawData = ms.ToArray();Console.WriteLine("Joyn decrypts message to : {0}", Encoding.UTF8.GetString(rawData));}aes.Clear();}}}}


0 0