我正在使用Crypto库在Python中实现DES3。当我偶然发现下一个问题时,我正在做一些测试:
如果要加密的纯文本包含重音符号,则该字符失败。
例如,当我尝试加密下一个单词时,我的代码运行正常:
要加密的文本(长度为8的倍数):"Hello Jose "
但是,如果我尝试加密相同的文本但包含重音符号,它将失败:
要加密的文本(长度为8的倍数)= "Hello José "
我得到的错误是“ ValueError:输入字符串的长度必须是8的倍数”。
如果我检查单词的长度,它是8的倍数。
plaintext="Hello Jose "
print(" Plain text:" + plaintext)
print(" Plain Text length:" + str(len(plaintext)))
结果:纯文本长度:16
接下来找到我的代码的简化示例:
from Crypto.Cipher import DES3
import binascii
import base64
plaintext="Hello Jose "
print(" Plain text:" + plaintext)
print(" Plain Text length:" + str(len(plaintext)))
#### ENCRYPTION
key ='173JKL3D93A9CNI1G6NP9A14'
key=bytes(key, 'utf-8')
plaintext_bytes=bytes(plaintext, 'utf-8')
print(" Plain Text length:" + str(len(plaintext_bytes)))
cipher_encrypt=DES3.new(key)
encrypted_text=cipher_encrypt.encrypt(plaintext_bytes)
print( " Encrypted word:" + str(encrypted_text))
#### DECRYPTION
cipher_encrypt=DES3.new(key)
decrypted_text=cipher_encrypt.decrypt(encrypted_text)
print(" Decripted text:" + str(decrypted_text,'utf-8') + "\n")
有人可以帮助我了解为什么它无法正常工作吗?
答案 0 :(得分:1)
Goyo是正确的。该算法将纯文本读取为字节字符串。知道这一点,带有重音符号的一个字符的字节长度为2。请参见下一个示例:
>> a='a'
>> print("length:" + str(len(a.encode('utf-8'))))
length:1
>> a='á'
>> print("length:" + str(len(a.encode('utf-8'))))
length:2
因此,首先必须将文本编码为字节,然后计算长度。
您可以做的是计算8的下一个倍数,该倍数应为纯文本的长度。之后,您可以使用该长度的空格来填充字符串。