我知道 SO 上已经有了答案,但是在尝试了其中的几个 (ex1, ex2) 之后,我仍然无法根据模数和指数生成正确的公钥。
这是我的python3代码:
from Crypto.PublicKey.RSA import construct
import urllib.parse
import base64
import re
def decode_base64(data, altchars=b'+/'):
"""Decode base64, padding being optional.
:param data: Base64 data as an ASCII byte string
:returns: The decoded byte string.
"""
data = re.sub(rb'[^a-zA-Z0-9%s]+' % altchars, b'', data) # normalize
missing_padding = len(data) % 4
if missing_padding:
data += b'='* (4 - missing_padding)
return base64.b64decode(data, altchars)
e = int.from_bytes(decode_base64(b'AQAB'), 'big', signed=False)
decoded = decode_base64(b'tVKUtcx_n9rt5afY_2WFNvU6PlFMggCatsZ3l4RjKxH0jgdLq6CScb0P3ZGXYbPzXvmmLiWZizpb-h0qup5jznOvOr-Dhw9908584BSgC83YacjWNqEK3urxhyE2jWjwRm2N95WGgb5mzE5XmZIvkvyXnn7X8dvgFPF5QwIngGsDG8LyHuJWlaDhr_EPLMW4wHvH0zZCuRMARIJmmqiMy3VD4ftq4nS5s8vJL0pVSrkuNojtokp84AtkADCDU_BUhrc2sIgfnvZ03koCQRoZmWiHu86SuJZYkDFstVTVSR0hiXudFlfQ2rOhPlpObmku68lXw-7V-P7jwrQRFfQVXw', 'big')
n = int.from_bytes(decoded, 'big', signed=False)
rsaKey = construct((n, e))
pubKey = rsaKey.exportKey()
print(pubKey.decode('ascii'))
但是每当我尝试验证 jwt 令牌时,我都会收到“signature_invalid”错误。
我是否没有正确解码二进制编码的字节?
----更新--- 正如评论中所建议的,我已经更新了我的代码以首先对字节进行 url 解码,但我仍然收到与以前相同的签名无效错误。