【发布时间】:2014-05-13 03:54:47
【问题描述】:
我正在尝试从 Puppet (Ruby) 生成一些加密的 JBoss 数据源密码。 JBoss 使用this library (see line 149) 来加密/解密密码(使用 Blowfish 和在 Java 代码中编译的预定义密钥)。
现在,我研究了一下,发现默认情况下,javax.crypto 对河豚使用以下参数:Blowfish/ECB/PKCS5Padding。
默认情况下,Ruby 的 OpenSSL 库根本不进行任何填充(如果它不是 8 的倍数,则简单地拒绝该键)。我尝试手动进行填充,这是我的完整代码:
#!/usr/bin/ruby
require 'openssl'
key = 'jaas is the way'
ciph = OpenSSL::Cipher.new('bf-ecb').encrypt
ciph.key = key + (8 - key.length % 8).chr * (8 - key.length % 8)
b = ciph.update(ARGV[0]) + ciph.final()
puts b.unpack('H*')
我尝试实现 PKCS5 填充的方式与我在 Python 中看到的类似(Python vs. Java Blowfish)问题中的实现方式相同,方法是添加 chr(直到长度为 8 的倍数的字节数)直到字符串的长度是 8 的倍数。对于这个特定的键,它应该恰好添加一个 chr(1),并且在尝试调试时,它似乎做得很好。
问题是我的 Ruby 代码给出的结果与 Java 中的 Picketbox 库中的代码获得的结果不同。
编辑: 以下是我在运行更多测试后得到的一些结论:
如果要加密的密钥和明文都是16字节,结果没问题
我们尝试使用 16 字节长的纯文本字符串和 15 字节密钥进行加密。然后我们用 0 到 255 的 ASCII 码的所有字符在 Ruby 中填充(前后)密钥,并且没有一个结果与我们在 Java 中获得的加密文本匹配。这根本没有意义,因为如果 Java 只是简单地用任何东西填充键,它就会在原始键的开头或结尾添加一个字符。唯一合乎逻辑的解释可能是 Java 确实通过其他方式(而不是附加字符)操作密钥字符串。
【问题讨论】:
-
如果key是8的倍数,结果是否一样?
-
不,结果不一样,很遗憾。即使在 Java 代码中我在初始化 Cipher 时放置了 Blowfish/ECB/NoPadding,结果也会更加尴尬,因为在这种情况下我使用 Java 得到的字符串更短,这让我认为 Ruby 也做了某种填充到一个计算值。
-
@UriAgassi,用户 Jasper 在该页面上发布的解决方案不起作用。首先是因为他使用空格来填充。如果我用我的填充方法替换他的填充方法,我会得到与我的代码完全相同的结果。此外,这不是同一个问题,因为就他的问题而言,除了最后一个块外,他一切都很好。在我的情况下,没有什么是好的,如果密钥在后台被 Java 以不同的方式使用/处理,这是有道理的。感谢您的提示。
-
尝试填充明文数据...
标签: java ruby jboss puppet blowfish