Question

/*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.

Was it helpful?

Solution

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);

OTHER TIPS

You are getting an error parsing "99" as a byte using base 16, which may be paraphrased as:

byte b = Byte.valueOf("99", 16);

because byte is signed, with valid range -128 to 127, but you are

First parse it as an Integer, using Integer.parseInt(), then convert it to a signed byte, eg:

keyArray[row][col] = (byte)Integer.parseInt(result, 16);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top