[英]How to sign a message with existing private key by using ECDsa on dotnet core 3.1 MacOS?
[英]How to sign a message using ECDSA with an ECDiffieHellman instance in .net framework 4.7.1?
假定ECDiffieHellman實例也可以用於簽名。
如果我有有效的ECDiffieHellman(ECDH)實例,如何使用.net框架中的ECDH實例使用ECDSA創建簽名?
我認為可以通過以下方式驗證簽名:
ECDiffieHellman ecdh; //Already have this instance
var verifyKey = CngKey.Import(ecdh.PublicKey.ToByteArray(), CngKeyBlobFormat.EccPublicBlob);
var ecDsa = new ECDsaCng(verifyKey);
var dataBytes = ASCIIEncoding.ASCII.GetBytes("Hello!");
var verifyResult = ecDsa.VerifyData(dataBytes, signatureBytesToCheck, HashAlgorithmName.SHA256);
我嘗試對CngKey(用於簽名)遵循類似的模型。 我在創建帶有私鑰字節的CngKey時遇到麻煩。
ECDiffieHellman ecdh; //Already have this instance
var ecdhParams = ecdhCasd.ExportParameters(true);
var ecdhPrivateKeyBytes = ecdhParams.D;
var signingKey = CngKey.Import(ecdhPrivateKeyBytes, CngKeyBlobFormat.EccPrivateBlob);
我嘗試使用GenericPrivateBlob,EccFullPrivateBlob進行格式化。 仍然沒有任何效果。
我在正確的道路上嗎? 如果是這樣,我在做什么錯?
我比我想像的要近得多。 我終於發現我只需要使用Create方法而不是Import方法,如下所示:
ECDiffieHellman ecdh; //Already have this instance
var ecdhParams = ecdhCasd.ExportParameters(true);
var signer = ECDsa.Create(ecFullParams);
var signedBytes = ecDsa.SignData(dataBytes, HashAlgorithmName.SHA256);
如果我只有公共密鑰可以驗證:
ECDiffieHellmanPublicKey ecdhPk; //Compute this with public key bytes
var ecPkParams = ecdhPk.ExportParameters();
var verifier = ECDsa.Create(ecPkParams);
var verifyResult = verifier.VerifyData(bytesToBeVerified, signatureBytesToCheck, HashAlgorithmName.SHA256);
除了導出密鑰屬性,您還應該能夠使用不可導出的密鑰:
ECDiffieHellmanCng ecdhChg = ecdh as ECDiffieHellmanCng;
// Export is required.
if (ecdhCng == null)
return null;
return new ECDsa(ecdhCng.Key);
這是因為在Windows CNG上,僅允許使用ECDSA鍵進行ECDSA; 但是“ ECDH”鍵可以同時執行ECDSA和ECDH。 至少對於軟件私鑰是正確的。
.NET開始允許通過.NET 4.6.2中的ECDH密鑰創建ECDsaCng,因此,如果您有可用的ECC ExportParameters方法,則該方法已經可以使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.