PHP openssl_decrypt不';无法获得与在线工具相同的结果
使用在线加密/解密工具,使用DES-ECB,我可以使用8位十六进制密钥加密8位十六进制数,得到8位十六进制结果。我可以用相同的密钥解密8位数的结果,得到我加密的原始数据 但是,我无法使用PHP在本地复制这一点。我在网上得到的加密结果是实际生成的16位数字中的前8位。没问题。。。但是,当我尝试使用PHP在本地解密时,我需要全部16位数字才能获得原始数据 我怎样才能像在线工具一样,仅用8位数字进行解密,仍然获得原始数据 在线结果: 加密: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
$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的答案。实际上,我并不是为了安全而使用它。由于保密协议,我无法进一步解释,但你的回答填补了我的空白,让我完成了任务。非常感谢!