openssl AES-CFB-128命令行与此python代码段等效的是什么?

openssl AES-CFB-128命令行与此python代码段等效的是什么?,python,openssl,cryptography,aes,pycryptodome,Python,Openssl,Cryptography,Aes,Pycryptodome,我有一个python代码片段,它一直对我有用: 从Crypto.Cipher导入AES#pip安装pycryptodome 导入操作系统 def aes_cfb(数据、键、iv): ctx=AES.new(键,AES.MODE\U CFB,iv=iv,段大小=128) 解密=ctx.decrypt(数据) 返回解密 filesize=os.stat('./config_enc.bin').st\u size 打开('./config_enc.bin','rb')作为rf: data=rf.rea

我有一个python代码片段,它一直对我有用:

从Crypto.Cipher导入AES#pip安装pycryptodome
导入操作系统
def aes_cfb(数据、键、iv):
ctx=AES.new(键,AES.MODE\U CFB,iv=iv,段大小=128)
解密=ctx.decrypt(数据)
返回解密
filesize=os.stat('./config_enc.bin').st\u size
打开('./config_enc.bin','rb')作为rf:
data=rf.read(文件大小)
解密=aes_cfb(数据,b'3398699acebda0da',b'b39a46f5cc4f0d45')
将open('./config.xml',wb')作为wf:
写入(解密)
因此,我决定使用
openssl.exe
作为测试的命令行工具(因为它比python代码更实用),但它从未对我起作用

以下是我在2021年2月16日使用OpenSSL 1.1.1j版时使用的命令行工具:

openssl.exe enc-d-aes-128-cfb-in-config_enc.bin-out-config.xml-K 3398699acebda0da-iv b39a46f5cc4f0d45

那么,我做错了什么?或者OpenSSL根本不兼容!如果是这样的话,我应该把它放下,换成别的东西


加密文件:(1周后过期)。

首先,对于OpenSSL命令行,密钥(
-K
选项)和IV(
-IV
选项)必须提供十六进制值。如果我们提供的值较短,则会用带有警告的
0
s填充

hex string is too short, padding with zero bytes to length
您提供16个十六进制数,但AES-128需要32个。让我们使用扩展键和IV运行

openssl enc -e -aes-128-cfb \
     -in plain.txt \
     -out encrypted.txt \
     -K 3398699acebda0dab39a46f5cc4f0d45 \
     -iv b39a46f5cc4f0d45b39a46f5cc4f0d45`
使用纯文本
12345678
则输出
�4PcGp�作为加密值

现在使用
str(bytearray.fromhex('HEXVALUE'))
,我们可以将十六进制字符串转换为字节,并在代码中使用它们作为

从Crypto.Cipher导入AES#pip安装pycryptodome
导入操作系统
def aes_cfb(数据、键、iv):
ctx=AES.new(键,AES.MODE\U CFB,iv=iv,段大小=128)
解密=ctx.decrypt(数据)
返回解密
filesize=os.stat('./encrypted.txt').st\u size
以open('./encrypted.txt',rb')作为rf:
data=rf.read(文件大小)
解密=aes_cfb(数据,
str(由HEX('3398699ACEDA0DAB39A46F5CC4F0D45')的数组组成,
str(bytearray.fromhex('b39a46f5cc4f0d45b39a46f5cc4f0d45'))
)
将open('./config.xml',wb')作为wf:
写入(解密)
现在,它们与安全密钥大小兼容


您声称此密钥是byte
3398699acebda0da
,但它是十六进制的,即仅包含十六进制字符。如果您使用此密钥,则意味着您的有效密钥空间是64位。按照今天的标准,这是不安全的

假设这只是为了测试,那么您可以通过一些命令将其转换为hex,如中所示


或者在Python中使用
b'3398699acebda0da'.hex()
将字节转换为十六进制并作为十六进制提供给OpenSSL。

您可以为Python编写一个最小的、可验证的完整代码吗?
AES_KEY=str(bytearray.fromhex('3398699acebda0da'))
密钥必须从十六进制转换为bytes@kelalakapython脚本已经可以工作了(我已经将其作为字节传递,请注意它前面的
b
),但是
openssl
工具在这里不起作用。这就是问题所在,存在不一致性!而且您使用的密钥非常短。@kelalaka您是对的,
key
iv
必须为
openssl
转换为十六进制,我完全忽略了这一点,并且认为
openssl
不兼容,我已经这样做了尝试过:
openssl enc-d-aes-128-cfb-in-config_enc.bin-out-config.xml-K 33333 938363939616365626461306461-iv 623339613436663563633466306435
,它终于成功了。非常感谢。