在Python中检索存储的AES加密字符串时出现问题

时间:2015-07-12 02:06:56

标签: python encryption pycrypto

我在存储加密的字符串时遇到问题,然后在文本文件中编码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。

2 个答案:

答案 0 :(得分:0)

我认为您的问题是您在存储和检索文件时忘记使用二进制模式。

使用b64它不应该是一个问题,但显然是。

尝试使用ab和rb,以防万一。 也许Python弄乱了新的线条。如果您使用的是Python 3,我不会感到惊讶。 我不是很有希望。

无论如何,尝试打印repr(line)和len(line),以便你可以比较。

答案 1 :(得分:0)

在解密时,你初始化CBC密码一次,然后用它一个接一个地解密所有行。

我相信你不会在加密时这样做。换句话说,在加密每一行之前,您可能会四次初始化CBC密码。

修复方法是在解密代码的第一个循环中移动obj2

另外,CBC的IV应该是随机的,而不是固定值。