C# 在不知道素数p或q的情况下从JWKS创建RSA实例

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

我试图从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.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
您还将发现一个PHP实现

如果安装了带有GMP和JSON扩展的PHP 7.1,可以尝试以下命令:

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)相同的答案