我正在C#BouncyCastle中生成一个EC密钥对,并尝试使用PemWriter导出PEM文件中的私钥。这样做的代码如下:
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'和相同的EC曲线(secp384r1)做同样的事情时,生成的PEM文件是完全不同的,例如:
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和其他相关类的源代码并没有指出任何明显的错误)。
非常感谢任何帮助。 感谢。
答案 0 :(得分:0)
事实证明,您可以使用私钥和公钥创建ECPrivateKeyStructure实例,并将对象的Base64编码字符串保存到文件中,例如:
{% for course in courses %}
{% set searchrcourse = true %}
{% for rcourse in report.courses %}
{% if searchrcourse %}
{% if rcourse.id == course.id %}
<li {{ 'class="column-pre"' if loop.last else ''}}><span>Cool!</span></li>
{% set searchrcourse = false %}
{% else %}
<li></li>
{% endif %}
{% endif %}
{% endfor %}
{% endfor %}
答案 1 :(得分:0)
晚了一点,您可以显式地编写私钥和公钥(也许最好使用单独的文件):
...
// 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);
...
}