我正在尝试编写一个使用RSA加密和解密文本文件的程序。在使用binascii的unhexlify时,我似乎遇到了一个问题。
out_format = '%%0%dx' % (chunk_size * 2,)
plain = pow(coded, int(key), int(private_modulus))
chunk = unhexlify((out_format % plain).encode())
当我的程序到达最后一行时,它会抛出一个错误“binascii.Error:Odd-length string”
答案 0 :(得分:1)
您的plain
值更大超过chunk_size * 2
十六进制数字,因此结果字符串包含奇数个十六进制数字。你需要处理那个溢出。
仅有2个十六进制数字且值为256(十六进制100)的示例:
>>> '%02x' % 256
'100'
>>> unhexlify('%02x' % 256)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
binascii.Error: Odd-length string
我不熟悉RSA解密是如何工作的,所以我不能说问题是plain
的计算问题,还是你应该掩盖值以适应块大小。要适合块大小,您可以使用以下方法屏蔽plain
值:
mask = (1 << (chunksize * 8)) - 1
plain &= mask
我在这里使用str.format()
而不是%
的旧式字符串格式;您可以更轻松地合并宽度:
unhexlify('{1:0{0}x}'.format(chunk_size * 2, plain))
对字节进行编码是可选的,binascii.unhexlify
也接受字符串,至少在Python 3.3上。