EncryptionException: javax.crypto.IllegalBlockSizeException: длина ввода должна быть кратна 8 при дешифровании с использованием дополненного шифра - PullRequest
1 голос
/ 04 октября 2011

Я унаследовал старый проект Java от 2006 года (первоначальный dev давно ушел, и я никогда не кодировал Java раньше), где я получаю эту ошибку:

EncryptionException: javax.crypto.IllegalBlockSizeException: длина ввода должна быть кратна 8 при дешифровании с добавленным шифром

Код, на который он ссылается, выглядит следующим образом:

public String decrypt( String encryptedString ) throws EncryptionException
{
    if ( encryptedString == null || encryptedString.trim().length() <= 0 )
            throw new IllegalArgumentException( "encrypted string was null or empty" );

    try
    {
        SecretKey key = keyFactory.generateSecret( keySpec );
        cipher.init( Cipher.DECRYPT_MODE, key );
        BASE64Decoder base64decoder = new BASE64Decoder();
        byte[] cleartext = base64decoder.decodeBuffer( encryptedString );
        byte[] ciphertext = cipher.doFinal( cleartext );

        return bytes2String( ciphertext );
    }
    catch (Exception e)
    {
        throw new EncryptionException( e );
    }
}

Я не совсем уверен во внутренней работе программы, но я знаю, что в этом каталоге проекта находятся несколько файлов конфигурации и файл key.properties. Что касается «длины ввода» (как указано в сообщении об ошибке), мой пароль для базы данных составляет 15 символов, а «ключ» в key.properties - 25 символов. Я понятия не имею, имеет ли это значение или нет.

Что следует отметить:

  • Я попытался изменить пароль БД на 16 символов (кратно 8), но безрезультатно.
  • Я прочитал это и это , и они не помогли
  • Я перемещаю этот проект с одного сервера на другой. Он работает на своем оригинальном сервере.
  • Исходный сервер работает под управлением JRE 1.4.2. Новый сервер работает под управлением JRE 1.6u27.
  • Я ДЕЙСТВИТЕЛЬНО не хочу перестраивать .jar. Я не Java-разработчик, и проект довольно масштабный.

Спасибо за вашу помощь.

Ответы [ 2 ]

5 голосов
/ 04 октября 2011

Вход, к которому относится сообщение об ошибке, - это зашифрованный текст (с нечетным названием cleartext), результат операции декодирования Base-64. Убедитесь, что encryptedString, который вы передаете этому методу, декодируется в байтовый массив с длиной, кратной 8.

1 голос
/ 04 октября 2011

Возможно, вам не следует менять версию JRE, если вы не хотите пересмотреть код. Я бы попробовал понизить версию JRE на новом сервере, прежде чем что-то еще, тем более что код ранее работал.

...