国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

簽名

2019-11-06 06:03:34
字體:
來源:轉載
供稿:網友

1.簽名

Young創建一個簽名,它用Alice的私鑰加密,可以使用Young的公鑰訪問。因此保證該簽名來自于Young。 首先,看看Main方法中的主要步驟:創建一個Young的秘鑰,給字符串‘Young’簽名。最后使用公鑰驗證該簽名是否來之于Alice。要簽名的信息使用Encoding類轉換成一個字節數組。要把加密的起那么寫入控制臺,包含該簽名的字節數組使用Convert.ToBase64.String

internal static CngKey aliceKeySignature; internal static byte[] alicePubkeyBlob; /// <summary> /// 應用程序的主入口點。 /// </summary> static void Main() { CreateKeys(); byte[] aliceData = Encoding.UTF8.GetBytes("Young"); byte[] aliceSignature = CreateSignature(aliceData,aliceKeySignature); Console.WriteLine("Young create signature:{0}", Convert.ToBase64String(aliceSignature)); if (VerifySignature(aliceData,aliceSignature,alicePubkeyBlob)) { Console.WriteLine("Young signature verified successfully"); } }

注:千萬不要使用Encoding類把加密的數據轉化為字符串。Encoding類驗證和轉化Unicode不允許使用無效值,因此把字符串轉回字節數組會得到另一個結果。

CreateKeys方法為Young創建新的秘鑰對。因為這個密鑰對存儲在一個靜態字段中,所以可以從其他方法中訪問它。CnkKey的Create方法把算法作為一個參數,為算法定義密鑰對。通過Export方法,導出密鑰對中的公鑰。這個公鑰可以提供給Bob,來驗證簽名。Young保留其私鑰。除了使用CngKey類創建對之外,還可以打開存儲在密鑰存儲器中的已有密鑰。通過Young在其私有存儲器中有一個證書,其中包含了一個密鑰對,該存儲器可以使用CngKey.Open方法訪問

static void CreateKeys() { aliceKeySignature = CngKey.Create(CngAlgorithm.ECDsaP256); alicePubkeyBlob = aliceKeySignature.Export(CngKeyBlobFormat.GenericPublicBlob); }

有了密鑰對,Young就可以使用ECDsaCng類創建簽名。這個類的構造函數從Young那里接受包含公鑰和私鑰CngKey類。在使用私鑰,通過SingData給數據簽名

public static byte[] CreateSignature(byte[] data,CngKey key) { byte[] signature; using (var signingAlg=new ECDsaCng(key)) { signature = signingAlg.SignData(data); signingAlg.Clear(); } return signature; }

要驗證簽名是否真的來之Young,Bob使用Young的公鑰檢查簽名。包含公鑰Bob的字節數組可以使用靜態方法Import導入CngKey對象。然后使用ECDsaCng類,調用VerifyData方法來檢查簽名。

static bool VerifySignature(byte[] data,byte[] signature,byte[] pubKey) { bool retValue = false; using (CngKey key = CngKey.Import(pubKey, CngKeyBlobFormat.GenericPublicBlob)) using(var signingAlg=new ECDsaCng(key)) { retValue = signingAlg.VerifyData(data,signature); signingAlg.Clear(); } return retValue; }

這里寫圖片描述

2.交換密鑰和安全傳輸

下面是一個比較復雜的例子,它使用Diffie Hellman算法交換一個對稱秘鑰,以進行安全的傳輸。Main方法包含了其主要功能。Alice創建了一條加密的消息,并把它發送給Bob。在此之前,要先為Alice和Bob創建秘鑰對。Bob只能訪問Alice 的公鑰,Alice只能訪問Bob 的公鑰。

static void Main() { Run(); Console.ReadKey(); } PRivate async static void Run() { try { CreateKeys(); byte[] encrytpedData = await AliceSendsData("SECRET MESSAGES"); byte[] encrytpedData11= await BobReceivesData(encrytpedData); } catch (Exception e) { Console.WriteLine(e.Message); } }

在CreateKeys方法的實現代碼匯總,使用ECDiffieHellman256算法創建密鑰。

static void CreateKeys() { aliceKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256); alicePubkeyBlob = aliceKey.Export(CngKeyBlobFormat.EccPublicBlob); bobKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256); bobPubkeyBlob = bobKey.Export(CngKeyBlobFormat.EccPublicBlob); }

這里寫圖片描述

private async static Task<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(aliceKey)) using (CngKey bobPubKey=CngKey.Import(bobPubkeyBlob,CngKeyBlobFormat.EccPublicBlob)) { byte[] symmkey = aliceAlgorithm.DeriveKeyMaterial(bobPubKey); Console.WriteLine("Alice creates this sysmmmtric key with" + "Bob 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("Alice:message is encryted:{0}",Convert.ToBase64String(encryptedData)); Console.WriteLine(); return encryptedData; }

這里寫圖片描述

private async static Task<byte[]> BobReceivesData(byte[] encrytedData) { Console.WriteLine("Bob receives encrypted data"); byte[] rawData =null; var aes = new AesCryptoServiceProvider(); int nBytes=aes.BlockSize; byte[] iv=new byte[nBytes]; for (int i = 0; i < iv.Length; i++) { iv[i] = encrytedData[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 sysmmmtric key with" + "Alice public key information:{0}", Convert.ToBase64String(symmkey)); aes.Key = symmkey; aes.IV = iv; 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(encrytedData, 0, encrytedData.Length-nBytes); cs.Close(); rawData = ms.ToArray(); Console.WriteLine("Bob:message is encryted:{0}", Convert.ToBase64String(rawData)); } } aes.Clear();

這里寫代碼片

return rawData; }

這里寫圖片描述

在運行結果的時候: int nBytes=aes.BlockSize; 超出了數組?不知道怎么樣去解決


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 竹溪县| 浠水县| 博爱县| 黄龙县| 花莲市| 论坛| 华安县| 沧州市| 高邮市| 木里| 南郑县| 资溪县| 淮南市| 肥东县| 雷州市| 社旗县| 民县| 安福县| 弥勒县| 贵阳市| 金乡县| 突泉县| 鸡泽县| 二手房| 锦州市| 深州市| 呈贡县| 万年县| 巫山县| 宁波市| 上栗县| 竹北市| 麻栗坡县| 云林县| 慈利县| 武威市| 绥德县| 贵港市| 吉木萨尔县| 禹州市| 丽水市|