Python 3.6 - ошибка JWCrypto при импорте ключа RSA

Хотя этот вопрос задавался ранее, и на него был дан ответ на (полезных данных шифрования JWT в python? (JWE)), я не могу заставить JWK работать - я попытался импортировать свои ключи RSA с открытым текстом и получил сообщение об ошибке (добавление трассировки стека ниже). Кто-нибудь может сказать мне, что я делаю не так?

Traceback (most recent call last):
  File "statenc.py", line 169, in <module>
    test()
  File "statenc.py", line 155, in test
    keypair = statEnc()
  File "statenc.py", line 48, in __init__
    self.pub_jwk = jwk.JWK.import_from_pem(self, data=self.pubkeystr, password=None)
  File "/usr/lib/python3.6/site-packages/jwcrypto/jwk.py", line 624, in import_from_pem
    data, password=password, backend=default_backend())
  File "/usr/lib/python3.6/site-packages/cryptography/hazmat/primitives/serialization.py", line 20, in load_pem_private_key
    return backend.load_pem_private_key(data, password)
  File "/usr/lib/python3.6/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 978, in load_pem_private_key
    password,
  File "/usr/lib/python3.6/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1129, in _load_key
    mem_bio = self._bytes_to_bio(data)
  File "/usr/lib/python3.6/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 432, in _bytes_to_bio
    data_char_p = self._ffi.new("char[]", data)
TypeError: initializer for ctype 'char[]' must be a bytes or list or tuple, not str

Мой код выглядит следующим образом: (это для модуля, который инициализирует новый ключ RSA, если существующие ключи не предоставлены)

def __init__(self, pubkeystr = None, privkeystr = None, sessionkey = None):
        self.pubkeystr = pubkeystr
        self.privkeystr = privkeystr
        self.sessionkey = sessionkey
        if pubkeystr == None or privkeystr == None:  #if blank, generate keys
            self.random_generator = Random.new().read
            self.keys = RSA.generate(1024, self.random_generator)
            self.pubkey = self.keys.publickey()
            self.pubkeystr = self.pubkey.exportKey(format='PEM',
                                            passphrase=None,
                                            pkcs=1).decode('utf-8')
            self.pubcipher = PKCS1_OAEP.new(self.pubkey)
            self.privcipher = PKCS1_OAEP.new(self.keys)
            self.privkeystr = self.keys.exportKey(format='PEM',
                                                passphrase=None,
                                                pkcs=1).decode('utf-8')
            self.privkey = self.keys.exportKey()
        else:  #import the keys
            self.pubkeystr = pubkeystr
            self.privkeystr = privkeystr
            self.pubkey = RSA.importKey(pubkeystr)
            self.pubcipher = PKCS1_OAEP.new(self.pubkey)
            self.privkey = RSA.importKey(privkeystr)
            self.privcipher = PKCS1_OAEP.new(self.privkey)
            if sessionkey == None:
                sessionkey = get_random_bytes(16)
            else:
                self.sessionkey = sessionkey
        # Now setup the JWKs
        self.pub_jwk = jwk.JWK.import_from_pem(self, data=self.pubkeystr, password=None)
        self.priv_jwk = jwk.JWK.import_from_pem(self, data=self.privkeystr, password=None)
        print("%s \n %s" % (self.pub_jwk, self.priv_jwk))

person kilokahn    schedule 25.09.2017    source источник
comment
Может ли кто-нибудь помочь мне здесь?   -  person kilokahn    schedule 01.10.2017


Ответы (1)


Я знаю, что это старый вопрос, но я наткнулся на него в безумном поиске ответов на другие варианты jwcrypto. Я знаю, что вы, вероятно, решили это, но я оставлю это здесь для других пользователей. Ошибка, грубо говоря, заключается в том, что вам нужно закодировать строку в байтах.

Изменение

self.pub_jwk = jwk.JWK.import_from_pem(self, data=self.pubkeystr, password=None)
self.priv_jwk = jwk.JWK.import_from_pem(self, data=self.privkeystr, password=None)

to

self.pub_jwk = jwk.JWK.import_from_pem(self, data=self.pubkeystr.encode('UTF-8'), password=None)
self.priv_jwk = jwk.JWK.import_from_pem(self, data=self.privkeystr.encode('UTF-8'), password=None)

должен исправить проблему.

person Eamonn Nugent    schedule 17.03.2018
comment
Вот это да. На самом деле я так и не нашел исправления, и мне пришлось использовать другие методы. Дайте мне попробовать и дайте вам знать! :) - person kilokahn; 19.03.2018
comment
jwcrypto версии 0.3.2 AttributeError: type object 'JWK' has no attribute 'import_from_pem' - person isaaclw; 03.04.2019
comment
Я знаю, что это очень давно, но вам нужно создать экземпляр JWK: keys = jwk.JWK() self.priv_jwk = keys.import_from_pem(data=self.privkeystr.encode('UTF-8'), password=None) Также удалите первое собственное значение, переданное вызову import_from_pem. - person Mayron; 24.09.2019