java - 算术异常 : using Cipher Algorithm "AES/CFB1/PKCS5Padding" from BouncyCaSTLeProvider

标签 java algorithm encryption bouncycastle jce

我正在尝试使用“AES/CFB1/PKCS5Padding”(BouncyCaSTLe 提供程序)创建密码算法,但出现 ArithmeticException:

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

我只是尝试使用默认的 Java 加密扩展 (JCE),但它不适用于 1 位的 CFB 密码模式。我需要使用密码模式为“CFB 1 位”的“AES”算法。它适用于密码模式“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;
}   

最佳答案

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

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

关于java - 算术异常 : using Cipher Algorithm "AES/CFB1/PKCS5Padding" from BouncyCaSTLeProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29038655/

相关文章:

Java图像发送网络

java - 默认情况下将 Java 枚举打印为小写,而将枚举常量保持为大写

java - 使用 Spring boot 的 BasicAuth

python - 无法跟踪为什么字符串排列未附加到数组排列的全局变量中

c# - 在 C# 中自动加密文件?

java - 为什么单例静态方法 getNext() 返回增量值

algorithm - n 个不同元素的二叉搜索树的数量

c++ - std::sort 不适用于重载 < 运算符的用户定义对象

c++ - openssl 与 Windows capi

c - openssl命令行解密aes ctr 128