【问题标题】:PyCrypto Possible To Check If File Already AES Encrypted?PyCrypto 可以检查文件是否已经 AES 加密?
【发布时间】:2014-07-30 00:10:39
【问题描述】:
  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:
                The encryption key - a string that must be
                either 16, 24 or 32 bytes long. Longer keys
                are more secure.

            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. Larger chunk
                sizes can be faster for some files and machines.
                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))

这就是我加密文件的方式,但是如果你在同一个文件上运行它两次或更多次,它会继续加密它,没有问题,我想添加某种 if 检查它是否还没有被 AES 加密?这可能吗?

【问题讨论】:

    标签: python python-2.7 encryption ipython pycrypto


    【解决方案1】:

    最常用的解决方案是在加密文件的开头写一些“魔术”字符串,然后是加密内容。如果在读取文件时找到该字符串,则拒绝进一步加密。对于解密,它被读取以非常确认这是我们加密的文件,否则将被忽略。

    想象一下您正在使用“MyCrYpT”作为魔法(尽管您使用的什么并不重要,只要它相当独特。

    magic = "MyCrYpT"
    # writing the encrypted file
    with open(out_filename, 'wb') as outfile:
        outfile.write(magic)  # write the identifier.
        outfile.write(struct.pack('<Q', filesize))  # file size
        outfile.write(iv)
        # et cetera
    

    现在,当读取文件时,我们读取所有数据,然后检查它是否是我们的。然后我们丢弃魔法并处理其余部分。

    with open(in_filename, 'rb') as infile:
        data = infile.read()
        if data[:len(magic)] != magic:
            raise ValueError('Not an encrypted file')
        filedata = data[len(magic):]
        # Proces the file data
    

    【讨论】:

    • 这是个好主意,这不会损坏文件吗?另外,您是否有代码示例?我猜也可以将文件名保存到注册表
    • @BorisDaka 我添加了一个示例。如您所见,只要您处理得当,它就不会损坏文件。
    【解决方案2】:

    除非你有某种可以检测到的神奇头(例如,在 Linux 上,LUKS 加密磁盘映像有一个用于添加功能的头块,但 DM-Crypt 没有),否则很难检测输入是否字符串是否加密。

    见:determine if the bits are encrypted?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-06
      • 2014-01-18
      • 2011-01-24
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多