2017-08-12 204 views
0

当我试图加密/与蟒蛇pycrypto解密加密失去字符串的一部分。大部分事情都顺利工作,但我得到一个奇怪的问题,当解密data.I试图加密/解密的一些JPG文件进行测试,虽然它们加密/没有问题解密,解密后的文件无法/损坏打开。试图找到我保存的文本文件里有类似的随机一句“测试此文件的完整性等等等等等等”的问题,它只有在“诚信....等等等等等等”正确解密,完整性之前一切都还是乱码字符。我不是AES该见地,但即时假设这是一个编码/解码或填充错误。pycrypto加密/解密,解密

这里是我的代码:

#encryption 
iv = Random.new().read(AES.block_size) 

filePath = input("Path to file for encryption: ") 
selFile = open(filePath, 'rb') 
getBytes = bytes(selFile.read()) 

encPW = input("Enter password: ") 
hashpw = hashlib.sha256(encPW.encode('UTF-8').digest()) 

destination = input("Destination path for encrypted file: ") 

aes = AES.new(hashpw, AES.Mode_CFB, iv) 
encFile = base65.b64encode(aes.encrypt(getBytes)) 

writetofile = open(destination, 'wb') 
writetofile.write(encFile) 
writetofile.close() 
print("Encryption successful") 

#Decryption 
iv = Random.new().read(AES.block_size) 

filePath = input("Path to file for decryption: ") 
selFile = open(filePath, 'rb') 
getBytes = bytes(selFile.read()) 

decPW = input("Enter password: ") 
hashdecpw = hashlib.sha256(encPW.encode('UTF-8').digest()) 

destination = input("Destination path for decrypted file: ") 

aes = AES.new(hashdecpw, AES.Mode_CFB, iv) 
decFile = aes.decrypt(getBytes) 

writetofile = open(destination, 'wb') 
writetofile.write(decFile) 
writetofile.close() 
print("Decryption successful") 

上什么可能会造成的第一个字符的损失,并阻止我的加密/解密正确的文件任何想法?

+0

请不要恶意破坏你的帖子。 – DJMcMayhem

+1

请不要破坏你的帖子。一旦你发布了一个问题,你已经将内容授权给了Stack Overflow社区(在CC-by-SA许可下)。如果您想取消关联此帐户与您的帐户关联,请参阅[解除请求的正确途径是什么?](http://meta.stackoverflow.com/questions/323395/what-is-the-proper-route-换一个 - 解离 - 请求)。 – Bugs

回答

1

你至少有三个问题:

  • 你可能意味着hashlib.sha256(encPW.encode('UTF-8')).digest()代替hashlib.sha256(encPW.encode('UTF-8').digest())(右括号是在错误的位置)

  • 你编码使用Base64密文写作之前它到一个文件。在解密文件之前,您已经忘记从文件中读回文件后再进行解码。例如:

    getBytes = base64.b64decode(bytes(selFile.read())) 
    
  • 这是大的:你认为你已经使用了加密解密过程中需要完全一样的IV。 IV并不是秘密,但对于您使用同一个密钥进行的每种加密,它都必须是唯一的。通常将IV写在密文前并回读解密。

    #encryption 
    encFile = base64.b64encode(iv + aes.encrypt(getBytes)) 
    
    #decryption 
    getBytes = base64.b64decode(bytes(selFile.read())) 
    iv = getBytes[:16] 
    aes = AES.new(hashdecpw, AES.Mode_CFB, iv) 
    decFile = aes.decrypt(getBytes[16:]) 
    
+0

勉强重要,但'海峡。编码()'自动承担UTF-8 :) –

+0

谢谢Artjom一切工作,因为它应该现在应该在这些变化之后。看起来像IV是绝对是我失去了良好的捕捉的重大一步。感谢您的帮助 – mypython

1

你生成用于加密和解密seperately,这涉及到产生这样的问题一个新的IV。下面是我建议这样做:

def encrypt(inpath, outpath, password): 
    iv = Random.new().read(AES.block_size) 
    with open(inpath, "rb") as f: 
     contents = f.read() 
    # A context manager automatically calls f.close() 
    key = pbkdf2.crypt(password, "") 
    # See notes 

    aes = AES.new(key, AES.Mode_CFB, iv) 
    encrypted = aes.encrypt(contents) 
    with open(outpath, "wb") as f: 
     f.write(iv + b":") 
     f.write(encrypted) 
    print("Encryption successful") 


def decrypt(inpath, outpath, password): 
    with open(inpath, "rb") as f: 
     contents = f.read() 

    iv, encrypted = contents.split(b":") 
    key = pbkdf2.crypt(password, "") 
    aes = AES.new(key, AES.Mode_CFB, iv) 

    decrypted = aes.decrypt(contents) 
    with open(outpath, "wb") as f: 
     f.write(decrypted) 
    print("Decryption successful") 

一些注意事项:

  • 的静脉注射并不意味着是秘密的,所以它可以随机生成一次,然后写入一个文件供以后使用的解密(如本例中所示)

  • 哈希算法对于派生密钥来说不够强大,这就是为什么有一些称为密钥派生算法的特殊工具(如Python中的PBKDF2)。改用它们!

我自己没有测试过这个代码,所以可能无法正常工作。

+1

密码散列的好处。我错过了。 –

+1

优秀,两个答案都是完全正确的。 我只使用散列算法进行测试,并且现在将执行PBKDF2,这些问题已经排序。它无论如何不是关键的,只是学术而优秀的一点。感谢您的回答和帮助! – mypython