将 PEM 编码的 RSA public 密钥转换为 AsymmetricKeyParameter

convert PEM encoded RSA public key to AsymmetricKeyParameter

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

这是私钥的有效解决方案:

这个方法有什么问题?

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 编码 public 密钥。我试过没有评论,也删除了 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 ----

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

-----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);