java - Blowfish 在 Java/Scala 中加密并在 bash 中解密

标签 java bash scala encryption blowfish

我正在尝试构建一个工具来解密在 scala 应用程序中加密的 bash 中的内容:

但首先,我必须成功地用两种语言编码相同的消息并使它们相等:

给定密码“0123456789abcdef”
(十六进制:“30313233343536373839616263646566”和字节[]:[48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99 , 100, 101, 102])

scala> import javax.crypto.Cipher
scala> import javax.crypto.spec.SecretKeySpec
scala> val cipher = Cipher.getInstance("Blowfish")
scala> cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec("0123456789abcdef".getBytes("utf-8"), "Blowfish"))
scala> javax.xml.bind.DatatypeConverter.printBase64Binary(cipher.doFinal("message".getBytes("utf-8")))
res7: String = K679Jz06jmc=

但我无法在 bash 中使用 openssl 重现相同的内容。

$ echo "message" | openssl enc -a -e -blowfish -nosalt -nopad -k "0123456789abcdef"
LJ3iFJ2/mYk=
$ echo "message" | openssl enc -a -e -blowfish -nosalt -nopad -k "30313233343536373839616263646566"
JkkJgYv3fQg=

有什么提示吗? 谢谢!

最佳答案

首先,如果您想拥有相同的密文,您必须确保 Scala 和 OpenSSL 加密使用具有相同输入参数的相同确定性加密算法。

由于 OpenSSL 使用 CBC 作为默认模式,我们在 Scala 中也这样做。

import javax.crypto.Cipher
import javax.crypto.spec._
import javax.xml.bind.DatatypeConverter

val cipher = Cipher.getInstance("Blowfish/CBC/NoPadding")

val key = new SecretKeySpec(DatatypeConverter.parseHexBinary("0123456789ABCDEF0123456789ABCDEF"), "Blowfish")

val specIv = new IvParameterSpec(DatatypeConverter.parseHexBinary("0000000000000000"))

cipher.init(Cipher.ENCRYPT_MODE, key, specIv)

val enc = cipher.doFinal("messages".getBytes("UTF-8"))

println(DatatypeConverter.printBase64Binary(enc))

请注意,在没有填充的情况下,输入长度必须是 64 位 Blowfish block 长度的倍数。

使用 OpenSSL,您必须明确指定相同的 key 和初始化 vector (IV)

printf %s "messages" | openssl enc -e -blowfish -nopad -K "0123456789ABCDEF0123456789ABCDEF" -iv "0000000000000000" -base64

在上面的例子中,在这两种情况下你都会得到 JSj0k4FwtG8= 作为密文。

关于java - Blowfish 在 Java/Scala 中加密并在 bash 中解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37354200/

相关文章:

java - 评估 Stanford NER CRF 并以编程方式计算 Precision/Recall

java - OpenCV Warp 透视图和欧氏距离问题

java - Android Expandable RecyclerView 不同卡片高度

java - 如何通过 Java 实现的关键字停止 Robot Framework 中的测试执行?

json - 使用Play呈现JSON!和Scala

bash - 如何通过 "mySync leftdir rightdir"等特定命令使我的同步 bash 脚本可执行?

bash 脚本中的 Javac 不返回此类文件

bash - 期望脚本不在Docker容器中运行

scala - Scala列表理解

scala - Play什么时候加载application.conf?