【发布时间】:2021-08-06 05:07:06
【问题描述】:
.NET 中有两种 P256 曲线算法可以与CngKey 一起使用:
- CngAlgorithm.ECDiffieHellmanP256椭圆曲线 Diffie-Hellman (ECDH) 密钥交换
- CngAlgorithm.ECDsaP256椭圆曲线数字签名算法(ECDSA)
让我感到困惑的是,似乎可以使用CngAlgorithm.ECDiffieHellmanP256 创建签名。
示例代码:
// create private key and data
var privateKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256);
Console.WriteLine($"privateKey: {privateKey.Algorithm} {privateKey.KeyUsage}");
// sign data
var data = new byte[] { 1, 2, 3 };
byte[] signature;
using (var dsa = new ECDsaCng(privateKey))
{
signature = dsa.SignData(data);
Console.WriteLine($"Signature: {Convert.ToBase64String(signature)}");
}
// create stand-alone public key, just to be sure this is working as expected
var publicKeyBlob = privateKey.Export(CngKeyBlobFormat.EccPublicBlob);
var publicKey = CngKey.Import(publicKeyBlob, CngKeyBlobFormat.EccPublicBlob);
Console.WriteLine($"Public key: {publicKey.Algorithm} {publicKey.KeyUsage} {Convert.ToBase64String(publicKeyBlob)}");
// verify signature
using (var dsa = new ECDsaCng(publicKey))
{
var verified = dsa.VerifyData(data, signature);
Console.WriteLine($"Verified: {verified}");
}
输出:
privateKey: ECDH_P256 AllUsages
Signature: I1+Bapp8jxC7hUbTQTDTqscR9uoM/bo0OG1WVxgJUWYWq6jmW38a51JnuVRMXMKHosLOClt+AlrjiL/hG7TaqQ==
Public key: ECDH_P256 AllUsages RUNLMSAAAAC9amJDYvEJF+6HXyIhHoOiyUyu3grcH7leeuiOjMAiGbKwFoLssph+NCpY35g2dSHvNgaU11AavV/gAkPH6UPm
Verified: True
只是为了显示相似性;如果我改用CngAlgorithm.ECDsaP256:
privateKey: ECDSA_P256 AllUsages
Signature: meQ2ywrGWCOnVCaa0bm74Z0Sj37epzSJ5bz/b0x31hGvTn8zk3hcRt5If1+r1PgoR0A1cmSBDF4QUkY0UQjPhw==
Public key: ECDSA_P256 AllUsages RUNTMSAAAADfyG3BtOqGrI63Kh+FPy6V0EmpVX/4mBSbDQ+RxEerlaQCIVq0STrl87D+Re1b+iZ7a8/+S74cHrFNILqYqLXi
Verified: True
请注意,以相反的方式执行此操作 - 尝试使用 DSA 密钥创建 DH 对象 - 使用 new ECDiffieHellmanCng(CngKey.Create(CngAlgorithm.ECDsaP256)) 会导致:
ArgumentException:与 ECDiffieHellmanCng 算法一起使用的键必须具有 ECDiffieHellman 的算法组。参数名称:键
这意味着密钥类型之间存在某种差异。
以这种方式使用 ECDH 密钥实际上是否安全(例如:此代码是否生成安全的数字签名)?
使用 ECDSA 密钥而不是 ECDH 密钥有什么好处(除非您明确不想允许密钥交换)?
【问题讨论】:
标签: c# cryptography digital-signature elliptic-curve