C#学习日记 对称密钥

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();
			}
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值