/*keyArray contains a line of cipherkey, and inputArray contains a text that is being encrypted.*/
public static void addRoundKey() {
String keyEle = "";
String inputEle = "";
String result = "";
for(int col=0; col<4; col++) {
for(int row = 0; row<4; row++) {
keyEle = Integer.toHexString(keyArray[row][col] & 0xff);
inputEle = Integer.toHexString(inputArray[row][col] & 0xff);
if(keyEle.equals("0")) {
keyEle = "00";
}
if(inputEle.equals("0")) {
inputEle = "00";
}
BigInteger keyNum = new BigInteger(keyEle,16);
BigInteger inputNum = new BigInteger(inputEle, 16);
result = keyNum.xor(inputNum).toString();
System.out.println("result = " + result);
keyArray[row][col] = Byte.valueOf(result, 16);
//The above line causes Exception in thread "main" java.lang.NumberFormatException: Value out of range. Value:"99" Radix:16`
//keyArray[row][col] = (byte) (Integer.parseInt(result) & 0xff);
}
}
}
I think addRoundKey step takes a column from each of cipher key and text that I am trying to encrypt, and then xor them, right?
So, that's my implementation, I understand why "value out of range" error occurs, it's because byte takes numbers that range from -128 to 127, right?
But I am not so sure how to fix it. I can't change the type of keyArray, which is Byte.
Change line
keyArray[row][col] = Byte.valueOf(result, 16);
to
keyArray[row][col] = (byte) Integer.valueOf(result, 16).intValue();
edit
or even shorter, as correctly stated in Bohemian's answer :
keyArray[row][col] = (byte) Integer.parseInt(result, 16);