【问题标题】:The Encryption in Java and Linux does not match [duplicate]Java和Linux中的加密不匹配[重复]
【发布时间】:2017-03-04 06:59:39
【问题描述】:

我不能更改密钥或 IV,只有在这种情况下,加密在 Java 和 Linux 中才有效。

Linux

echo  -n 1234567890ABCDEF| openssl enc -bf-cbc  -K 0  -iv 0 -nopad -nosalt |base64 

Java

byte[] key = {0};

byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0};

Cipher c = Cipher.getInstance("BlowFish/CBC/NoPadding");
Key k = new SecretKeySpec(key, "BlowFish");
c.init(Cipher.ENCRYPT_MODE, k, new IvParameterSpec(iv));

byte[] encrypt = c.doFinal("1234567890ABCDEF".getBytes("UTF-8"));

System.out.println(new String(Base64.encodeBase64(encrypt)));

如何更改 Key 和 IV 以使两者都继续等于?

【问题讨论】:

  • 那么,您在 Java 方面遇到的异常是什么?我认为应该足够精确地告诉您密钥必须有多长。
  • BlowFish 真的不应该在新作品中使用,即使作者使用 AES。您应该使用随机 IV,只需在加密数据前面加上它,以便在解密期间使用。如果您不使用填充,则要加密的输入长度必须是块大小的精确倍数,您可能需要使用 PKCS#5 填充。您正在为安全性进行加密,对吗?
  • 我相信你在EVP_BytesToKey 上被绊倒了。另见Java openssl encryption / decryption key generationJava equivalent of an OpenSSL AES CBC encryption 和朋友。一旦您知道要查找的内容,您就可以在整个网络上找到它。

标签: java linux encryption openssl


【解决方案1】:

阅读documentation

所有分组密码通常使用 PKCS#5 填充,也称为标准分组填充

由于您的 Java 代码显示 NoPadding,因此您需要添加一个额外的参数:

-nopad
     disable standard block padding

【讨论】:

  • 对不起,我忘了写“-nopad”。因此,如果我尝试更改 IV 或 Key 结果不匹配,就会出现这种情况
猜你喜欢
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 2015-08-13
  • 2012-05-06
相关资源
最近更新 更多