C#学习日记 对称密钥

    xiaoxiao2021-04-14  29

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

    转载请注明原文地址: https://ju.6miu.com/read-669727.html

    最新回复(0)