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



我正在尝试将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 SubjectPubliKeyInfo结构导入公钥,替换此对象的密钥Source是:ASN.1-DER编码中X.509 SubjectPublicKeyInfo结构的字节数
  • AsymmetricAlgorithm.ExportSubjectPublicKeyInfo:以X.509 SubjectPubliKeyInfo格式导出当前密钥的公钥部分

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

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

RSA密钥和ECDH兼容密钥是截然不同的。它甚至不完全是";方桩、圆孔";,但更像是";颜色绿色,圆形孔";。它们都是非对称密钥,这意味着它们都兼容SPKI和PKCS8格式。(这两种格式基本上都是"这是我的密钥类型"one_answers"这是适合该密钥的格式的一些数据"(

  • 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())

最新更新