2015-07-12 35 views
0

我遇到存储加密字符串,然后在文本文件中编码b64的问题。在Python中检索存储的AES加密字符串时出现问题

代码加密是

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。

回答

0

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

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

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

在另一个注释中,CBC的IV应该是随机的,而不是固定值。

+0

谢谢,这是它!这些行一次添加一个,作为另一个进程的一部分,但它们一次全部拉出(然后过滤)。 – PaulP

0

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

随着b64它不应该是一个问题,但显然是。

尝试使用ab和rb,以防万一。 也许Python弄乱了新的界限。如果你使用Python 3,我不会感到惊讶。 虽然我不抱希望。

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

+0

我试过了,但没有什么区别。谢谢。 – PaulP