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();
}
}
}
}
版权声明:本文为july_yeye原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。