使用PemWriter导出C#BouncyCastle EC私钥

时间:2017-07-11 16:02:19

标签: c# cryptography bouncycastle pem key-pair

我正在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和其他相关类的源代码并没有指出任何明显的错误)。

非常感谢任何帮助。 感谢。

2 个答案:

答案 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);
  ...
}