1 回答
TA贡献1942条经验 获得超3个赞
这是一个确实有效的示例,但请不要将其用于任何敏感的事情,因为它不安全。
正确使用密码学原语是困难的;相反,您应该使用比您和我更聪明的人编写的更高级别的食谱,并证明在正确使用时是安全的。我对 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()
添加回答
举报