java - 用 Java 解密 Blowfish/CBC

标签 java perl encryption blowfish

我有 Perl 代码可以解密字符串,我想在 Java 中做同样的事情。这是 Perl 代码:

my $c = Crypt::CBC->new( -key => $keyString, -cipher => 'Blowfish', -header => 'randomiv');
return $c->decrypt_hex($config->{encrypted_password})

这是我对 Java 代码的尝试:

Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");

// setup an IV (initialization vector) that should be
// randomly generated for each input that's encrypted
byte[] iv = new byte[cipher.getBlockSize()];
new SecureRandom().nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);

// decrypt
SecretKey secretKey = new SecretKeySpec(Base64.decodeBase64(keyString), "Blowfish");
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
byte[] decrypted = cipher.doFinal(Base64.decodeBase64(input));
return Hex.encodeHexString(decrypted);

我得到:javax.crypto.BadPaddingException:给定的最终 block 未正确填充。但根据thisCrypt CBC 库使用 PKCS5 作为默认填充。

另外,我是否在最后进行了十六进制编码?

最佳答案

您遇到的问题之一是您生成了随机 IV,而不是导入用于加密的 IV。您有权访问加密时使用的 IV 吗?它可能在密文的开头吗?

关于java - 用 Java 解密 Blowfish/CBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14572834/

相关文章:

java.util.Scanner : why my nextDouble() does not prompt?

Perl `map` : When to use EXPR vs. block 形式?

php - 将二进制数据从数据库提取到文件

java - 尝试通过JDBC在MySQL中存储SecretKey、加密密码

java - 如何使组件跨越 GridBagLayout 中的多个单元格

java - 从 Java 客户端连接到 Mapr-DB (M3)

c++ - 解密 AES-256 加密文件不起作用

c# - 无法将密码另存为哈希时该怎么办

java - 将 yamr 作业提交到远程集群时出现 ClassNotFoundException

regex - 从文本文件中获取范围模式中的特定行