简体   繁体   English

Python和OpenSSL:无法解密

[英]Python and OpenSSL: unable to decrypt

I have found a small piece of code capable of encrypt (and decrypt) files in AES (128bit) CBC mode. 我发现一小段代码可以在AES(128位)CBC模式下加密(和解密)文件。 It work flawlessy even in decryption so I belived that OpenSSL would be capable (of course) od decrypting my files but it seems impossibile. 即使在解密时它也可以正常工作,所以我相信OpenSSL能够(当然)可以解密我的文件,但是似乎不太可能。 I get the " Error reading input files " 我收到“ 读取输入文件时出错

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))

The error is the same ever time: "Error reading input files". 该错误与以往相同:“读取输入文件时出错”。 How is it possibile? 可能性如何? The commands I use is this: 我使用的命令是这样的:

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

Why doesn't work? 为什么不起作用?

OpenSSL uses its own file format. OpenSSL使用其自己的文件格式。 In particular, there's a Salted__ header, as well as a salt that's used to derive the IV (ie the IV is not directly stored with the encrypted data). 特别是,有一个Salted__标头,以及用于导出IV的盐(即IV不直接与加密数据一起存储)。

You can find some hints in https://scottlinux.com/2013/10/13/how-to-encrypt-a-file-with-openssl/ and in https://crypto.stackexchange.com/questions/3298/is-there-a-standard-for-openssl-interoperable-aes-encryption , but they don't describe the actual format. 您可以在https://scottlinux.com/2013/10/13/how-to-encrypt-a-file-with-openssl/https://crypto.stackexchange.com/questions/3298/中找到一些提示有一个标准的openssl可互操作aes加密 ,但是它们没有描述实际的格式。

You might be able to examine the OpenSSL code to figure that out, but the bottom line is that OpenSSL uses its own file format and you have to use it if you want OpenSSL to decrypt your files. 您也许可以检查OpenSSL代码以弄清楚这一点,但最重要的是OpenSSL使用其自己的文件格式,如果要OpenSSL解密文件,则必须使用它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM