[英]Key is not a valid public or private key
我正在尝试将 RSACryptoServiceProvider 创建的密钥对导入 ECDiffieHellmanOpenSsl:
RSACryptoServiceProvider keyPair = EncryptionTools.GenerateRSAKeyPair(4096);
ECDiffieHellmanOpenSsl alice = new ECDiffieHellmanOpenSsl();
int publicBytesReadAlice = 0;
alice.ImportSubjectPublicKeyInfo(new ReadOnlySpan<byte>(keyPair.ExportSubjectPublicKeyInfo()), out publicBytesReadAlice);formát
int privateBytesRead = 0;
alice.ImportPkcs8PrivateKey(new ReadOnlySpan<byte>(keyPair.ExportPkcs8PrivateKey()), out privateBytesRead);
它在第五行抛出这个错误:
System.Security.Cryptography.CryptographicException:密钥不是有效的公钥或私钥。
我不知道问题出在哪里,因为文档说:
尝试导入 RSA 私钥时也会发生同样的事情,该私钥应该是Pkcs8格式。
知道如何正确导出/序列化密钥并将其传递给 ECDiffieHellmanOpenSsl 吗? 并且知道如何将其序列化为字符串?
RSA 密钥和 ECDH 兼容的密钥是完全不同的野兽。 它甚至不完全是“方钉圆孔”,而更像是“颜色绿色,圆孔”。 它们都是非对称密钥,这意味着它们都兼容 SPKI 和 PKCS8 格式。 (这两种格式基本上都是“这是我的那种键”和“这是适合该键的格式的一些数据”)
(对于所有这些语句,密钥也可以通过其他平台或其他库集上的兼容概念创建)。
因此,如果您想序列化 ECDH,只需从创建 ECDH 开始(例如ECDiffieHellman.Create(ECCurve.NamedCurves.nistP521)
)。
对于文本版本,.NET 7 正在添加直接到 PEM 版本(例如key.ExportSubjectPublicKeyInfoPem()
)。 对于早期版本,您可以使用PemEncoding
,例如PemEncoding.Write("PUBLIC KEY", key.ExportSubjectPublicKeyInfo())
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.