2015-04-29 2 views
3

Я пытаюсь реализовать 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 символов.

Я установил дешифровку прямо за шифрованием, поэтому я мог видеть, действительно ли этот алгоритм работает, но это не так, и я не знаю почему. (Я возвращаю переменные в их собственные значения, прежде чем использовать дешифрование).

Ссылка

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); 
    } 
    
+2

В конце документа в приложении C. Есть тестовые векторы в конце статьи. Как насчет того, чтобы вы сначала проверяли, работает ли шифрование, а затем проверяют дешифрование. –

+0

Кажется, все довольно просто, за исключением функций вращения, которые отсутствуют. –

+0

Добавлены функции поворота. Но мои функции вращения работают на двух других шифрах. XTEA и RC5, поэтому я думаю, что они хорошие. – Amphoru

ответ

2

Наконец выяснили. Мой дешифрования алгоритм должен выглядеть следующим образом:

for(int i = T-1; i >= 0; i--) { 
     y = rotateRight(x^y, beta); 
     x = rotateLeft((x^k[i]) - y, alpha); 
    } 

И я случайно поменять ротацию функции в шифрования алгоритма. Это правильная форма:

for(int i = 0; i < T; i++) { 
     x = (rotateRight(x, alpha) + y)^k[i]; 
     y = rotateLeft(y, beta)^x; 
    } 
Смежные вопросы