lizhichao/sm

SM4 ECB加解密有问题,加密以后,再解密出来的,最后一个字符是错误的。

longren610 opened this issue · 3 comments

用sm4示例中的代码做加密,再用示例中的代码去解密,最后一两个字符有问题,始终无法解密出正确值

use OneSm\Sm4;
require __DIR__ . '/vendor/autoload.php';

$data = '阿斯顿发到付eeee';
$str_len = strlen($data);

// md5 签名
$sign = md5($data);

// 加密key必须为16位
$key = hex2bin(md5(1));
$sm4 = new Sm4($key);

// ECB加密
$d = $sm4->enDataEcb($data);
// 加密后的长度和原数据长度一致

// ECB解密
$d = $sm4->deDataEcb($d);
// 解密后和原数据相等
var_dump($d);

解密结果:
1111

数据需要对齐 ,必须为16的倍数,不够的你可以补一些自定义的字符在后面

$data .= str_repeat(' ',16 - strlen($data)%16);

数据需要对齐 ,必须为16的倍数,不够的你可以补一些自定义的字符在后面

$data .= str_repeat(' ',16 - strlen($data)%16);

感谢回复。经修改确dd方法,能正常加密解密了。不过要跟java互通,还存在问题,两边的加密结果不一致。请问下有优化方法么?能跟java互通的?

数据需要对齐 ,必须为16的倍数,不够的你可以补一些自定义的字符在后面

$data .= str_repeat(' ',16 - strlen($data)%16);

感谢回复。经修改确dd方法,能正常加密解密了。不过要跟java互通,还存在问题,两边的加密结果不一致。请问下有优化方法么?能跟java互通的?

检测参数是不是一直的 ,结果应该是一样的吧?java我没有测试过。这个和OpenSSL是一直的