Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
yiiing opened this issue Sep 18, 2021 · 9 comments
Open

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

yiiing opened this issue Sep 18, 2021 · 9 comments

Comments

@yiiing
Copy link

yiiing commented Sep 18, 2021

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

@lizhichao
Copy link
Owner

给个例子看看

@echohdd
Copy link

echohdd commented Oct 15, 2021

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

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

@lizhichao
Copy link
Owner

lizhichao commented Oct 15, 2021

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

@lpilp
Copy link

lpilp commented Dec 1, 2021

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

@lizhichao
Copy link
Owner

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

@lpilp
Copy link

lpilp commented Dec 17, 2021

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

@lizhichao
Copy link
Owner

哦 对的 nice!

@SuKerd
Copy link

SuKerd commented Jan 18, 2022

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

@lpilp
Copy link

lpilp commented Jan 21, 2022

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants