我是一个有关使用java的bouncycastle进行加密的项目。

但是,当我加密消息时,它将为我引发异常。

javax.crypto.IllegalBlockSizeException:数据未对齐块大小

我正在使用Blowfish / ECB / NoPadding,并且消息是xml。

public static void main(String args[]){
     String message = "<abc>ABCDEFG</abc>";
     String key = "key";
     byte[] b = encrypt(message.getBytes(), key.getBytes());
}

public byte[] encrypt(byte encrypt[], byte en_key[]) {
     try {
           SecretKeySpec key = new SecretKeySpec(en_key, "Blowfish");
           Cipher cipher = Cipher.getInstance("Blowfish/ECB/NoPadding");
           cipher.init(Cipher.ENCRYPT_MODE, en_key);
           return cipher.doFinal(encrypt);
     } catch (Exception e) {
           e.printStackTrace();
           return null;
         }

}


谁能帮助我?

谢谢

最佳答案

您正在使用NoPadding,并且输入数据的大小不得与密码的块大小匹配,因此将引发IllegalBlockSizeException。如果使用NoPadding,则需要确保输入为8字节的倍数。

指定填充方案。更改为Blowfish/CBC/PKCS5Padding,它应该可以工作。

用空字节手动填充它:
创建一个更大的新数组,该数组的大小是8的倍数,然后将旧数组复制到其中。

public static byte[] encrypt(byte encrypt[], byte en_key[]) {

    if(encrypt.length % 8 != 0){ //not a multiple of 8
        //create a new array with a size which is a multiple of 8
        byte[] padded = new byte[encrypt.length + 8 - (encrypt.length % 8)];

        //copy the old array into it
        System.arraycopy(encrypt, 0, padded, 0, encrypt.length);
        encrypt = padded;
    }

    try {
        SecretKeySpec key = new SecretKeySpec(en_key, "Blowfish");
        Cipher cipher = Cipher.getInstance("Blowfish/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return cipher.doFinal(encrypt);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

07-24 09:45