仅使用OpenSSL解密用Python加密的文件

时间:2018-05-19 21:22:00

标签: python openssl cryptography aes rsa

我有一个用Python加密的文件和pycryptodome这样的文件:

from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes
from Crypto.Cipher import AES, PKCS1_OAEP

key = RSA.generate(2048)
secret_key = key.exportKey(passphrase='letmein', pkcs=8, protection='scryptAndAES128-CBC')
public_key = key.publickey().exportKey()

rsa_key = RSA.importKey(public_key)
session_key = get_random_bytes(16)
cipher_rsa = PKCS1_OAEP.new(rsa_key)
cipher_aes = AES.new(session_key, AES.MODE_EAX)
ciphertext, tag = cipher_aes.encrypt_and_digest(data)

dst.write(cipher_rsa.encrypt(session_key))
dst.write(cipher_aes.nonce)
dst.write(tag)
dst.write(ciphertext)

我可以像这样解码它:

rsa_key = RSA.importKey(secret_key, 'letmein')

enc_session_key, nonce, tag, ciphertext = [
    src.read(x) for x in (rsa_key.size_in_bytes(), 16, 16, -1)
]

cipher_rsa = PKCS1_OAEP.new(rsa_key)
session_key = cipher_rsa.decrypt(enc_session_key)
cipher_aes = AES.new(session_key, AES.MODE_EAX, nonce)

decoded = cipher_aes.decrypt_and_verify(ciphertext, tag)

有没有办法使用openssl命令行解密文件?或者我应该如何修改代码才能实现?

1 个答案:

答案 0 :(得分:1)

您可以对64个单独的组件进行编码,然后使用分隔符将它们拆分。命令行主要是基于文本的,因此在例如编程中更容易编程。击。

不直接支持EAX模式,因此尝试CBC模式会使其更容易。 OpenSSL命令行似乎现在不支持任何AEAD密码 ,因此您将失去可能提供的真实性。

最后,OAEP和密码的组合似乎不受支持,因此您可能必须处理二进制结果并将其转换为对称密码,例如:十六进制。