C# 在不知道素数p或q的情况下从JWKS创建RSA实例
我试图从JSON Web密钥集(JWKS)创建C# 在不知道素数p或q的情况下从JWKS创建RSA实例,c#,rsa,C#,Rsa,我试图从JSON Web密钥集(JWKS)创建System.Security.Cryptography.RSA,该密钥集包含一些RSA密钥,但只包含它们的模(n)、公共指数(e)和秘密指数(d),而不是密钥生成过程中使用的素数(p和q) 这是包含私钥(当然是测试密钥)的jwks: 以下是我尝试过的: using System.Linq; using System.Net; using System.Security.Cryptography; using Microsoft.IdentityM
System.Security.Cryptography.RSA
,该密钥集包含一些RSA密钥,但只包含它们的模(n)、公共指数(e)和秘密指数(d),而不是密钥生成过程中使用的素数(p和q)
这是包含私钥(当然是测试密钥)的jwks:
以下是我尝试过的:
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using Microsoft.IdentityModel.Tokens;
class Program
{
static void Main(string[] args)
{
var jwks = new WebClient().DownloadString("https://belgianmobileid.github.io/slate/private_jwks.json");
var webKeySet = JsonWebKeySet.Create(jwks);
// signing key has kid "s1"
var signingkey = webKeySet.Keys.Single(key => key.KeyId == "s1");
// throws System.Security.Cryptography.CryptographicException:
// 'The specified RSA parameters are not valid; both Exponent and Modulus are required fields.'
var rsa = RSA.Create(
new RSAParameters
{
Modulus = Base64UrlEncoder.DecodeBytes(signingkey.N),
Exponent = Base64UrlEncoder.DecodeBytes(signingkey.E),
D = Base64UrlEncoder.DecodeBytes(signingkey.D),
P = null, // unknown
Q = null // unknown
});
}
}
我当然不是密码专家,我只是想把JWKS解析成我可以在代码中使用的东西。甚至在不知道p或q的情况下也可以这样做吗?
p
和q
(以及dp
、dq
和qi
)不强制执行签名/加密操作。
但它们大大加快了计算过程(比原来快10倍多)
您可以从n
、e
和d
恢复这些值
- 用于
和p
q
- 使用for
、dp
和dq
qi
curl -OL https://github.com/web-token/jwt-app/raw/gh-pages/jose.phar
curl -OL https://github.com/web-token/jwt-app/raw/gh-pages/jose.phar.pubkey
chmod +x jose.phar
./jose.phar key:optimize '{"kty":"RSA","d":"FVSxl…96w"}'
例如,使用您指出的链接中的以下键:
{“kty”:“RSA”,“d”:FVSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXQQQQQQQQQ6 6-6-6-6-6-6-XQQQQQQQQ6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6 PXRGFKGJN2JUSY6OLRIG-HsQ,“e”:AQAB,“使用”:“sig”,“kid”:“s1”,“alg”:“RS256”,“n”:一个新的研究成果是一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的地图,一个新的地图,一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的地图,一个新的地图,一个新的地图,一个新的地图,一个新的理论,一个新的一个新的地图,一个新的理论,一个新的研究,一个新的2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 RPUYXRF6VROOU96W“}
带素数的同一密钥为:
{“kty”:“RSA”,“d”:”FVSSXXFFFFFSXFFFFSXFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVXXXXXXXXXXXQQQQQQQQQQQQQQ6 6 6 6 6六六六六六六六六六六六六六六六六六六六六六六六六非非非非非VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRGFKGJN2JUSY6OLRIG-HsQ,“e”:AQAB,“使用”:“sig”,“kid”:“s1”,“alg”:“RS256”,“n”:一个新的研究成果是一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的地图,一个新的地图,一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的研究成果,一个新的地图,一个新的地图,一个新的地图,一个新的地图,一个新的理论,一个新的一个新的地图,一个新的理论,一个新的研究,一个新的2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 RPUYXRF6VROOU96W,“p”:2.在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,中国,中国的一个中国的一个中国政府在中国,在中国,在中国,在中国的一个中国,在中国,在中国的一个中国,在中国的一个中国的一个中国,在中国,在中国,在中国的一个中国,在中国,在中国,在中国,在中国,在中国在中国的一个中国,在中国,在中国的一个中国,在中国在中国的一个中国,在中国,在中国在中国,在中国在中国在中国的中国的4YZSIRF7K1ECJM1TCSUU-k“,”dp:“XXHRVZEWNNVY2xRPKKBOJ4EBS4VZ3RLPFLG4_9;9MUU3I0LVKEOGED8LSVFWYWARF23JV98W2I9TLJ226FY1CKCFGJVTNF86PVL4BKRKRNAGGDKS-A6D2WfT8Un9-T0lYJ95wbr_6;6DHSK99K9QH5J8VA5RTDTUJ2BQPCY0”,“dq”:”“dzTM-0C3kxwfHwk53uRBopgO6cTueZGOSYv34Aw-u-6WgT5Ac2-cbj3ZkNzLOxM9ZaHhxP05(JGMWHB0K7JZTFDMJORISROOZGW6RUTSR6OD3RBERPHX7UOWIXCCJBB-FROelWxC3bG74Fx7r_myAKylZlY-osXKHc-3PTE”,“qi”:”s0SZ_zjimz6bac_8;i8xjmvbq8wa08nl1dhxtkjxabjcqqbq6xis5hxxouezv8wwe8o4ndvwqhgzinvjwzlyjtk2j1frvazm1ei-pb9c9rdgnk4elciujizofvfirf4rzstpptx1tsihuil3geyucng9uqjpkj8aumkay“
谢谢,我遇到了同一个文档,并试图用C#实现它,但发现它有相当多的缺陷。我在这里找到了另一个版本的算法,它更短,更有效:我写了这个,它给出了与你得到的(p,q)相同的答案