ArithmeticException:使用密码算法" AES / CFB1 / PKCS5Padding"来自BouncyCastleProvider

时间:2015-03-13 17:41:55

标签: java algorithm encryption bouncycastle jce

我尝试使用" AES / CFB1 / PKCS5Padding"创建一个密码算法。 (BouncyCastle提供程序),但发生ArithmeticException:

  

java.lang.ArithmeticException:/ by zero       在org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher.getOutputSize(未知来源)       at org.bouncycastle.jce.provider.JCEBlockCipher $ BufferedGenericBlockCipher.getOutputSize(Unknown Source)       在org.bouncycastle.jce.provider.JCEBlockCipher.engineGetOutputSize(未知来源)       在org.bouncycastle.jce.provider.JCEBlockCipher.engineDoFinal(未知来源)       在javax.crypto.Cipher.doFinal(Cipher.java:2087)

我只是尝试使用默认的Java Cryptography Extension(JCE),但它不适用于带有1位的CFB密码模式。我需要使用" AES"具有密码模式的算法" CFB 1-bit"。它适用于Cipher Mode" CFB 8-bit"和" 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;
}   

1 个答案:

答案 0 :(得分:0)

我不清楚你如何将PKCS#5填充应用于流密码。为1-bit CFB设计一个面向位的填充以填充最后一个字节可能是有意义的,但PKCS5Padding(PKCS#7,真的)填充字节以填充最后一个块。但是流密码没有块大小。你不想要NoPadding吗?

我怀疑CFB模式引擎返回0作为块大小,因为它未定义。当填充引擎尝试在其计算中使用此块大小时,将引发算术错误。 (如果这是正在发生的事情,那么BouncyCastle最好验证块大小并在此处抛出更具体的错误。)