PyCryptoDome cipher.encrypt将空白文本保存到加密文件

问题描述

我在加密path accountfile中的文件内容时遇到很多麻烦。 加密确实有效,因为解密成功输出了将路径保存到文件的版本的accountfile路径。该代码成功运行,没有错误,但是加密后保存的加密文件最终为空白。如何获得成功加密的ptext内容?

{
  "errors": [
    {
      "extensions": {
        "path": "$.variableValues","code": "validation-failed"
      },"message": "no such type exists in the schema: 'timetz'"
    }
  ]
}

解决方法

这是一个有效的示例,但是由于它不安全,请不要将其用于任何敏感的事情。

正确使用加密原语是 HARD ;相反,您应该使用比您聪明的高层食谱,而且我正确地编写了这些食谱并证明它们可以安全使用。我对Python的建议是Fernet

通过这种方式,您可以编写一些秘密数据并生成密钥,然后运行脚本并将您的秘密数据找回来:

$ echo "Very secret data" > secret.txt
$ dd if=/dev/urandom bs=1 count=32 > key.dat
32 bytes transferred
$ python so64569401.py
b'Very secret data\n'

但是,正如所说的那样,这是不安全的,因为未对数据进行身份验证;密文可能会被篡改,并且您不会知道数据不是您要放回的内容。例如,如果我删除了第一个加密调用,则修改加密文件中的单个字节并再次运行脚本:>

$ hexf secret.txt.enc
$ python so64569401.py
b'Very secRet data\n'

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad,unpad


def read_key(filename) -> bytes:
    with open(filename,"rb") as f:
        key = f.read(32)
        assert len(key) == 32
        return key


def encrypt_file(filename: str,key: bytes) -> str:
    with open(filename,"rb") as f:
        data = f.read()

    cipher = AES.new(key,AES.MODE_CBC)
    cipher_data = cipher.encrypt(pad(data,AES.block_size))

    encrypted_filename = filename + ".enc"

    with open(encrypted_filename,"wb") as f:
        f.write(cipher.iv)
        f.write(cipher_data)

    return encrypted_filename


def decrypt_file(filename: str,key: bytes) -> bytes:
    with open(filename,"rb") as f:
        iv = f.read(AES.block_size)
        cipher_data = f.read()

    cipher = AES.new(key,AES.MODE_CBC,iv=iv)
    return unpad(cipher.decrypt(cipher_data),AES.block_size)


def main():
    key = read_key("key.dat")
    encrypted_filename = encrypt_file("secret.txt",key)
    decrypted_data = decrypt_file(encrypted_filename,key)
    print(decrypted_data)


if __name__ == "__main__":
    main()

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...