openssl AES-CFB-128命令行与此python代码段等效的是什么?
我有一个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
从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:
写入(解密)
现在,它们与安全密钥大小兼容
您声称此密钥是byte3398699acebda0da
,但它是十六进制的,即仅包含十六进制字符。如果您使用此密钥,则意味着您的有效密钥空间是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
,它终于成功了。非常感谢。