一、报错
最近项目用到python3.9版本下pycrypto包,在用到RSA模块时出现如下错误,主要是因为python3中bytes和str无法进行拼接导致
File "/usr/local/python-3.9.4/lib/python3.9/site-packages/Crypto/PublicKey/RSA.py", line 352, in exportKey
keystring = ''.join([ struct.pack(">I",len(kp))+kp for kp in keyparts])
File "/usr/local/python-3.9.4/lib/python3.9/site-packages/Crypto/PublicKey/RSA.py", line 352, in <listcomp>
keystring = ''.join([ struct.pack(">I",len(kp))+kp for kp in keyparts])
TypeError: can't concat str to bytes
二、修改
- 我们可以对上述报错文件
/python3.9/site-packages/Crypto/PublicKey/RSA.py
地方进行修改,主要思想是将输出变量变成bytes进行拼接,原始修改部分文件内容,line:346:
if format=='OpenSSH':
eb = long_to_bytes(self.e)
nb = long_to_bytes(self.n)
if bord(eb[0]) & 0x80: eb=bchr(0x00)+eb
if bord(nb[0]) & 0x80: nb=bchr(0x00)+nb
keyparts = [ 'ssh-rsa', eb, nb ]
keystring = ''.join([ struct.pack(">I",len(kp))+kp for kp in keyparts])
return 'ssh-rsa '+binascii.b2a_base64(keystring)[:-1]
- 修改后变为:
if format=='OpenSSH':
eb = long_to_bytes(self.e)
nb = long_to_bytes(self.n)
if bord(eb[0]) & 0x80: eb=bchr(0x00)+eb
if bord(nb[0]) & 0x80: nb=bchr(0x00)+nb
keyparts = [ 'ssh-rsa', eb, nb ]
new_list = []
for kp in keyparts:
temp = struct.pack(">I", len(kp))
if isinstance(kp, str):
kp = bytes(kp,encoding='utf-8')
temp += kp
new_list.append(temp)
keystring = b''.join(new_list)
return b'ssh-rsa '+binascii.b2a_base64(keystring)[:-1]