在 Python 中检索存储的 AES 加密字符串时出现问题
Problems retrieving stored AES encrypted string in Python
我在存储加密的字符串时遇到问题,然后将 b64 编码到文本文件中。
要加密的代码是
from base64 import b64encode, b64decode # import library for B64
from Crypto.Cipher import AES
import datetime
d = datetime.date.today()
shortd = d.strftime("%y%m%d")
docNum = raw_input("Enter Doc Number: ")
#Doc num is always 20 characters,
obj = AES.new('ThisIsA16digitPs', AES.MODE_CBC, 'This is an IV456')
ciphertext = obj.encrypt(shortd+docNum+"000000") #Zeroes for filler
lognum = b64encode(ciphertext)
f = open("e:\log.txt", "a")
f.write(str(lognum) + "\n")
f.close()
文件显示以下文本:
uTfZKAuVYbZJM28Tbcv3OBHvDn8QBKm1Nbb0wjcq9rE=
wCeIeyDBShmbsjM1yIpzEPdijAe4o12J4FAhigDotCU=
wCeIeyDBShmbsjM1yIpzEPHZ9fsBlE+svpzBxwcunoU=
wCeIeyDBShmbsjM1yIpzEODr4Ko91q0lsSnlMSuUlJo=
因为我有 4 个号码。
解密的密码是
from base64 import b64encode, b64decode # import library for B64
from Crypto.Cipher import AES # Import AES encryption module
obj2 = AES.new('ThisIsA16digitPs', AES.MODE_CBC, 'This is an IV456')
with open('e:\log.txt', "r") as logfile:
for line in logfile:
docstring2 = obj2.decrypt(b64decode(line))
print docstring2
if not line:
logfile.close()
break
但是我运行的时候,返回的结果是
15071110000000000000000001000000
t²W;\è¥dèä»Q.ó·0000000002000000
’?ÕC©û™±1ófì±#0000000003000000
”„¬¿Ì¼ïÂѾa*›ƒ0000000004000000
第一行是正确的。其他人应该看起来就像它一样。
15071110000000000000000001000000
15071120000000000000000002000000
15071120000000000000000003000000
15071120000000000000000004000000
那么,我做错了什么?我是 python 的新人,无法理解这一点。
编辑:我在 win32 上使用 Python 2.7.10。
我认为你的问题是你在存储和检索文件时忘记使用二进制模式。
使用 b64 应该不是问题,但显然是问题。
尝试使用 ab 和 rb,以防万一。
也许 Python 弄乱了换行。如果您使用 Python 3,我不会感到惊讶。
虽然我不抱希望。
无论如何,尝试打印 repr(line) 和 len(line) 以便您可以进行比较。
在解密时,您初始化 CBC 密码一次,然后用它解密所有行,一个接一个。
我相信你不会在加密时这样做。换句话说,您可能会在加密每一行之前对 CBC 密码进行四次初始化。
解决方法是将 obj2
创建移动到解密代码的第一个循环内。
另外说明,CBC 的 IV 应该是随机的,而不是固定值。
我在存储加密的字符串时遇到问题,然后将 b64 编码到文本文件中。
要加密的代码是
from base64 import b64encode, b64decode # import library for B64
from Crypto.Cipher import AES
import datetime
d = datetime.date.today()
shortd = d.strftime("%y%m%d")
docNum = raw_input("Enter Doc Number: ")
#Doc num is always 20 characters,
obj = AES.new('ThisIsA16digitPs', AES.MODE_CBC, 'This is an IV456')
ciphertext = obj.encrypt(shortd+docNum+"000000") #Zeroes for filler
lognum = b64encode(ciphertext)
f = open("e:\log.txt", "a")
f.write(str(lognum) + "\n")
f.close()
文件显示以下文本:
uTfZKAuVYbZJM28Tbcv3OBHvDn8QBKm1Nbb0wjcq9rE=
wCeIeyDBShmbsjM1yIpzEPdijAe4o12J4FAhigDotCU=
wCeIeyDBShmbsjM1yIpzEPHZ9fsBlE+svpzBxwcunoU=
wCeIeyDBShmbsjM1yIpzEODr4Ko91q0lsSnlMSuUlJo=
因为我有 4 个号码。
解密的密码是
from base64 import b64encode, b64decode # import library for B64
from Crypto.Cipher import AES # Import AES encryption module
obj2 = AES.new('ThisIsA16digitPs', AES.MODE_CBC, 'This is an IV456')
with open('e:\log.txt', "r") as logfile:
for line in logfile:
docstring2 = obj2.decrypt(b64decode(line))
print docstring2
if not line:
logfile.close()
break
但是我运行的时候,返回的结果是
15071110000000000000000001000000
t²W;\è¥dèä»Q.ó·0000000002000000
’?ÕC©û™±1ófì±#0000000003000000
”„¬¿Ì¼ïÂѾa*›ƒ0000000004000000
第一行是正确的。其他人应该看起来就像它一样。
15071110000000000000000001000000
15071120000000000000000002000000
15071120000000000000000003000000
15071120000000000000000004000000
那么,我做错了什么?我是 python 的新人,无法理解这一点。
编辑:我在 win32 上使用 Python 2.7.10。
我认为你的问题是你在存储和检索文件时忘记使用二进制模式。
使用 b64 应该不是问题,但显然是问题。
尝试使用 ab 和 rb,以防万一。 也许 Python 弄乱了换行。如果您使用 Python 3,我不会感到惊讶。 虽然我不抱希望。
无论如何,尝试打印 repr(line) 和 len(line) 以便您可以进行比较。
在解密时,您初始化 CBC 密码一次,然后用它解密所有行,一个接一个。
我相信你不会在加密时这样做。换句话说,您可能会在加密每一行之前对 CBC 密码进行四次初始化。
解决方法是将 obj2
创建移动到解密代码的第一个循环内。
另外说明,CBC 的 IV 应该是随机的,而不是固定值。