python3.9下pycropto中RSA报错

一、报错

最近项目用到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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值