我正在尝试构建一个工具来解密在 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/