当前位置: 首页 > 知识库问答 >
问题:

Blowfish在Java/Scala中加密,在bash中解密

籍星汉
2023-03-14
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=
$ 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=

共有1个答案

索曾琪
2023-03-14

首先,如果希望拥有相同的密文,必须确保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))

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

printf %s "messages" | openssl enc -e -blowfish -nopad -K "0123456789ABCDEF0123456789ABCDEF" -iv "0000000000000000" -base64
 类似资料:
  • 问题内容: 以下代码对我来说可以用BlowFish加密对字符串加密。 如果我想定义自己的密钥,该怎么做? 问题答案:

  • 问题内容: 我有一个从Java服务器发送的公钥。在我解码并去除ASN.1标头之前,base64编码的字符串匹配。我使用将公钥存储在钥匙串中。 因此,我尝试使用公共密钥对数据进行加密,并使用Java中的私有密钥对其进行解密。我在iOS端和Java端使用。 我正在加密的是对称AES密钥,该密钥对我的实际数据进行加密,因此密钥长度为16个字节。当简单地对密钥进行base64编码时,一切正常,因此我知道此

  • 问题内容: 我在Java中有一个加密代码。我正在尝试将加密部分移植到节点。基本上,节点将使用crypto模块进行加密,然后Java将进行解密。 这是我在Java中进行加密的方法: 这是我在节点中进行加密的方法: 在Java中,我得到了string 。这将正确解密。但是,在node中,我得到了明显不同的内容,因此无法正确解密。 我试图寻找与我有相同问题的人,而这个 github问题是我所能找到的最接

  • 问题内容: 我正在尝试在java中加密数据并在ruby中解密数据。 我的代码是…用Java加密 结果是 我希望在Ruby中解密(加密的字符串) Ruby代码是…(错误) 我希望得到 但它返回错误 我认为问题是cipher.padding和key / iv的类型。但是我不知道如何完成红宝石代码。 请让我知道如何完成此代码。 谢谢。 问题答案: Ruby代码有两个问题。 首先,应该使用AES 128时

  • 我有一个用例,其中我在bash脚本中使用命令,其中我以明文格式输入了Keystore密码。类似的东西: 测验嘘 现在需要在脚本中加密这个明文密码,这样就可能不知道实际的密钥库密码。我尝试使用OpenSSL加密默认密码,将其存储在另一个隐藏文件中,并在运行脚本时随时解密密码,但任何有权访问脚本的人都可以查看正在使用的算法,并使用相同的OpenSSL命令解密密码。 我知道keytool需要不惜任何代价

  • 我用java加密一个单词,但用php解密时遇到了问题。 以下是我如何在android中创建密钥: 下面是我如何在android中使用生成的公钥加密单词: 然后我在android中将加密字符串转换为Bas64: 在php中,我解码base64字符串: 获取私钥: 最后,我尝试用php解密这个字符串: 我得到的错误是: 警告:openssl_private_decrypt():密钥参数不是有效的私钥.