c# 如何将 JWK 转换为 RsaSecurityKey

问题描述 投票:0回答:2

我正在尝试根据公钥验证签名,并且我使用 RSACryptoproviders 等实现了这一点。 我设置公钥(以PEM格式导入密钥,读取rsa参数,然后创建RsaSecurityKey) 一切正常,但现在客户希望我不仅支持 PEM 格式,还支持 de JWK 格式。

当我用谷歌搜索时,我发现有 100 个站点将 PEM 转换为 JWK(甚至有一个 JwkConvert 类),但它只有一种方式。

在 C# 中我怎样才能以相反的方式做到这一点?所以我可以将 JWK 转换为 RsaSecurityKey?

我找到了这篇文章: 如何通过 openssl 将 jwk 转换为公钥 但我希望我不必自己写所有这些..

另外,我已经准备好使用 BouncyCastle 加密库(我用它来导入 PEM 格式)

我希望能够从 JWK 检索 RsaParameters,但我只是加密货币的用户,这些字母并没有告诉我任何信息。

为了提供更多信息,这是我的 JWK:

{"keys":[{"kid":"OEbwVQck6qGhsCWiYenQowD9wHic7BtS-LALJEna-og","kty":"RSA","alg":"RS256","use":"sig","n":"w1Y2AZWK8k0gWPQv5Q_GnNHna8kD_TcZhB0_qM8cQ8ABJUiynLjS52tVLeo9NQnIBiiGDDby_bmAkJnxUtzanpGo4wnsvckjHFiThZSNnMpU_GIRFvhjyfPcnvzLhuvmd_gX9iDQmpJk2nbBoatkKwnaiAl0VQ8jP85DxQYsjlxwrKhhVqIe4EYEazq3zTpKOKWu4QSQYE74lvWbyqEmSPG32V2Te7L7BDVAgqsQhAqx0mRpMHcJPtgX0AsM5iQrxUow51Y22shd6pgLkgvbc8LfXKWHAUgeg20JBBQc_gReek1h0qToDY-hWdxLpGBOLeWUKoUVAzAj2gXgTER2TQ","e":"AQAB","x5c":["MIIClTCCAX0CBgFz4hEUBTANBgkqhkiG9w0BAQsFADAOMQwwCgYDVQQDDANJUkQwHhcNMjAwODEyMDk0NTM2WhcNMzAwODEyMDk0NzE2WjAOMQwwCgYDVQQDDANJUkQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDVjYBlYryTSBY9C/lD8ac0edryQP9NxmEHT+ozxxDwAElSLKcuNLna1Ut6j01CcgGKIYMNvL9uYCQmfFS3NqekajjCey9ySMcWJOFlI2cylT8YhEW+GPJ89ye/MuG6+Z3+Bf2INCakmTadsGhq2QrCdqICXRVDyM/zkPFBiyOXHCsqGFWoh7gRgRrOrfNOko4pa7hBJBgTviW9ZvKoSZI8bfZXZN7svsENUCCqxCECrHSZGkwdwk+2BfQCwzmJCvFSjDnVjbayF3qmAuSC9tzwt9cpYcBSB6DbQkEFBz+BF56TWHSpOgNj6FZ3EukYE4t5ZQqhRUDMCPaBeBMRHZNAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAHrHDQWMgXLiumpq3JAKDjH+8bf6VRvG40xNRz6H0Xg3pdC+ME8Jqtl49z2oXLJPCDKqyX2Lv9YRn0tFP6VYkBLQp1BBg7j2y8frkMrhzoRt28dhMfyMtdFgOhykwaPl6V0ASmd/iMyjK52XYjyUj+kVFhBNe1dA9F5Ftw1tyfwY5EFWbLyoBLzH+oZxbZzWIdFdSE9hhxOsioIaOOfrpBkincvQOYf/0RJS9jrVM2bRNah0HmxrdkiZNwvszm2uHPVNzgNxiK1iNqTHztbNKm9uO7diziJ4I4f2fesSMEdZG8AZ52NwP1ZVcTE+ZXcOE/+NhyAVf+4SP4abpqzi8+Q="],"x5t":"oNVqosVxKIQ8TW3MGZzM8_2AIJQ","x5t#S256":"_VULg4UAhXE8V7vJFJDTUYeoH0FL2pbbK0Lc8-3CK3k"}]}

当我从中创建 Microsoft JsonWebKey 对象时,“N”和“E”参数为空(“D”、“DP”、“DQ”、“P”、“Q”、“QI”也是如此) ,“X”和“Y”)

因此我无法创建 RsaParameters...

c# cryptography rsa jwk
2个回答
1
投票

事实证明,这是我这边的一个错误。我发布的字符串是一个 jsonWebKeySET 而不仅仅是一个 jsonwebkey。我将其放入 JsonWebKey 类的构造函数中,并且没有任何解析错误(grrr microsoft),因此假设它是正确的。

结果我必须使用 JsonWebKeySet() 类。 @jps 评论之后很有帮助。 (不知道如何评价你)


0
投票

我来到这里寻找类似的答案,但@BasieP并没有真正回答他自己的问题,所以我将尝试填补空白。

JsonWebKeySet
基本上只是一个容纳
JsonWebKey
对象数组的容器。从逻辑上讲,具有
JsonWebKeySet
的程序员可能会搜索其
Keys
属性来查找具有匹配
JsonWebKey
KeyId
。找到匹配项后,逻辑程序员会说:“我有
JsonWebKey
,现在如何将它变成
SecurityKey
?”这就是我的处境,我认为这也是 OP 所苦苦挣扎的问题。

不幸的是,所有执行此操作的代码都被标记为

internal
并且有很多代码,所以不要这样做。相反,使用
JsonWebKeySet.GetSigningKeys()
方法来获取
SecurityKey
的列表。然后,在 that 列表中搜索匹配的
KeyId

© www.soinside.com 2019 - 2024. All rights reserved.