我是一个有关使用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;
}
}