在Python中实现OpenSSL AES加密

在Python中实现OpenSSL AES加密,python,openssl,aes,pycrypto,m2crypto,Python,Openssl,Aes,Pycrypto,M2crypto,我正在尝试用Python实现以下内容: openssl enc-e-aes-256-cbc-base64-k“秘密密码短语”-in plaintext.txt-out ciphertext.txt openssl enc-d-aes-256-cbc-base64-k“秘密密码短语”-in ciphertext.txt-out verification.txt 我尝试了几个不同的模块,PyCrypto、M2Crypto等,但似乎无法获得将密码更改为正确大小的密钥和正确编码的正确组合。我发现它基本上

我正在尝试用Python实现以下内容: openssl enc-e-aes-256-cbc-base64-k“秘密密码短语”-in plaintext.txt-out ciphertext.txt

openssl enc-d-aes-256-cbc-base64-k“秘密密码短语”-in ciphertext.txt-out verification.txt


我尝试了几个不同的模块,PyCrypto、M2Crypto等,但似乎无法获得将密码更改为正确大小的密钥和正确编码的正确组合。我发现它基本上是在命令行上运行OpenSSL的,我宁愿避免这种情况。

base64编码和解码可以通过标准的
base64
模块轻松处理

PyCrypto和M2Crypto都支持CBC模式下的AES-256解密和加密

唯一的非标准(也是最困难的)部分是从密码派生IV和密钥。OpenSSL通过它自己的
EVP\u BytesToKey
函数实现了这一点,如下所述

Python的等价物是:

def EVP_BytesToKey(password, salt, key_len, iv_len):
    """
    Derive the key and the IV from the given password and salt.
    """
    from hashlib import md5
    dtot =  md5(password + salt).digest()
    d = [ dtot ]
    while len(dtot)<(iv_len+key_len):
        d.append( md5(d[-1] + password + salt).digest() )
        dtot += d[-1]
    return dtot[:key_len], dtot[key_len:key_len+iv_len]
def EVP_BytesToKey(密码、密码、密码、密码、密码):
"""
从给定的密码和salt派生密钥和IV。
"""
从hashlib导入md5
dtot=md5(密码+salt).digest()
d=[dtot]

len(dtot)我也有同样的问题,你是否最终使用下面的答案作为解决方案?(这还没有被接受为答案,所以我想知道你是否用另一种方式解决了这个问题)如果我没记错的话,我认为这也不管用。我想我试图解决的问题是在Python和JS中使用相同的加密算法,所以我稍微转了转。相反,我使用了密码学和Fernet实现。然后在JS中类似这样的内容:几乎同意。
openssl enc
格式是8字节的文字“Salted_u_;”,8字节的salt值,然后是密文,所有这些都以64'为单位。将encrypt#5和#6加上该常数,并将decrypt#2更改为[8:16],将#4更改为[16:]。