PHP加解密函数重复加密同值结果不一致问题排查与修复求助
问题成因
加密结果不稳定的核心原因是**str_shuffle('LPTKEZG')[0]**这行代码:
str_shuffle()函数会随机打乱字符串的字符顺序,每次调用都会生成不同的排列结果- 每次加密时,这里会随机选取一个字符追加到结果中,导致同一输入的最终加密字符串每次都不一样
修复方案
既然版本标识需要固定(而非随机),直接将随机生成的部分替换为固定字符即可,比如选择原字符集中的L,或者根据需求指定任意固定字符。这样无需修改解密逻辑,就能保证同一输入的加密结果完全一致。
修改后的加密函数
public function encrypt($string) { $i = $string; $keychars = 'AISXD5H2FIWB81KE76JY93V4ORLAMT0QDUNG'; $divider = 19; $biasDivider = 14; $noise = 53; if ($i < 0) { throw new Exception('Expected positive integer'); } $i = $i + $noise; // add noise to a number $bias = $i % $biasDivider; $res = ''; while ($i > 0) { $div = $i % $divider; $i = intdiv($i, $divider); $res .= $keychars[$div + $bias]; } // 将随机版本字符替换为固定值,这里选用原字符集中的'L' $res .= 'L'; $res .= $keychars[$bias]; // Encoded bias return $res; }
验证说明
修改后,同一数值多次调用encrypt()会得到完全相同的结果,原有的decrypt()函数无需改动——因为解密时会截取掉最后两位字符(固定版本字符+bias字符),逻辑完全兼容。
内容的提问来源于stack exchange,提问作者user2678018
相关产品推荐
相关产品推荐

