Создать экземпляр RSA из JWKS, не зная простых чисел p или q - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь создать экземпляр System.Security.Cryptography.RSA из набора веб-ключей JSON (JWKS), который включает в себя некоторые ключи RSA, но включает только их модуль (n), открытый показатель (e) и секретный показатель (d)а не простые числа, которые использовались во время генерации ключей (p и q).

Это jwks, который включает в себя закрытые ключи (конечно, тестовые ключи): https://belgianmobileid.github.io/slate/private_jwks.json

Вот чтоЯ попытался:

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?

1 Ответ

0 голосов
/ 12 октября 2018

p и q (а также dp, dq и qi) не являются обязательными для выполнения операций подписи / шифрования.Но они значительно ускоряют процесс вычислений (более чем в 10 раз быстрее).

Вы можете восстановить эти значения из n, e и d.

В этом проекте вы также найдете реализацию PHP .

Если у вас установлен PHP 7.1 с установленными расширениями GMP и JSON, вы можете попробовать следующую команду:

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": "FVSxlyJTtDwWxAkAIxexpZTaDd3EsiCTcjF9h5Ciu0fcZujvX7i-qC1Nhzxk5ScQ36j0vduDymsW4uTehJKmcIZAnw_oMtX9ikn85KiUGGVzoUu4TyaUGmoGmDGUIrqtKhXbhoFXmFrQrtMSjy-1V2J-I0nX7s-fqS3c2MPtmnPEMXkLpxHr2hStRiIQFIf3T7Dv4aX5-2o00JViEM-cXTQZJerkDjSgj7KhGP7EKnkTfV7sBAiuRnbtOFqrNNMjXpGWJQSPbof1_6oo3_R9Jw7TYTNMzIyXWDmpam_Zf_iPFltFRWTh9nUygCAvpnPXRgFkgJN2JuSY6oLrIG-HSQ», "е":"AQAB", "использование": "сиг", "ребенок": "s1", "ALG": "RS256", "п": "pJADu0nyhCrh9XIRTO42V6YQqAeNABGGo006hknHw86wYByjHMhpYYwHuxuyx44mO8iQIcJkh5NPlkcaDN90RH0JOxyEE1pES5C3LqntC0mAP6BWoqMhY8g4PT2EJyPjVYZcpaZw0VUp6E5kx847dbvhMe8KWy0geuCwrCgXVhWDRoIyV7r2k948zlmRJjbdjkNosYEFI43nicZ_jckTbs_8nzlxDQo8GtstdhR_oUbXyyBJM66SUA8KxWV6NG0zubNIYWxHIwlU938gdpTNfUMKm78f78iPyfuoPz2dTb6Z7OP7WZb06eRv41i_dS0Zh-sKKHrpUYXRf6VrOoU96w"}

тот же ключс простыми числами будет:

{ "KTY": "RSA", "d": "FVSxlyJTtDwWxAkAIxexpZTaDd3EsiCTcjF9h5Ciu0fcZujvX7i-qC1Nhzxk5ScQ36j0vduDymsW4uTehJKmcIZAnw_oMtX9ikn85KiUGGVzoUu4TyaUGmoGmDGUIrqtKhXbhoFXmFrQrtMSjy-1V2J-I0nX7s-fqS3c2MPtmnPEMXkLpxHr2hStRiIQFIf3T7Dv4aX5-2o00JViEM-cXTQZJerkDjSgj7KhGP7EKnkTfV7sBAiuRnbtOFqrNNMjXpGWJQSPbof1_6oo3_R9Jw7TYTNMzIyXWDmpam_Zf_iPFltFRWTh9nUygCAvpnPXRgFkgJN2JuSY6oLrIG-HSQ", "е":»AQAB " "использование": "сиговых", "ребенок": "s1", "ALG": "RS256", "п":" pJADu0nyhCrh9XIRTO42V6YQqAeNABGGo006hknHw86wYByjHMhpYYwHuxuyx44mO8iQIcJkh5NPlkcaDN90RH0JOxyEE1pES5C3LqntC0mAP6BWoqMhY8g4PT2EJyPjVYZcpaZw0VUp6E5kx847dbvhMe8KWy0geuCwrCgXVhWDRoIyV7r2k948zlmRJjbdjkNosYEFI43nicZ_jckTbs_8nzlxDQo8GtstdhR_oUbXyyBJM66SUA8KxWV6NG0zubNIYWxHIwlU938gdpTNfUMKm78f78iPyfuoPz2dTb6Z7OP7WZb06eRv41i_dS0Zh-sKKHrpUYXRf6VrOoU96w " "р": "yFRFPKiUCelQ2c-vfy_09Ckd3TnGWFExHoiG7lOoRDxIWZjHy5ApSZ1S5Hx8pLcmJltpn3ad5LcgVv1hHUmcfw4NuyY1mduC4HUNKb6sZWQZJKDss1mJFFmL3Yg026Sy-_cK2wp0AP2nMqZ3JT3Pm6PsLn6VqKFNqAZNbnp4wrM", "д": "0ktANeYxLEB1uEDkSQgQ6pSppBnNMHishDZPjLNuy2AzfP5tP1sqsg0Xbyr1gtJX9mccz3BwpmQCNZiWWhmLepvERK1gEb97eEmqVK1RwbRU0_z4osZcxudZxhI3QdyTOXYfp3n0SuIb4W-MWy8X4yZsiRf7K1eCJm1THcSUU-к", "дп": "XxhRvZewnnvY22xRPKkBOJ4EBS4Vz3rLPFlG4_9mUu3i0lVKEoGed8lsvfWyHWarf23JV98w2I9tlJ226fY1icKcFgjvTNf86pvl4bkXkRHRNagGdKS-A6D2WfT8Un9-T0lYJ95wbr_6DHsk99K9qH5J8VA5rtDTUj2bqCQPCy0", "дк":" dzTM-0C3kxwfHwk53uRBopgO6cTueZGOSYv34Aw-U-6WgT5Ac2-cbj3ZkNzLOxM9ZaHhxP05_jgmwHb0k7JzTFdMFJorISRoOzGW6lUtSR6OD3URBERphx7R1uOwixccJbB-FROelWxC3bG74Fx7r_myAKylZlY-osXKHc-3PTE " "ци":" s0SZ_zJImz6abac_i8XJmVBq8wa08NL1DHXTKJxaBJcQqUbQ6xIs5Hxxouezv8wWe8O4G4NDVwQHGZINVjwzLyjTK2J1FRvAzm1ei-PB9C9RdgnK4ELCIIuJizOFVgFiRf4rzsTtpPtX1tsihUIL3geYucng9UqYJ * * 10 * 45} 8

...