繁体   English   中英

密钥不是有效的公钥或私钥

[英]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:密钥不是有效的公钥或私钥。

我不知道问题出在哪里,因为文档说:

  • ECDiffieHellman.ImportSubjectPublicKeyInfo :在解密后从 X.509 SubjectPublicKeyInfo 结构中导入公钥,替换此 object 的密钥。 来源是:ASN.1-DER 编码中的 X.509 SubjectPublicKeyInfo 结构的字节。
  • AsymmetricAlgorithm.ExportSubjectPublicKeyInfo :以 X.509 SubjectPublicKeyInfo 格式导出当前密钥的公钥部分。

尝试导入 RSA 私钥时也会发生同样的事情,该私钥应该是Pkcs8格式。

知道如何正确导出/序列化密钥并将其传递给 ECDiffieHellmanOpenSsl 吗? 并且知道如何将其序列化为字符串?

RSA 密钥和 ECDH 兼容的密钥是完全不同的野兽。 它甚至不完全是“方钉圆孔”,而更像是“颜色绿色,圆孔”。 它们都是非对称密钥,这意味着它们都兼容 SPKI 和 PKCS8 格式。 (这两种格式基本上都是“这是我的那种键”和“这是适合该键的格式的一些数据”)

  • ECDH 可以加载由 ECDsa 或 ECDH 实例创建的任何密钥。
  • ECDsa 可以加载由 ECDsa 实例创建的任何密钥,以及由 ECDH 实例创建的大多数密钥。
  • RSA 只能加载由 RSA 实例创建的密钥。
  • DSA 只能加载由 DSA 实例创建的密钥。

(对于所有这些语句,密钥也可以通过其他平台或其他库集上的兼容概念创建)。

因此,如果您想序列化 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM