【问题标题】:How to export a Crypto key in python?如何在 python 中导出加密密钥?
【发布时间】:2021-01-03 14:34:39
【问题描述】:

我想在安全存储之前加密文件,但问题是,我不知道如何存储密钥以在之后解密文件。

代码:

from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA
from Crypto import Random
import ast

random_generator = Random.new().read
key = RSA.generate(1024, random_generator)

encrypteds = str()

for text in open('passwords.log', 'rb').readlines():

    publickey = key.publickey()

    encryptor = PKCS1_OAEP.new(publickey)
    encrypted = encryptor.encrypt(text)

    decryptor = PKCS1_OAEP.new(key)
    decrypted = decryptor.decrypt(ast.literal_eval(str(encrypted)))

    print(publickey)
    encrypteds+=str(encrypted)+'--|--'

with open('passwords_encrypted.log', 'w') as out:
    out.write(str(encrypted))

【问题讨论】:

  • 在密码学和密码分析方案中有两种对称和非对称加密,您可以申请安全加密解密密钥派生密钥在各方或实体之间共享等。例如 AES Chaha20Poly1305 AESGCM 但它取决于哪种类型您要应用的加密方案。是敏感临界点。请看看你肯定也能找到答案legrandin.github.io/pycryptodome/Doc/3.3.1/…

标签: python-3.x cryptography


【解决方案1】:

我查看了您的代码,但 RSA 目前存在许多安全问题,因此请考虑另一种加密类型,仔细阅读并遵循。密码学和密码分析方案中有两种对称和非对称加密,您可以申请在各方或实体之间共享安全加密解密密钥派生密钥等。例如 AES Chaha20Poly1305 AESGCM,但这取决于您要应用哪种加密方案。是敏感临界点。请看看你肯定会找到你的答案检查并建议你看看其他对称加密与 RSA 相比具有良好的安全性。 http://legrandin.github.io/pycryptodome/Doc/3.3.1/Crypto.Cipher-module.html

【讨论】:

    【解决方案2】:

    加密数据的方式毫无意义。非对称加密只能加密少量、固定数量的数据。切勿对对称密钥以外的任何内容使用非对称加密(例如 RSA-OAEP),并使用该对称密钥加密实际数据。对于对称加密,请使用适当的 AEAD 模式,例如 AES-GCM 或 ChaCha20-Poly1305。这称为hybrid encryption

    您的代码有其他问题:

    • 1024 位 RSA 密钥不足以保证安全性:2048 位是最低要求,您应该准备远离 RSA,因为它的密钥大小不能很好地扩展。 (请随意使用 1024 位密钥进行测试和学习,但不要在生产环境中为 RSA 使用任何低于 2048 位的密钥。)
    • 加密是一种二进制格式,但您可以像连接文本一样连接行。文本或二进制:选择一个。最好使用众所周知的格式,例如二进制数据的 ASN.1(复杂但得到很好的支持)或文本的 JSON。如果您需要将二进制数据编码为文本格式,请使用 Base64。

    如果这是用于实际使用,请废弃它并使用 NaCllibsodium。在 Python 中,使用 Python 包装器,例如 libnaclPyNaClpysodiumcsodium。使用public-key box。每个 Python 包装器的 Python API 略有不同,但都包含导出密钥的方法。

    如果这是一个学习练习,请阅读混合加密。查看 libsodium 内部以了解如何正确执行此操作。密钥导入和导出通过import_keyexport_key 方法完成。对称加密以Crypto.Cipher.AES.new(key, Crypto.Cipher.AES.MODE_GCM)Crypto.Cipher.ChaCha20_Poly1305.new(key) 开头(Crypto.Cipher.AES.new(key, Crypto.Cipher.AES.MODE_GCM, nonce=nonce)Crypto.Cipher.ChaCha20_Poly1305.new(key, nonce=nonce) 用于解密)。

    【讨论】:

    • 谢谢!这个程序应该是一个练习,因为我从来没有接触过编码。这些技巧真的很有帮助!
    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2013-12-17
    • 2020-01-17
    • 1970-01-01
    相关资源
    最近更新 更多