Как решить javax.crypto.IllegalBlockSizeException: данные не выровнены по размеру блока - PullRequest
5 голосов
/ 31 октября 2010

Я выполняю задание об использовании Blowfish для шифрования и дешифрования в Java.

Я добавил провайдера и получил экземпляр "Blowfish / ECB / NoPadding", но все равно получаю эту ошибкусделать шифрование.

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

Например:

public static byte[] encrypt(byte to_encrypt[], byte strkey[]) {
    try {           
        SecretKeySpec key = new SecretKeySpec(strkey, "Blowfish");
        Cipher cipher = Cipher.getInstance("Blowfish/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, key);  
        return cipher.doFinal(to_encrypt); // <=========== error
    } catch (Exception e) { 
        e.printStackTrace();
        return null; 
    }
}

ведет к

javax.crypto.IllegalBlockSizeException: data not block size aligned
    at org.bouncycastle2.jce.provider.JCEBlockCipher.engineDoFinal(JCEBlockCipher.java:686)
    at javax.crypto.Cipher.doFinal(Cipher.java:1171)

Спасибо.

Ответы [ 2 ]

9 голосов
/ 15 ноября 2010

Вы явно запросили поставщика, который не выполняет заполнение (обратите внимание на NoPadding в имени экземпляра).Следовательно, ваш ввод не будет дополнен.

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

Таким образом, у вас есть дваварианты решения этой проблемы:

  1. Подберите ввод самостоятельно к кратному размеру блока.
  2. Выберите поставщика, который выполняет заполнение (например, PKCS5Padding), если вы нене хочу делать это вручную.Учитывая характер вашего вопроса, это, вероятно, будет лучшим вариантом.
3 голосов
/ 15 ноября 2010

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

Попробуйте указать схему заполнения. Измените на Blowfish/CBC/PKCS5Padding, и оно должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...