Основной алгоритм шифрования в Java не расшифровывает - PullRequest
0 голосов
/ 08 марта 2019

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

Вот моя функция шифрования:

//Encrypt 64bit/8byte buffer with 128bit/16byte key
public byte[] encrypt(int[] data, int[] key) { 
    int x = data[0]; 
    int y = data[1]; 
    ByteBuffer encrypted = ByteBuffer.allocate(8);
    int sum = 0; 
    int constant = 0x9e3779b9; //magic constant

    for (int k = 0; k < 32; ++k) { 
        sum += constant; 
        x += (y << 4 & 0xfffffff0) + key[0] ^ y + sum ^ (y >> 5 & 0x7ffffff) + key[1]; 
        y += (x << 4 & 0xfffffff0) + key[2] ^ x + sum ^ (x >> 5 & 0x7ffffff) + key[3]; 
    }
    encrypted.putInt(x);
    encrypted.putInt(y);
    return encrypted.array();
}

и расшифровать:

public byte[] decrypt(int[] data, int[] key) { 
    int x = data[0]; 
    int y = data[1]; 
    ByteBuffer decrypted = ByteBuffer.allocate(8);
    int sum = 0xC6EF3720; //32*delta
    int constant = 0x9e3779b9; //magic constant

    for (int k = 0; k < 32; ++k) { 
        x -= (x << 4 & 0xfffffff0) + key[2] ^ x + sum ^ (x >> 5 & 0x7ffffff) + key[3]; 
        y -= (y << 4 & 0xfffffff0) + key[0] ^ y + sum ^ (y >> 5 & 0x7ffffff) + key[1]; 
        sum -= constant; 
    }
    decrypted.putInt(x); 
    decrypted.putInt(y);
    return decrypted.array();
}

и мой зашифрованный вызов:

ByteBuffer unwrapEncrypt = ByteBuffer.allocate(512);
int[] encryptionKey = {55555, 8888, 123857, 912029};

//block is a byte[] with length 512
ByteBuffer plainText = ByteBuffer.wrap(block);
for (int j = 0; j < block.length / 8; j++) {
    //Initiate array for int pairs
    int[] plainTextInts = new int[2];
    plainTextInts[0] = plainText.getInt();
    plainTextInts[1] = plainText.getInt();
    //Encrypt and store
    unwrapEncrypt.put(encrypt(plainTextInts, encryptionKey));
}

и расшифровать вызов:

ByteBuffer audioToPlay = ByteBuffer.allocate(512);
int[] decryptionKey = {55555, 8888, 123857, 912029};

//audio is a byte[] with length 512
ByteBuffer cipherText = ByteBuffer.wrap(audio);
for (int j = 0; j < audio.length / 8; j++) {
    int[] plainTextInts = new int[2];
    //Initiate array for int pairs
    plainTextInts[0] = cipherText.getInt();
    plainTextInts[1] = cipherText.getInt();
    //Decrypt and store
    audioToPlay.put(decrypt(plainTextInts, decryptionKey));
}

Извините за массу кода - япробовал анализ на отправленном аудио и полученных расшифрованных данных - они оба правильной длины, просто совершенно разные.Если я уберу эти 4 блока кода, звук будет идеальным.Кто-нибудь может определить, что случилось?Спасибо

1 Ответ

1 голос
/ 08 марта 2019

Кажется, есть ошибка в вашем decrpyt() методе при сравнении с описанием TEA в Википедии. Вы должны заменить x и y слева от операторов -=. Кажется, мне подходит следующее:

public byte[] decrypt(int[] data, int[] key) { 
    int x = data[0]; 
    int y = data[1]; 
    ByteBuffer decrypted = ByteBuffer.allocate(8);
    int sum = 0xC6EF3720; //32*delta
    int constant = 0x9e3779b9; //magic constant

    for (int k = 0; k < 32; ++k) { 
        y -= (x << 4 & 0xfffffff0) + key[2] ^ x + sum ^ (x >> 5 & 0x7ffffff) + key[3]; 
        x -= (y << 4 & 0xfffffff0) + key[0] ^ y + sum ^ (y >> 5 & 0x7ffffff) + key[1]; 
        sum -= constant; 
    }
    decrypted.putInt(x); 
    decrypted.putInt(y);
    return decrypted.array();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...