Двойное шифрование AES-CTR переводит зашифрованный текст в открытый текст

Когда я снова пытаюсь зашифровать зашифрованный текст тем же ключом, он создает исходный открытый текст.

Используемый алгоритм - AES с РЕЖИМОМ СЧЕТЧИКА. Ключ и IV остаются прежними.

Так ли должен себя вести алгоритм? И если, какой смысл использовать Cipher.ENCRYTMODE, который должен быть задан в качестве первого параметра Cipher.init()?

Вот пример программы, с которой я тестировал,

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class EncryptionTest {

    public static void main(String[] args) throws Exception {
        SecretKeySpec key = null;
        IvParameterSpec ivSpec = null;
        byte[] keyBytes = "usethiskeyusethiusethiskeyusethi".getBytes();
        byte[] ivBytes = "usethisIusethisI".getBytes();
        key = new SecretKeySpec(keyBytes, "AES"); //No I18N
        ivSpec = new IvParameterSpec(ivBytes);

        Cipher AesCipher = Cipher.getInstance("AES/CTR/NoPadding");


        byte[] byteText = "Your Plain Text Here".getBytes();

        AesCipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
        byte[] byteCipherText = AesCipher.doFinal(byteText);
        System.out.println("Encrypted : " + new String(byteCipherText));

        AesCipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
        byte[] bytePlainText = AesCipher.doFinal(byteCipherText);
        System.out.println("Double Encrypted : " + new String(bytePlainText));
    }
}

1 ответ

Решение

Да, это ожидаемое поведение. Режим работы CTR для блочных шифров делает потоковый шифр из блочного шифра. Поскольку потоковые шифры работают таким образом, что они генерируют поток ключей и XOR поток ключей с открытым текстом для создания зашифрованного текста:

plaintext XOR AES-CTR(nonce, key) = ciphertext

Операция XOR работает таким образом, что XORing x с ключом k дважды приводит к x снова:

x ^ k ^ k = x

Это причина, по которой шифрование и дешифрование - это точно такая же операция для блочных шифров в режиме CTR (без генерации одноразовых номеров и помещения их в зашифрованный текст).

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

Помните, что для безопасного режима CTR вы должны использовать разные nonce/IV под одним и тем же ключом для каждого шифрования.

Другие вопросы по тегам