使用python密码库对带有重音符号的数据进行加密

时间:2019-06-24 08:56:59

标签: python encryption pycrypto des

我正在使用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")

有人可以帮助我了解为什么它无法正常工作吗?

1 个答案:

答案 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的下一个倍数,该倍数应为纯文本的长度。之后,您可以使用该长度的空格来填充字符串。