我有隐藏字符串的函数:
BASE64Decoder decoder = new BASE64Decoder();
BASE64Encoder encoder = new BASE64Encoder();
public String encryptValueWithBlowfish(String data, String secretKey) {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
try {
SecretKeySpec key = new SecretKeySpec(decoder.decodeBuffer(secretKey), "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish/CBC/NoPadding", "BC");
String iv = "\0\0\0\0\0\0\0\0";
IvParameterSpec ivs = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, key, ivs);
MessageDigest sha = MessageDigest.getInstance("SHA-1");
return encoder.encode(sha.digest(cipher.doFinal(decoder.decodeBuffer(data))));
} catch (Exception e) {
lg.info("Failed to encryptValueWithBlowfish: " + e.getMessage());
return "";
}
}
行cipher.init(Cipher.ENCRYPT_MODE, key, ivs);
上升异常"Unsupported keysize or algorithm parameters"
。这段代码在另一台Linux机器上很好用。在两种情况下传递的参数都是相同的。我在加密事情上并不坚强。什么可能是错的?
答案 0 :(得分:1)
可能出现什么问题?
嗯,你在这里使用默认字符编码:iv.getBytes()
- 这绝不是一个好的开始。也许两台不同的机器有不同的默认编码。
如果要创建全零和特定大小的字节数组,为什么不使用:
IvParameterSpec ivs = new IvParameterSpec(new byte[8]);
如果您想要一个16字节的IV,请使用16。
目前尚不清楚decoder
在这里是什么 - 但你再次使用它,如果使用默认字符编码,它可能因机器而异。