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; }
下面是一個比較復雜的例子,它使用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); }

這里寫代碼片
return rawData; }
在運行結果的時候: int nBytes=aes.BlockSize; 超出了數組?不知道怎么樣去解決
新聞熱點
疑難解答