Я пытаюсь реализовать Speck 64-битный блок/128-битный ключ шифр в java. Я застрял в алгоритме шифрования/дешифрования. Мой алгоритм дешифрования не может правильно расшифровать текст шифрования.Алгоритм Speck не работает
Моя реализация:
Шифрование:
int m = 4; //key words int T = 27; //rounds int alpha = 8; //alpha int beta = 3; //beta int x,y; int[] l = new int[2*T], k = new int[T]; /* *************** KEY EXTENSTION ***************** */ for(int i = 0; i < T-1; i++) { l[i+m-1] = (k[i] + rotateRight(l[i], alpha))^i; k[i+1] = rotateLeft(k[i], beta)^l[i+m-1]; //System.out.println(k[i]); } /* *************** ENCRYPTION ********************* */ for(int i = 0; i < T; i++) { x = (rotateLeft(x, alpha) + y)^k[i]; y = rotateRight(y, beta)^x; //System.out.println(y); }
дешифрование:
/* *************** KEY EXTENSTION ***************** */ for(int i = 0; i < T-1; i++) { l[i+m-1] = (k[i] + rotateRight(l[i], alpha))^i; k[i+1] = rotateLeft(k[i], beta)^l[i+m-1]; //System.out.println(k[i]); } /* *************** DECRYPTION ********************* */ for(int i = T-1; i >= 0; i--) { y = rotateRight(y, beta)^x; x = (rotateLeft(x, alpha) - y)^k[i]; //System.out.println(y); }
х и лет инициализируются функцией бокса (< - немного странно):
x = boxing(plainText, 0, 1);
y = boxing(plainText, 1, 2);
public static int boxing(int[] content, int i, int count) {
int temp[] = new int[count];
temp[i] |= content[i*4] & 0xff;
temp[i] = temp[i] << 8 | content[i*4+1] & 0xff;
temp[i] = temp[i] << 8 | content[i*4+2] & 0xff;
temp[i] = temp[i] << 8 | content[i*4+3] & 0xff;
//System.out.println(temp[from]);
return temp[i];
}
Обратите внимание, что содержание является целочисленный массив из 8 символов.
Я установил дешифровку прямо за шифрованием, поэтому я мог видеть, действительно ли этот алгоритм работает, но это не так, и я не знаю почему. (Я возвращаю переменные в их собственные значения, прежде чем использовать дешифрование).
Ссылка
- Саймон и Спекли семейства облегченных блоковых шифров https://eprint.iacr.org/2013/404
- реализация Спек (не мои)
https://github.com/timw/bc-java/blob/feature/simon-speck/core/src/main/java/org/bouncycastle/crypto/engines/SpeckEngine.java
EDIT:
Поворот функции:
public static int rotateLeft(int number, int amount) { return number << amount | number >>> (32-amount); } public static int rotateRight(int number, int amount) { return number >>> amount | number << (32-amount); }
В конце документа в приложении C. Есть тестовые векторы в конце статьи. Как насчет того, чтобы вы сначала проверяли, работает ли шифрование, а затем проверяют дешифрование. –
Кажется, все довольно просто, за исключением функций вращения, которые отсутствуют. –
Добавлены функции поворота. Но мои функции вращения работают на двух других шифрах. XTEA и RC5, поэтому я думаю, что они хорошие. – Amphoru