Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将PEM编码的RSA公钥转换为AsymmetricKeyParameter_C#_Bouncycastle_Public Key_Pem - Fatal编程技术网

C# 将PEM编码的RSA公钥转换为AsymmetricKeyParameter

C# 将PEM编码的RSA公钥转换为AsymmetricKeyParameter,c#,bouncycastle,public-key,pem,C#,Bouncycastle,Public Key,Pem,我正在尝试创建一个方法,该方法从PEM编码的公共密钥构造一个AsymmetricKeyParameter。不幸的是,pemReader.ReadObject()返回null 下面是一个私钥的有效解决方案: 这种方法有什么问题 static AsymmetricKeyParameter ReadPublicKeyFromPemEncodedString(string pemEncodedKey) { AsymmetricKeyParameter result = null; usi

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

下面是一个私钥的有效解决方案:

这种方法有什么问题

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

Bouncy castle不理解这种公钥格式(SSH2)(如果愿意,您可以通过查看
PemReader
的源代码来验证这一点)。不幸的是,我不知道如何在C#中将其转换为适当的格式,但您可以使用许多工具,例如ssh-keygen(在gitbash for windows中也可用)或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将其写入字符串时,它是另一个字符串。我将before/after放在一个diff工具中,“after”在键中有一个文本块,它没有出现在上面的字符串中。另外,“after”开头是“BEGIN PUBLIC KEY”,而不是“BEGIN RSA PUBLIC KEY”。这是另一种格式,您可以阅读此问题中的差异:。但它仍然表示相同的公钥。也许你可以描述一下你正在做的事情的实际目标是什么。谢谢!那很有帮助!我的目标是对我写给PEM的方法进行单元测试,对AsymmetricKeyParameter.Public进行编码。我认为一个好的测试应该是从PEM编码的字符串构造这样一个密钥,然后将其传递给我的方法并检查它是否往返。我认为最好对这个密钥进行编码,然后对其进行解码(返回到AsymmetricKeyParameter),然后比较原始密钥和解码密钥(即:指数、模等,而不是它们的编码版本)。同意,那是一个更好的测试。有点懒=)