Java 算术异常:使用密码算法;AES/CFB1/PKCS5P添加;从BouncyCastleProvider

Java 算术异常:使用密码算法;AES/CFB1/PKCS5P添加;从BouncyCastleProvider,java,algorithm,encryption,bouncycastle,jce,Java,Algorithm,Encryption,Bouncycastle,Jce,我正在尝试使用“AES/CFB1/PKCS5Padding”(BouncyCastle提供程序)创建密码算法,但出现算术异常: java.lang.arithmetricException:/by零 位于org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher.getOutputSize(未知源) 位于org.bouncycastle.jce.provider.JCEBlockCipher$BufferedGenericBlockCip

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

java.lang.arithmetricException:/by零 位于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密码模式。我需要使用密码模式为“CFB 1位”的“AES”算法。它适用于密码模式“CFB 8位”和“CFB 128位”


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


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

可能是您的dataBytes.length==0@puj我设置了一个长度大于“0”的有效字符串。我尝试使用“NoPadding”,但发生了相同的错误。软件要求我必须使用“AES”算法和密码模式“CFB 1位”。我尝试使用相同的算法配置,但效果很好。@FernandoChavesBenbassat好的,你使用的BouncyCastle的确切版本是什么?我使用:@FernandoChavesBenbassat我现在无法获取该版本的源代码,但当前版本有一条评论,即它只支持位长为8的倍数的CFB模式。它将允许您创建密码实例,但在使用时会失败,正如您所发现的那样。看起来BouncyCastle并没有提供满足您对CFB1需求的解决方案。
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;
}