如何在 python 中导出加密密钥?
How to export a Crypto key in python?
我想加密文件以便安全存储,但问题是,我不知道如何存储之后解密文件的密钥。
代码:
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))
您加密数据的方式毫无意义。非对称加密只能加密少量的固定数据。切勿将 RSA-OAEP 等非对称加密用于对称密钥以外的任何其他内容,并使用该对称密钥来加密实际数据。对于对称加密,请使用适当的 AEAD 模式,例如 AES-GCM 或 ChaCha20-Poly1305。这叫做hybrid encryption.
您的代码的其他问题:
- 1024 位 RSA 密钥不足以确保安全:2048 位是最低要求,您应该准备好放弃 RSA,因为它的密钥大小无法很好地扩展。 (随意使用 1024 位密钥进行测试和学习,只是不要在生产中使用低于 2048 位的 RSA。)
- 加密是二进制格式,但您将行连接起来就好像它们是文本一样。文本或二进制:选择一个。最好使用众所周知的格式,例如 ASN.1(复杂但支持良好)用于二进制数据或 JSON 用于文本。如果您需要将二进制数据编码为文本格式,请使用 Base64。
如果这适用于现实世界,请废弃并使用 NaCl or libsodium. In Python, use a Python wrapper such as libnacl, PyNaCl, pysodium or csodium. Use a public-key box。每个 Python 包装器的 Python API 略有不同,但都包含一种导出密钥的方法。
如果这是一个学习练习,请阅读混合加密。查看 libsodium 内部以了解如何正确执行此操作。密钥导入和导出是使用 import_key
and export_key
. Symmetric encryption starts with Crypto.Cipher.AES.new(key, Crypto.Cipher.AES.MODE_GCM)
or 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)
用于解密)。
我查看了您的代码,但 RSA 目前存在许多安全问题,因此请考虑另一种加密类型,请仔细阅读并遵循。密码学和密码分析方案中有两种对称和非对称加密,您可以申请在各方或实体等之间共享安全加密解密密钥派生密钥。例如 AES Chaha20Poly1305 AESGCM 但这取决于您要应用哪种加密方案。它是敏感的临界点。请看看您肯定会找到答案,并检查并建议您查看其他对称加密,与 RSA 相比,它们具有良好的安全性。 http://legrandin.github.io/pycryptodome/Doc/3.3.1/Crypto.Cipher-module.html
我想加密文件以便安全存储,但问题是,我不知道如何存储之后解密文件的密钥。
代码:
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))
您加密数据的方式毫无意义。非对称加密只能加密少量的固定数据。切勿将 RSA-OAEP 等非对称加密用于对称密钥以外的任何其他内容,并使用该对称密钥来加密实际数据。对于对称加密,请使用适当的 AEAD 模式,例如 AES-GCM 或 ChaCha20-Poly1305。这叫做hybrid encryption.
您的代码的其他问题:
- 1024 位 RSA 密钥不足以确保安全:2048 位是最低要求,您应该准备好放弃 RSA,因为它的密钥大小无法很好地扩展。 (随意使用 1024 位密钥进行测试和学习,只是不要在生产中使用低于 2048 位的 RSA。)
- 加密是二进制格式,但您将行连接起来就好像它们是文本一样。文本或二进制:选择一个。最好使用众所周知的格式,例如 ASN.1(复杂但支持良好)用于二进制数据或 JSON 用于文本。如果您需要将二进制数据编码为文本格式,请使用 Base64。
如果这适用于现实世界,请废弃并使用 NaCl or libsodium. In Python, use a Python wrapper such as libnacl, PyNaCl, pysodium or csodium. Use a public-key box。每个 Python 包装器的 Python API 略有不同,但都包含一种导出密钥的方法。
如果这是一个学习练习,请阅读混合加密。查看 libsodium 内部以了解如何正确执行此操作。密钥导入和导出是使用 import_key
and export_key
. Symmetric encryption starts with Crypto.Cipher.AES.new(key, Crypto.Cipher.AES.MODE_GCM)
or 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)
用于解密)。
我查看了您的代码,但 RSA 目前存在许多安全问题,因此请考虑另一种加密类型,请仔细阅读并遵循。密码学和密码分析方案中有两种对称和非对称加密,您可以申请在各方或实体等之间共享安全加密解密密钥派生密钥。例如 AES Chaha20Poly1305 AESGCM 但这取决于您要应用哪种加密方案。它是敏感的临界点。请看看您肯定会找到答案,并检查并建议您查看其他对称加密,与 RSA 相比,它们具有良好的安全性。 http://legrandin.github.io/pycryptodome/Doc/3.3.1/Crypto.Cipher-module.html