当前位置: 首页 > 知识库问答 >
问题:

使用PemWriter导出C#BouncyCastle EC私钥

申颖逸
2023-03-14
var ecKeyPairGenerator = new ECKeyPairGenerator();
CKeyGenerationParameters ecKeyGenParams = new ECKeyGenerationParameters(SecObjectIdentifiers.SecP384r1, new SecureRandom());
ecKeyPairGenerator.Init(ecKeyGenParams);
AsymmetricCipherKeyPair pair = ecKeyPairGenerator.GenerateKeyPair();

string path = @"c:\tmp\test\myprivkey.pem";
TextWriter textWriter = new StreamWriter(path);
PemWriter pemWriter = new PemWriter(textWriter);
// passing pair results in the private key being written out
pemWriter.WriteObject(pair);
pemWriter.Writer.Flush();
pemWriter.Writer.Close();
-----BEGIN EC PRIVATE KEY-----
MD4CAQEEMJvNXtTUd7A/fY/9/LSXM+Xb/6QS7GydeART/OieN3zh23Uuy0tgiS1D
rohXMgiPvqAHBgUrgQQAIg==
-----END EC PRIVATE KEY-----
openssl ecparam -name secp384r1 -genkey -out mykey2.pem -noout

-----BEGIN EC PRIVATE KEY-----
MIGkAgEBBDBqCE9+AWL56cvR2/tRNdyaTIlJnfr6TbhCG+Q48w6yyKR+hE0jkeOV
7yh1t8NwqT6gBwYFK4EEACKhZANiAAS2uLv7KG6RRBZBOecaxBz8FsMobnxgZkbQ
8cKdL1DRym1lUDwgfX8AxOC6qkuD1k0UekpHcwiy1mSghy4640qBAKcR3mVghMVF
77Nm8x6nwNijWZroeqhjrw268PPPuAw=
-----END EC PRIVATE KEY-----

正如您所看到的,密钥长度非常不同,并且我用前者创建的P12文件不会导入到Windows证书存储中。我一定是用C#BouncyCastle做错了什么,但看不出是什么(查看PemWriter和其他相关类的源代码并没有指出任何明显的错误)。

任何帮助都将不胜感激。谢了。

共有1个答案

胡玉书
2023-03-14

在聚会的后期,您可以显式地编写私钥和公钥(也许使用单独的文件更好):

...
// passing pair results in the private key being written out
pemWriter.WriteObject(pair.Private);
pemWriter.WriteObject(pair.Public);
pemWriter.Writer.Flush();
pemWriter.Writer.Close();

但是,Bouncy Castle的当前版本(1.8.5)已经将公钥写入(私钥)PEM文件。因此,您不需要显式地编写公钥。

此外,以下两行基本相同:

 pemWriter.WriteObject(pair);
 pemWriter.WriteObject(pair.Private);
# .../BouncyCastle/.../MiscPemGenerator.cs
private static PemObject CreatePemObject(...)
{
  ...
  if (obj is AsymmetricCipherKeyPair)
    return MiscPemGenerator.CreatePemObject((object)
      ((AsymmetricCipherKeyPair) obj).Private,
      algorithm, password, random);
  ...
}
 类似资料:
  • 在 Emscripten 中使用 Embind 和 WebIDL Binder 都可以将 C 对象导出至 JavaScript,但笔者在实际工程中并没有使用这两种方法,一方面是因为这些方法是侵入式的,另一方面更重要的是,笔者对于 是否应该使用C类作为库接口 本身持保留态度——设计出一个糟糕的 C 接口的可能性远高于设计出一个糟糕的 C 接口——当然这并不意味着反对使用 C,事实上 C 是笔者日常使

  • 我一直在搜索,但我似乎找不到一个简单的方法解密使用RSA。 我生成了一个公钥和私钥,它们存储在两个单独的文件中,并且是XML格式的。使用FromXmlString将公钥关联到RSACryptoServiceProvider对象,然后加密一个字符串,这一点没有问题。当我试图解密一个加密的字符串时,我的困惑就来了。我不确定如何将私钥数据与RSACryptoServiceProvider关联,以便使用D

  • 我试图从私钥中生成一个公共ECDSA密钥,但我还没有在互联网上找到多少关于如何实现这一点的帮助。几乎所有的事情都是为了从公钥规范生成公钥,我不知道如何得到它。到目前为止,我总结了以下内容: 但是,在运行时,我会出现以下错误: 我做错了什么?有更好/更简单的方法吗? 编辑:我已经设法编译了一些代码,但它不能正常工作: 当我运行它时,它会生成一个公钥,但它不是私钥对应的公钥。

  • 小问题:如何使进口证书(pfx)不可出口? 是不支持这种场景还是我们缺少了什么?提前道谢!

  • 问题内容: 如何列出和导出密钥库中的私钥? 问题答案: 最初来自Example Depot的一部分代码,用于列出密钥存储区中的所有别名: 几个月前,在Sun论坛上讨论了私钥的导出问题,而u:turingcompleter提出了DumpPrivateKey类,以将其缝入您的应用程序。 注意:这使用Sun软件包,这是一件“坏事”。 如果您可以下载apache commons代码 ,则以下是无需警告即可

  • 以前有人这么做过吗?谢谢