我有一个制作RC4 Sbox的功能。
public void initRC4(byte[] Key){
byte tmp = 0;
for(int i = 0; i< 256;i++){
S[i] = (byte) (0xFF & i);
}
for(int j = 0 , i = 0; i< 256; i++){
j = ((j + S[i] + Key[i % Key.length] ) % 256) ;
System.out.println(Integer.toBinaryString(j) +" "+ j);
tmp = S[j];
S[j] = S[i];
S[i] = tmp;
}
}
所以我对此函数的输入是getByte[]
这个String
“这是第一行”。但是我得到了一个异常java.lang.ArrayIndexOutOfBoundsException: -62
。我的最后一行是11111111111111111111111111000010 -62
。我做错了什么?
答案 0 :(得分:0)
S[i]
是一个字节,其值范围为-128
到+127
,即它可以是负数。
这意味着表达式j + S[i] + Key[i % Key.length]
可能为负数,负数% 256
也为负数,因此j
可能最终为负数。
这会导致S[j]
抛出ArrayIndexOutOfBoundsException
。
最简单的解决方案是将% 256
替换为& 0xFF
。