sm
sm copied to clipboard
加密解密后不一致 字符丢失!
加密字符有空格的 中文等字符 解密后有字符丢失现象
给个例子看看
解密后确实有字符丢失现象
你给的例子,不用str_repeat,直接加密字符串,解密出来少了字符,如下图:
sm4算法特征就要求数据必须要16的倍数,不足的自己补吧,key iv 都是16个字节
在加密前补齐下,解密后再去掉补齐就行, //加密前补齐 function mystr_pad($data,$len = 16){ $n = $len - strlen($data) % $len; $data = $data . str_repeat(chr($n), $n); return $data; } // 解密后去掉补齐 function mystr_unpad($data){ $n = ord(substr($data,-1)); return substr($data, 0, -$n); }
在加密前补齐下,解密后再去掉补齐就行, //加密前补齐 function mystr_pad($data,$len = 16){ $n = $len - strlen($data) % $len; $data = $data . str_repeat(chr($n), $n); return $data; } // 解密后去掉补齐 function mystr_unpad($data){ $n = ord(substr($data,-1)); return substr($data, 0, -$n); }
@lpilp
// 如果正好是16的倍数 这里就有问题
$n = ord(substr($data,-1));
return substr($data, 0, -$n);
如果正好是16的倍数的话是直接再补16个 \x10的, 这样补齐的方式加密出来的的 与openssl_encrypt函数加密出来是一样的,解密也没有问题, openssl_encrypt函数,只补齐cbc, ecb ,其他的都不补齐
哦 对的 nice!
在加密前补齐下,解密后再去掉补齐就行, //加密前补齐 function mystr_pad($data,$len = 16){ $n = $len - strlen($data) % $len; $data = $data . str_repeat(chr($n), $n); return $data; } // 解密后去掉补齐 function mystr_unpad($data){ $n = ord(substr($data,-1)); return substr($data, 0, -$n); }
@lpilp
// 如果正好是16的倍数 这里就有问题 $n = ord(substr($data,-1)); return substr($data, 0, -$n);
您这填充模式是什么?PKCS7?PKCS5?Zero?
@SuKerd , $n = $16- strlen($data) % 16; ; $data = $data . str_repeat(chr($n), $n); 差一个就补1个\x01, 差10个就补10个\x0A, 类推,刚好整除就补16个 \x10