sm icon indicating copy to clipboard operation
sm copied to clipboard

加密解密后不一致 字符丢失!

Open yiiing opened this issue 3 years ago • 11 comments

加密字符有空格的 中文等字符 解密后有字符丢失现象

yiiing avatar Sep 18 '21 06:09 yiiing

给个例子看看

lizhichao avatar Sep 18 '21 09:09 lizhichao

解密后确实有字符丢失现象

你给的例子,不用str_repeat,直接加密字符串,解密出来少了字符,如下图: 1

echohdd avatar Oct 15 '21 08:10 echohdd

sm4算法特征就要求数据必须要16的倍数,不足的自己补吧,key iv 都是16个字节

lizhichao avatar Oct 15 '21 09:10 lizhichao

在加密前补齐下,解密后再去掉补齐就行, //加密前补齐 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 avatar Dec 01 '21 05:12 lpilp

在加密前补齐下,解密后再去掉补齐就行, //加密前补齐 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);

lizhichao avatar Dec 16 '21 09:12 lizhichao

如果正好是16的倍数的话是直接再补16个 \x10的, 这样补齐的方式加密出来的的 与openssl_encrypt函数加密出来是一样的,解密也没有问题, openssl_encrypt函数,只补齐cbc, ecb ,其他的都不补齐

lpilp avatar Dec 17 '21 06:12 lpilp

哦 对的 nice!

lizhichao avatar Dec 17 '21 10:12 lizhichao

在加密前补齐下,解密后再去掉补齐就行, //加密前补齐 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 avatar Jan 18 '22 01:01 SuKerd

@SuKerd , $n = $16- strlen($data) % 16; ; $data = $data . str_repeat(chr($n), $n); 差一个就补1个\x01, 差10个就补10个\x0A, 类推,刚好整除就补16个 \x10

lpilp avatar Jan 21 '22 02:01 lpilp