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

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


def encrypt_account(path, filename, accountfile):

    c_file = PurePath(path).parent / (PurePath(filename).parent.name + "c.txt")

    file3 = open(c_file, 'rb')

    byteskey = file3.read(32)

    file3.close()

    ckey = bytes(byteskey)


    cipher = AES.new(ckey, AES.MODE_CBC)

    ptext = open(str(accountfile)).read()# this is the account file

    ciphertext = cipher.encrypt(pad(bytes(ptext, "utf-8"), AES.block_size))


    with open(str(path.parent / accountfile.stem) + ".enc", 'wb')as c_file:

        c_file.write(cipher.iv)

        c_file.write(ciphertext)

    #c_file.close()

    #os.remove(accountfile)


胡子哥哥
浏览 102回答 1
1回答

手掌心

这是一个确实有效的示例,但请不要将其用于任何敏感的事情,因为它不安全。正确使用密码学原语是困难的;相反,您应该使用比您和我更聪明的人编写的更高级别的食谱,并证明在正确使用时是安全的。我对 Python 的推荐是Fernet。完成此操作后,您可以编写一些秘密数据并生成密钥,然后运行脚本并将秘密数据返回给您:$ echo "Very secret data" > secret.txt$ dd if=/dev/urandom bs=1 count=32 > key.dat32 bytes transferred$ python so64569401.pyb'Very secret data\n'然而,如上所述,这并不安全,因为数据未经身份验证;密文可以被篡改,并且您不会知道数据不是您放回的数据。例如,如果我删除第一个加密调用,然后从加密文件中修改单个字节并再次运行脚本:$ hexf secret.txt.enc$ python so64569401.pyb'Very secRet data\n'from Crypto.Cipher import AESfrom Crypto.Util.Padding import pad, unpaddef read_key(filename) -> bytes:    with open(filename, "rb") as f:        key = f.read(32)        assert len(key) == 32        return keydef 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_filenamedef 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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python