首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3.6-导入RSA Key时出现JWCrypto错误

Python3.6-导入RSA Key时出现JWCrypto错误
EN

Stack Overflow用户
提问于 2017-09-26 05:19:04
回答 1查看 1.3K关注 0票数 0

虽然这个问题之前已经被问过并在(JWT encrypting payload in python? (JWE))上得到了回答,但我似乎不能让JWK工作--我已经尝试导入我的纯文本RSA密钥,但得到一个错误(添加下面的堆栈跟踪)。有人能告诉我我哪里做错了吗?

代码语言:javascript
复制
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密钥)

代码语言:javascript
复制
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))
EN

回答 1

Stack Overflow用户

发布于 2018-03-18 07:51:30

我知道这是一个古老的问题,但我是在疯狂地寻找其他jwcrypto选项的答案时偶然发现的。我知道你可能已经解决了,但我还是把它留给其他用户吧。粗略地说,错误在于您需要将字符串编码为字节。

改变

代码语言:javascript
复制
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)

代码语言:javascript
复制
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)

应该可以解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46414349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档