【问题标题】:ArithmeticException: using Cipher Algorithm "AES/CFB1/PKCS5Padding" from BouncyCastleProviderArithmeticException:使用来自 BouncyCastleProvider 的密码算法“AES/CFB1/PKCS5Padding”
【发布时间】:2015-05-16 07:32:28
【问题描述】:

我正在尝试使用“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 加密扩展 (JCE),但它不适用于 1 位的 CFB 密码模式。我需要将“AES”算法与密码模式“CFB 1-bit”一起使用。它适用于密码模式“CFB 8-bits”和“CFB 128-bits”。

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;
}   

【问题讨论】:

  • 也许你的 dataBytes.length == 0
  • @puj 我设置了一个长度大于“0”的有效字符串。

标签: java algorithm encryption bouncycastle jce


【解决方案1】:

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

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

【讨论】:

  • 我尝试使用“NoPadding”并发生了同样的错误。这是我必须使用“AES”算法和密码模式“CFB 1-bit”的软件要求。我尝试使用与ruby openSSL lib 相同的算法配置,效果很好。
  • @FernandoChavesBenbassat 好的,您使用的 BouncyCastle 的确切版本是什么?
  • 我正在使用:Bouncy Castle Provider 1.46
  • @FernandoChavesBenbassat 我现在无法获得该版本的源代码,但当前版本有注释说它仅支持位长为 8 的倍数的 CFB 模式。它将允许您创建一个密码实例,但正如您所发现的那样,它在使用时会失败。 BouncyCastle 似乎没有提供满足您对 CFB1 要求的解决方案。
猜你喜欢
  • 2012-03-01
  • 2011-10-19
  • 1970-01-01
  • 2021-08-13
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 2021-09-23
相关资源
最近更新 更多