2016-10-28 128 views
0

我發現了一小段代碼,能夠在AES(128位)CBC模式下對文件進行加密(和解密)。即使在解密時,它也是無懈可擊的,所以我相信OpenSSL將能夠(當然)解密我的文件,但似乎不可能。我得到的「錯誤讀取輸入文件Python和OpenSSL:無法解密

import os, random, struct 
from Crypto.Cipher import AES 

def encrypt_file(key, in_filename, out_filename=None, chunksize=64*1024): 
    """ Encrypts a file using AES (CBC mode) with the 
     given key. 

     key: 
      16, 24 or 32 bytes long 

     in_filename: 
      Name of the input file 

     out_filename: 
      If None, '<in_filename>.enc' will be used. 

     chunksize: 
      Sets the size of the chunk which the function 
      uses to read and encrypt the file. 
      Chunksize must be divisible by 16. 
     """ 
    if not out_filename: 
      out_filename = in_filename + '.enc' 

    iv = ''.join(chr(random.randint(0, 0xFF)) for i in range(16)) 
    encryptor = AES.new(key, AES.MODE_CBC, iv) 
    filesize = os.path.getsize(in_filename) 

    with open(in_filename, 'rb') as infile: 
     with open(out_filename, 'wb') as outfile: 
      outfile.write(struct.pack('<Q', filesize)) 
      outfile.write(iv) 

      while True: 
       chunk = infile.read(chunksize) 
       if len(chunk) == 0: 
        break 
       elif len(chunk) % 16 != 0: 
        chunk += ' ' * (16 - len(chunk) % 16) 

       outfile.write(encryptor.encrypt(chunk)) 

的錯誤是一樣的曾經時間:「錯誤讀取輸入文件」。它怎麼可能?我使用的命令是這樣的:

openssl aes-128-cbc -d -in test_enc.txt -out test_dec.txt 

爲什麼不工作?

回答

0

OpenSSL使用自己的文件格式。特別是,有一個Salted__標題,以及用於導出IV的鹽(即IV不直接與加密數據一起存儲)。

你可以在https://scottlinux.com/2013/10/13/how-to-encrypt-a-file-with-openssl/https://crypto.stackexchange.com/questions/3298/is-there-a-standard-for-openssl-interoperable-aes-encryption找到一些提示,但它們沒有描述實際的格式。

您可能可以檢查OpenSSL代碼以找出結果,但底線是OpenSSL使用自己的文件格式,如果您希望OpenSSL解密文件,則必須使用它。

+0

呃好的謝謝!現在我明白了,基本格式是不同的!非常感謝 –