问题描述
我在加密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()