public IDEA(BigInteger keyInteger, BigInteger iv) { this.keyInteger = keyInteger; this.iv = iv; BigInteger[] keyArray = Helper.extractValues(keyInteger, 8, 16); encKeys = getEncryptionKeys(keyArray); decKeys = getDecryptionKeys(encKeys); }
public BigInteger[][] getEncryptionKeys(BigInteger[] keyArray) { // String keyString BigInteger[] outputArray = new BigInteger[52]; // BigInteger[] keyArray = Helper.stringToBigIntegerArray(keyString); BigInteger key = Helper.bigIntegerArraySum(keyArray, 8); BigInteger[] shortKeyArray = Helper.extractValues(key, 16, 8); // get keys int i = 0; while (i != 52) { for (int j = 0; j < shortKeyArray.length; j++) { BigInteger tmp = shortKeyArray[j]; outputArray[i++] = tmp; if (i == 52) { break; } } if (i != 52) { key = Helper.shift(key, 16, 25); shortKeyArray = Helper.extractValues(key, 16, 8); } } // get as 2d array BigInteger[][] nicerArray = new BigInteger[9][6]; int counter = 0; for (int zeile = 0; zeile < nicerArray.length; zeile++) { for (int spalte = 0; spalte < nicerArray[zeile].length; spalte++) { nicerArray[zeile][spalte] = outputArray[counter++]; if (counter == 52) { return nicerArray; } } } return nicerArray; }
public BigInteger idea(BigInteger input, boolean isEncryption) { // make 4*16bit block array BigInteger[] messagePart = Helper.extractValues(input, 16, 4); BigInteger[] key = null; for (int round = 0; round < 9; round++) { // keys based on encryption or decryption if (isEncryption) { key = encKeys[round]; } else { key = decKeys[round]; } // encryption/decryption messagePart = feistelNetwork(messagePart, key, round); } // from 4*16bit block array to one biginteger BigInteger output = Helper.bigIntegerArraySum(messagePart, 16); return output; }