Как я могу перевести этот код Perl для открытого ключа RSA в python? - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть следующий объект JSON, представляющий JWK RSA256, полученный с веб-сайта:

jwk = {
    'e': 'AQAB', 
    'n': 'sAlE_mzYz-2jf_YpxulSJXv_2CGIquflNZWhXUaU1SkJm9P0riLAuzwK7WT5p0Ko3zmQHho70_7D9nqB01rA4ExrMIDKpprE0Qa7NAJN-kgZhd_A25HsdSfpOfpaLvR-mf9fuOTDPLRQCd5HnrjoQKjs3D_XfPmPnT_Ny5erviiky90GSfN9j2DP_5yeDprzWKF-EQ3EDdIWt3snr7AW8rzBcZ1ojyWxckLAeSKDerMXP-zVBUFJE9Kn60HZoGNvmATKaw8LwEbf8DGfrllgSLvhg7mDRMLlbcooQoWAFSfN7t7kFbPSOcvjrpx3Yw_KrEwBZXeUP3260ukmFOx8RQ',
 }

Ниже приведен код Perl, показывающий, как объект с открытым ключом из библиотеки Crypt может быть создан извыше jwk:

use Crypt::OpenSSL::RSA;
use Crypt::OpenSSL::Bignum;
use MIME::Base64 qw/decode_base64url/;

sub public_key {
    my $rsa = Crypt::OpenSSL::RSA->new_key_from_parameters(
        Crypt::OpenSSL::Bignum->new_from_bin(decode_base64url($jwk->{n})),
        Crypt::OpenSSL::Bignum->new_from_bin(decode_base64url($jwk->{e})),
    );
    return $rsa->get_public_key_x509_string;
}

Два вопроса:

Как я могу перевести вышеуказанный код на Python?Код ниже не удался.

Как только у меня есть объект открытого ключа в python, как я могу использовать его для проверки JWT, подписанного соответствующим закрытым ключом?Пожалуйста, опубликуйте фрагмент, показывающий, как именно это можно сделать.

>>> from Crypto.PublicKey import RSA
>>> import base64
>>> public_key = RSA.construct((base64.b64decode(jwk['n']), base64.b64decode(jwk['e'])))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "my-virtual-env/lib/python2.7/site-packages/Crypto/PublicKey/RSA.py", line 539, in construct
    key = self._math.rsa_construct(*tup)
  File "my-virtual-env/lib/python2.7/site-packages/Crypto/PublicKey/_slowmath.py", line 84, in rsa_construct
    assert isinstance(n, long)
AssertionError

1 Ответ

0 голосов
/ 20 декабря 2018

Ошибка возникает из-за того, что RSA-конструктор ожидает 2 длинных целых числа, а вы используете две строки.

Решение состоит в том, чтобы преобразовать декодированную строку base64 в шестнадцатеричное целое число.

from Crypto.PublicKey import RSA
import base64

n = int(base64.b64decode(jwk['n']).encode('hex'),16)
e = int(base64.b64decode(jwk['e']).encode('hex'),16)
e = long(e)

public_key = RSA.construct((n, e))
print(public_key)

Что касается второго вопроса, возможно, вы можете использовать этот метод для проверки действительности подписи RSA.

...