fix(RC4): 修复 initSBox 中运算符优先级错误导致加密结果偏差

原代码:`j = (j + sbox[i] + (key[i % key.length]) & 0xFF) % SBOX_LENGTH`

由于 Java 中 `&` 的优先级低于 `+`,实际计算等同于:
`j = ((j + sbox[i] + key[i % key.length]) & 0xFF) % 256`

而标准 RC4 算法要求先将 byte 转为无符号整数再参与加法:
`j = (j + sbox[i] + (key[i % key.length] & 0xFF)) % SBOX_LENGTH`

当 key 中含有非 ASCII 字符(如中文,UTF-8 编码后可能产生负 byte 值)时,
原实现的 sbox 初始化结果与标准 RC4 不一致,导致加密结果错误。
This commit is contained in:
Busyliu
2026-03-02 05:43:09 +00:00
committed by Gitee
parent b4f1787df5
commit 1ac564c246

View File

@@ -246,7 +246,8 @@ public class RC4 implements Serializable {
}
for (int i = 0; i < SBOX_LENGTH; i++) {
j = (j + sbox[i] + (key[i % key.length]) & 0xFF) % SBOX_LENGTH;
// fix: 运算符优先级修正,& 0xFF 应先与 key 字节值进行位与运算,再参与加法,避免有符号 byte 导致计算偏差
j = (j + sbox[i] + (key[i % key.length] & 0xFF)) % SBOX_LENGTH;
swap(i, j, sbox);
}
return sbox;