Шифрование AES-128 в Java

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

public class AES {


    public static byte[] encrypt(byte[] plainText, byte[] key) {
        try {
            Cipher cipher = Cipher.getInstance("AES");
            SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] cipherText = cipher.doFinal(plainText);
            return cipherText;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String byteToHex(byte[] hash) {

        StringBuilder sb = new StringBuilder(hash.length * 2);
        for (byte b : hash) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }


    public static void main(String args[]) {

        byte plaintext[] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x58,0x63,(byte)0xaa,(byte)0xbb,(byte)0xcc,(byte)0xdd,(byte)0xee,(byte)0xff};
        byte key[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};


        byte[] encrypted = encrypt(plaintext, key);
        System.out.println("Encrypted String : " + byteToHex(encrypted));

    }
}

Результат, который я получаю: 814064943fe05668da1f3d2269a4ee22954f64f2e4e86e9eee82d20216684899, в то время как я ожидаю 69c4e0d86a7b0430d8cdb78070b4c55a. Я использую открытый текст и ключ из здесь

Вы понимаете, что делает заполнение PKCS5? Подсказка: всегда сделаю результат длиннее. Таким образом, ввод 16 байтов никогда не может привести к выходу 16 байтов.

Codo 09.11.2018 23:44

Нет, я удалил его и использую значение по умолчанию. Однако я хотел бы знать, почему я получаю неверный результат

Bab 09.11.2018 23:46

Я также попытался распечатать зашифрованный массив байтов с помощью Array.toString(encrypted )

Bab 09.11.2018 23:51

Режим заполнения по умолчанию вашего поставщика AES, скорее всего, - «PKCS5». Значит, вы ничего не изменили ... Прочтите об этом, и вы поймете, почему ваш результат отличается.

Codo 09.11.2018 23:53

Прочитал об этом и узнал, что мне пришлось использовать NoPadding, который дал мне правильный формат. Однако я по-прежнему получаю неверный результат.

Bab 10.11.2018 00:00

Кстати, я получаю разные зашифрованные тексты

Bab 10.11.2018 00:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
169
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем коде есть две ошибки.

  1. Вы используете заполнение PKCS5, в то время как в исходном примере оно не используется.

  2. Вы неправильно скопировали простой текст.

Так:

Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");

...

byte plaintext[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, (byte) 0x88,
        (byte) 0x99, (byte) 0xaa, (byte) 0xbb, (byte) 0xcc, (byte) 0xdd, (byte) 0xee, (byte) 0xff };

Результат:

Encrypted String : 69c4e0d86a7b0430d8cdb78070b4c55a

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