PHP openssl_decrypt不';无法获得与在线工具相同的结果

PHP openssl_decrypt不';无法获得与在线工具相同的结果,php,encryption,openssl,des,ecb,Php,Encryption,Openssl,Des,Ecb,使用在线加密/解密工具,使用DES-ECB,我可以使用8位十六进制密钥加密8位十六进制数,得到8位十六进制结果。我可以用相同的密钥解密8位数的结果,得到我加密的原始数据 但是,我无法使用PHP在本地复制这一点。我在网上得到的加密结果是实际生成的16位数字中的前8位。没问题。。。但是,当我尝试使用PHP在本地解密时,我需要全部16位数字才能获得原始数据 我怎样才能像在线工具一样,仅用8位数字进行解密,仍然获得原始数据 在线结果: 加密: $data = '03 67 A6 7F C2 00 0A

使用在线加密/解密工具,使用DES-ECB,我可以使用8位十六进制密钥加密8位十六进制数,得到8位十六进制结果。我可以用相同的密钥解密8位数的结果,得到我加密的原始数据

但是,我无法使用PHP在本地复制这一点。我在网上得到的加密结果是实际生成的16位数字中的前8位。没问题。。。但是,当我尝试使用PHP在本地解密时,我需要全部16位数字才能获得原始数据

我怎样才能像在线工具一样,仅用8位数字进行解密,仍然获得原始数据

在线结果:

加密:

$data = '03 67 A6 7F C2 00 0A DB';
$key = '00 F2 83 CD BA 41 6F FF';
$result = '8b be 0f 3b ae 92 56 07';
核实:

解密:

$data = '8b be 0f 3b ae 92 56 07';
$key = '00 F2 83 CD BA 41 6F FF';
$result = '03 67 A6 7F C2 00 0A DB';
核实:

本地PHP测试:

$enc = openssl_encrypt( hex2bin('0367A67FC2000ADB'), 'DES-ECB', hex2bin('00F283CDBA416FFF'), 1);
bin2hex($enc)
导致
8bbe0f3bae9256071da486ee680f8449

如果我只解密前8个十六进制数字,我不会得到与在线工具相同的结果:

$dec = openssl_decrypt( hex2bin('8bbe0f3bae925607'), 'DES-ECB', hex2bin('00F283CDBA416FFF'), 1);
bin2hex($dec)
结果为null(如果不转换为十六进制,则为false)

但如果我输入完整的16位十六进制作为加密数据,我会得到正确的结果:

$dec = openssl_decrypt( hex2bin('8bbe0f3bae9256071da486ee680f8449'), 'DES-ECB', hex2bin('00F283CDBA416FFF'), 1);
bin2hex($dec)
导致
0367A67FC2000ADB


这对我来说很有意义。。。但是我需要能够从8位十六进制中得到这个结果,就像在线工具一样。要做到这一点,我需要做些什么?

造成差异的原因是。分组密码仅允许加密长度为块大小整数倍(DES为8字节)的数据。填充确保通过根据特定逻辑添加数据来满足此条件

有不同类型的填充由,使用

PKCS7填充将始终向明文添加数据,即使明文的长度已经是blocksize的整数倍。在这种情况下,将添加一个完整的块()。因此,对于长度为1块(8字节)的明文,使用openssl_encrypt生成的已发布密文的长度为2块(16字节)

与PKCS7填充不同,如果纯文本的长度已经是blocksize的倍数,那么在线工具使用的零填充变量不会添加任何数据。因此,对于长度为1块(8字节)的明文,使用联机工具生成的已发布密文的长度为1块(8字节)

openssl\u encrypt
/
openssl\u decrypt
不支持零填充。要使
openssl\u encrypt
的密文与在线工具的密文匹配,必须禁用PKCS7填充,并且必须手动实现在线工具使用的零填充变量。禁用填充是通过标志
OPENSSL\u ZERO\u padding
完成的,该标志必须使用第四个参数设置。注意:该标志的名称具有误导性:该标志不启用零填充,但仅禁用PKCS7填充。这意味着在线工具的零填充变量仍然必须手动实现。此外:在当前代码中,值
1
在第四个参数中传递,该参数对应于标志
OPENSSL\u RAW\u DATA
。要设置这两个标志,值
1
因此必须替换为
OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING

对于长度已对应于块大小整数倍的明文,联机工具使用的禁用PKCS7填充和零填充变量都不会添加任何附加数据,因此密文匹配。在这种情况下,不需要手动实现在线工具使用的零填充变量


关于安全性的最后一点:是不安全的。今天的标准是。欧洲央行也不安全。更安全的是,例如CBC或GCM。

有点混乱,
56
是一个字节!所以你需要全部使用,这是怎么工作的?我怎样才能复制这个?原因是
openssl\u encrypt/decrypt
使用在线工具PKCS7 padding进行加密/解密。对于完整的解决方案,必须禁用PKCS7填充,并且必须手动实现零填充。但是,只要明文是blocksize的整数倍(DES为8字节),就足以禁用填充。为此,必须将第4个参数的值从
1
更改为
OPENSSL\u RAW\u DATA\124; OPENSSL\u ZERO\u PADDING
。注意:
OPENSSL\u零填充
禁用填充,但不启用零填充。@Topaco谢谢!这很有帮助。我更新了以下内容,它工作得很好:
$enc=openssl_encrypt(hex2bin('0367A67FC2000ADB'),'DES-ECB',hex2bin('00F283CDBA416FFF'),openssl_原始数据| openssl_无填充)
$dec=openssl_decrypt(hex2bin('8bbe0f3bae925607'),'DES-ECB',hex2bin('00F283CDBA416FFF'),openssl_原始数据| openssl_无填充)如果你写下你的评论作为答案,我会接受它作为@Topaco的答案。实际上,我并不是为了安全而使用它。由于保密协议,我无法进一步解释,但你的回答填补了我的空白,让我完成了任务。非常感谢!