Python 使用AES-256加密,如使用PyCrypto的OpenSSL

Python 使用AES-256加密,如使用PyCrypto的OpenSSL,python,encryption,cryptography,pycrypto,Python,Encryption,Cryptography,Pycrypto,我正在尝试使用AES-256和带有base64的Python对时间戳进行加密。使用以下命令生成输出的OpenSSL等效项: openssl enc -aes256 -pass pass:'1Lw2*kx18#AvNuij*iRL1nY1UA_#k8$+' -nosalt -base64 <<< "1489355323" 目前输出是不同的,我需要获得与OpenSSL命令相同的输出。知道我做错了什么吗?OpenSSLenc命令使用的密钥和iv由函数从密码派生而来。您将需要重新生成

我正在尝试使用AES-256和带有base64的Python对时间戳进行加密。使用以下命令生成输出的OpenSSL等效项:

openssl enc -aes256 -pass pass:'1Lw2*kx18#AvNuij*iRL1nY1UA_#k8$+' -nosalt -base64 <<< "1489355323"

目前输出是不同的,我需要获得与OpenSSL命令相同的输出。知道我做错了什么吗?

OpenSSL
enc
命令使用的密钥和iv由函数从密码派生而来。您将需要重新生成该函数,以使代码以相同的方式运行

在Python中,它可能看起来像:

from hashlib import md5

# ...

last = ''
bytes = ''

# 32 byte key (256 bits) + 16 byte IV = 48 bytes needed
while len(bytes) < 48:
    last = md5(last + password).digest()
    bytes += last

key = bytes[0:32]
iv = bytes[32:48]

# ...

aes = AES.new(key, AES.MODE_CBC, iv)
ciphertext = aes.encrypt( pad( timestamp ) )

OpenSSL
enc
命令使用的密钥和iv由函数从密码中派生。您将需要重新生成该函数,以使代码以相同的方式运行

在Python中,它可能看起来像:

from hashlib import md5

# ...

last = ''
bytes = ''

# 32 byte key (256 bits) + 16 byte IV = 48 bytes needed
while len(bytes) < 48:
    last = md5(last + password).digest()
    bytes += last

key = bytes[0:32]
iv = bytes[32:48]

# ...

aes = AES.new(key, AES.MODE_CBC, iv)
ciphertext = aes.encrypt( pad( timestamp ) )

你在用什么加密库?pycrypt。我更新了我的代码以包含imports我觉得这是一个密码与密钥的问题,但我不能玩它,因为我现在无法访问PyCrypto文档。也许可以尝试在openssl中使用
-K
-iv
选项,而不是
-pass
,看看是否匹配?不幸的是,openssl命令必须保持原样。我只能更新python代码您使用的加密库是什么?pycrypt。我更新了我的代码以包含imports我觉得这是一个密码与密钥的问题,但我不能玩它,因为我现在无法访问PyCrypto文档。也许可以尝试在openssl中使用
-K
-iv
选项,而不是
-pass
,看看是否匹配?不幸的是,openssl命令必须保持原样。我只能更新python代码+1,还需要注意的是,您可以将
-P
选项添加到
openssl enc
,以查看它为特定命令派生了什么密钥和IV。在python 3.7中,您需要稍微调整这一点<代码>最后一个和
字节
应初始化为
b'
而不是
'
,您可能需要将
+密码
更改为
+密码。编码('utf-8')
。否则,您将得到一个
TypeError:Unicode对象必须在散列之前进行编码
Awesome!另外,您还可以将
-P
选项添加到
openssl enc
中,以查看它为特定命令派生了什么密钥和IV。在python 3.7中,您需要稍微调整这一点<代码>最后一个和
字节
应初始化为
b'
而不是
'
,您可能需要将
+密码
更改为
+密码。编码('utf-8')
。否则,您将得到一个
TypeError:Unicode对象必须在散列之前进行编码
Awesome!你让我很开心
timestamp = "1489355323\n"