что не так в функции расшифровки Java AES? - PullRequest
0 голосов
/ 29 апреля 2010

я изменил код, доступный на http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html

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

это переменные, которые я использую:


kgen = KeyGenerator.getInstance("AES");
            kgen.init(128);
            raw = new byte[]{(byte)0x00,(byte)0x11,(byte)0x22,(byte)0x33,(byte)0x44,(byte)0x55,(byte)0x66,(byte)0x77,(byte)0x88,(byte)0x99,(byte)0xaa,(byte)0xbb,(byte)0xcc,(byte)0xdd,(byte)0xee,(byte)0xff};
            skeySpec = new SecretKeySpec(raw, "AES");
            cipher = Cipher.getInstance("AES");

            plainText=null;
            cipherText=null;

следующая функция расшифровки.


public String decrypt(String cipherText)
    {
        try
        {
            cipher.init(Cipher.DECRYPT_MODE, skeySpec);
            byte[] original = cipher.doFinal(cipherText.getBytes());
            plainText = new String(original);
        }


        catch(BadPaddingException e)
        {

        }

        return plainText;
    }

Ответы [ 3 ]

4 голосов
/ 29 апреля 2010

Из Java-Security архивов

Одной из распространенных ошибок, которые допускают люди, является помещение зашифрованных байтов в строка и после расшифровки они используют String.getBytes (), чтобы получить его. Поскольку String выполняет свою собственную кодировку символов, байт [], который вы использовали для создайте объект String и byte [], которые вы получите из его getBytes () не обязательно равны.
1 голос
/ 29 апреля 2010

Откуда на самом деле исходит cipherText? Он должен быть «необработанным» байтовым массивом (а не строкой) и должен быть зашифрован так, чтобы шифр мог его понять.

AES (и блочные шифры в целом) можно запускать в разных «режимах блоков» и с разными «отступами», и когда вы создаете экземпляр Cipher, вы должны указать, какой режим блоков вы используете (или какой использовался для Первоначально зашифровать данные). Если вы получаете BadPaddingException при передаче необработанных байтов, то это обычно означает, что данные были зашифрованы с использованием другого режима или заполнения. (В этом случае это может быть просто артефакт преобразования данных в строку, как, по-моему, упоминается в другом плакате.)

Некоторая информация, которую я написал, может оказаться полезной:

0 голосов
/ 29 апреля 2010

Поскольку вы показали очень мало кода, трудно предсказать, что может вызвать исключение.

plainText имеет значение null, поскольку он инициализируется значением null, а функция расшифровки выдает исключение перед присвоением значения plainText.

Что ты делаешь с кгеном? В приведенном вами примере он используется для генерации необработанного байтового массива для спецификации секретного ключа. В своем списке переменных вы вручную определяете необработанный байтовый массив.

   KeyGenerator kgen = KeyGenerator.getInstance("AES");
   kgen.init(128); // 192 and 256 bits may not be available

   // Generate the secret key specs.
   SecretKey skey = kgen.generateKey();
   byte[] raw = skey.getEncoded();

   SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...