【问题标题】:convert PEM encoded RSA public key to AsymmetricKeyParameter将 PEM 编码的 RSA 公钥转换为 AsymmetricKeyParameter
【发布时间】:2017-11-11 13:44:03
【问题描述】:

我正在尝试创建一个从 PEM 编码的 public 密钥构造 AsymmetricKeyParameter 的方法。不幸的是,pemReader.ReadObject() 返回 null。

这是一个有效的私钥解决方案:convert PEM encoded RSA private key to AsymmetricKeyParameter

这个方法有什么问题?

static AsymmetricKeyParameter ReadPublicKeyFromPemEncodedString(string pemEncodedKey)
{
    AsymmetricKeyParameter result = null;
    using (var stringReader = new StringReader(pemEncodedKey))
    {
        var pemReader = new PemReader(stringReader);
        var pemObject = pemReader.ReadObject(); // null!
        result = ((AsymmetricCipherKeyPair)pemObject).Public;
    }

    return result;
}

这是我正在测试的 PEM 编码的公钥。我试过没有评论,也删除了 SSH2。

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "rsa-key-20170608"
AAAAB3NzaC1yc2EAAAABJQAAAQEAk0AmagKx285Ufbri/olc+f3WagL1Ho+DrYdD
SbuU7cJAq+uD9xGvvP9m2JavSP4wO9i9pB/cmCFMPoIj3oGJt1/cnLb/U2juneOw
6Uo0N3F8TXdyXfZNAIPhq/jw0YfIypTFTTvFkKXfTArIwW/bQBW8/dujFR8i5CxP
jRKRDOBEy0PPOLJDD0iUr9GX/h/EO4jQ7B/GszjhPiPx+gJCilaMY+jrSczjxpsK
OXzpZEdT1NqMrzgvIZPHYhQzAiw9vQzov3vezDwKgKcRrUixZ2B8uiEQNn7Wa2Qz
WF3vL+6CGflFNYQcc0leDQBe86baYhCollouP4jfaH9KcMkYYw==
---- END SSH2 PUBLIC KEY ----

【问题讨论】:

    标签: c# bouncycastle public-key pem


    【解决方案1】:

    Bouncy castle 只是不理解这种格式的公钥 (SSH2)(如果您愿意,可以通过查看 PemReader 的源代码来验证这一点)。不幸的是,我不知道如何在 C# 中将其转换为适当的格式,但您可以使用许多工具来做到这一点,例如使用 ssh-keygen(也可用于 windows 的 gitbash)或 openssl。转换为 PEM 后,您的公钥将如下所示:

    -----BEGIN RSA PUBLIC KEY-----
    MIIBCAKCAQEAk0AmagKx285Ufbri/olc+f3WagL1Ho+DrYdDSbuU7cJAq+uD9xGv
    vP9m2JavSP4wO9i9pB/cmCFMPoIj3oGJt1/cnLb/U2juneOw6Uo0N3F8TXdyXfZN
    AIPhq/jw0YfIypTFTTvFkKXfTArIwW/bQBW8/dujFR8i5CxPjRKRDOBEy0PPOLJD
    D0iUr9GX/h/EO4jQ7B/GszjhPiPx+gJCilaMY+jrSczjxpsKOXzpZEdT1NqMrzgv
    IZPHYhQzAiw9vQzov3vezDwKgKcRrUixZ2B8uiEQNn7Wa2QzWF3vL+6CGflFNYQc
    c0leDQBe86baYhCollouP4jfaH9KcMkYYwIBJQ==
    -----END RSA PUBLIC KEY-----
    

    它会被您当前的代码正确处理,只需稍作改动:

    var pemReader = new PemReader(stringReader);
    var pemObject = pemReader.ReadObject(); // null!
    // it's already AsymmetricKeyParameter
    result = ((AsymmetricKeyParameter)pemObject);
    

    【讨论】:

    • 我似乎无法让它往返。意思是,对于您发布的公钥,我能够很好地获得 AsymmetricKeyParameter,但是当我使用 PemWriter 将其写入字符串时,它是一个不同的字符串。我将之前/之后放在差异工具中,“之后”在键中有一大段文本,这些文本没有出现在上面的字符串中。此外,“之后”以“BEGIN PUBLIC KEY”而不是“BEGIN RSA PUBLIC KEY”开头
    • 嗯,这是另一种格式,您可以阅读此问题中的差异:stackoverflow.com/q/20065304/5311735。它仍然代表相同的公钥。也许您可以描述一下您正在做的事情的实际目标。
    • 谢谢!这很有帮助!我的目标是对我写给 PEM 编码 AsymmetricKeyParameter.Public 的方法进行单元测试。我认为一个好的测试是从 PEM 编码的字符串构造这样的密钥,然后将其传递给我的方法并检查它是否往返。
    • 我会说最好对这个密钥进行编码,然后对其进行解码(返回到 AsymmetricKeyParameter),然后比较原始密钥和解码密钥(即:指数、模数等,而不是它们的编码版本)。
    • 同意,这是一个更好的测试。有点懒=)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2015-10-19
    • 2011-03-10
    相关资源
    最近更新 更多