SM4 ECB加解密有问题,加密以后,再解密出来的,最后一个字符是错误的。
longren610 opened this issue · 3 comments
longren610 commented
用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);
lizhichao commented
数据需要对齐 ,必须为16的倍数,不够的你可以补一些自定义的字符在后面
$data .= str_repeat(' ',16 - strlen($data)%16);
longren610 commented
数据需要对齐 ,必须为16的倍数,不够的你可以补一些自定义的字符在后面
$data .= str_repeat(' ',16 - strlen($data)%16);
感谢回复。经修改确dd方法,能正常加密解密了。不过要跟java互通,还存在问题,两边的加密结果不一致。请问下有优化方法么?能跟java互通的?
lizhichao commented
数据需要对齐 ,必须为16的倍数,不够的你可以补一些自定义的字符在后面
$data .= str_repeat(' ',16 - strlen($data)%16);
感谢回复。经修改确dd方法,能正常加密解密了。不过要跟java互通,还存在问题,两边的加密结果不一致。请问下有优化方法么?能跟java互通的?
检测参数是不是一直的 ,结果应该是一样的吧?java我没有测试过。这个和OpenSSL是一直的