ArithmeticException: использование алгоритма шифрования AES/CFB1/PKCS5Padding от BouncyCastleProvider

Я пытаюсь создать алгоритм шифрования с использованием «AES/CFB1/PKCS5Padding» (поставщик BouncyCastle), но возникает исключение ArithmeticException:

java.lang.ArithmeticException: / нулем в org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher.getOutputSize(неизвестный источник) в org.bouncycastle.jce.provider.JCEBlockCipher$BufferedGenericBlockCipher.getOutputSize(неизвестный источник) в org.bouncycastle.jce. provider.JCEBlockCipher.engineGetOutputSize (неизвестный источник) в org.bouncycastle.jce.provider.JCEBlockCipher.engineDoFinal (неизвестный источник) в javax.crypto.Cipher.doFinal (Cipher.java:2087)

Я только что попытался использовать расширение Java Cryptography Extension (JCE) по умолчанию, но оно не работает с режимом шифрования CFB с 1-битным. Мне нужно использовать алгоритм «AES» с режимом шифрования «CFB 1-bit». Он отлично работает с режимом шифрования «CFB 8-бит» и «CFB 128-бит».

private static String buildCipherEncryptCheck(String data){

    byte[] dataBytes = data.getBytes();
    String encryptedData = null;

    try {                               
        // Generate valid key
        KeyGenerator keygenerator = KeyGenerator.getInstance("AES");                

        keygenerator.init(128);
        SecretKey myKey = keygenerator.generateKey();           

        // Generate cipher encrypt
        Cipher cipher = Cipher.getInstance("AES/CFB1/PKCS5Padding", new BouncyCastleProvider());

        // Initialize the cipher for encryption
        cipher.init(Cipher.ENCRYPT_MODE, myKey);                

        // Encrypt the text
        byte[] textEncrypted = cipher.doFinal(dataBytes);
        encryptedData = new String(Base64.encode(textEncrypted));

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    } catch (BadPaddingException e) {
        e.printStackTrace();
    }

    return encryptedData;
}   

person Fernando Chaves Benbassat    schedule 13.03.2015    source источник
comment
Возможно, ваш dataBytes.length == 0   -  person puj    schedule 13.03.2015
comment
@puj Я установил действительную строку длиной больше 0.   -  person Fernando Chaves Benbassat    schedule 13.03.2015


Ответы (1)


Мне непонятно, как вы применяете заполнение PKCS # 5 к потоковому шифру. Возможно, имеет смысл разработать бит-ориентированное заполнение для 1-битного CFB, чтобы дополнить последний байт, но PKCS5Padding (на самом деле PKCS #7) дополняет байтами, чтобы заполнить последний блок. Но поточный шифр не имеет размера блока. Разве ты не хочешь NoPadding вместо этого?

Я подозреваю, что механизм режима CFB возвращает 0 в качестве размера блока, поскольку он не определен. Когда механизм заполнения пытается использовать этот размер блока в своих вычислениях, возникает арифметическая ошибка. (Если это то, что происходит, для BouncyCastle было бы лучше проверить размер блока и выдать здесь более конкретную ошибку.)

person erickson    schedule 13.03.2015
comment
Я попробовал с NoPadding, и произошла та же ошибка. Это программное требование, которое я должен использовать для работы с алгоритмом AES и режимом шифрования CFB 1-bit. Я попытался использовать ту же конфигурацию алгоритма с ruby openSSL lib и работает нормально. - person Fernando Chaves Benbassat; 13.03.2015
comment
@FernandoChavesBenbassat Хорошо, какую именно версию BouncyCastle вы используете? - person erickson; 14.03.2015
comment
я использую: Bouncy Castle Provider 1.46 - person Fernando Chaves Benbassat; 14.03.2015
comment
@FernandoChavesBenbassat Я не смог получить исходный код этой версии прямо сейчас, но текущая версия имеет комментарий о том, что она поддерживает только режимы CFB, где длина бита кратна 8. Это позволит вам создать экземпляр шифра, но это потерпит неудачу при использовании, как вы обнаружили. Не похоже, что BouncyCastle предлагает решение, соответствующее вашим требованиям для CFB1. - person erickson; 14.03.2015