这令我感到困惑。
当我尝试使用以下输入来加密带有Blowfish的字符串时: key =“一些关键” input =“input string”
我得到以下结果:
ruby: ["79af8c8ee9220bde"]
php: 79af8c8ee9220bdec2d1c9cfca7b13c6
我将从php应用程序接收字符串,所以我需要让这两个同步,但我不明白为什么php字符串会更长。我错过了什么?
php代码:
php > require_once 'Crypt/Blowfish.php';
php > $input = "input string";
php > $key = "some key";
php > $crypt = new Crypt_Blowfish($key);
php > echo bin2hex($crypt->encrypt($input));
79af8c8ee9220bdec2d1c9cfca7b13c6
ruby代码:
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'crypt/blowfish'
=> true
irb(main):003:0> input = "input string"
=> "input string"
irb(main):004:0> key = "some key"
=> "some key"
irb(main):005:0> blowfish = Crypt::Blowfish.new(key)
=> #<Crypt::Blowfish:0xb74b10c4 @sBoxes=[[3156471959, 1769696695, 1443271708, 181204541,
...... 1894848609], @key="some key">
irb(main):006:0> blowfish.encrypt_block(input)
=> "y\257\214\216\351\"\v\336"
irb(main):007:0> blowfish.encrypt_block(input).unpack("H*")
=> ["79af8c8ee9220bde"]
答案 0 :(得分:4)
等一下,你的Ruby输出是8个字节?你的输入是12 - 这是在这里出错的Ruby代码。
我没有使用Crypt :: Blowfish(并且文档很少)但是你可能需要将输入填充到64位的倍数。
答案 1 :(得分:3)
假设Crypt_Blowfish
使用mcrypt
或者使用php > $bf = mcrypt_module_open('blowfish', '', 'ecb', '');
php > $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($bf), MCRYPT_DEV_RANDOM);
php > $key = 'some key';
php > mcrypt_generic_init($bf, $key, $iv);
php > echo mcrypt_enc_get_block_size($td);
8
php > echo bin2hex(mcrypt_generic($bf, 'input string'));
79af8c8ee9220bdec2d1c9cfca7b13c6
php > echo bin2hex(mcrypt_generic($td, "input string\0\0\0\0"));
79af8c8ee9220bdec2d1c9cfca7b13c6
,就会遇到填充问题。特别是,字符串是用空字节右边填充的,直到它与块大小的倍数一样长。从PHP交互式shell:
mcrypt
似乎没有一种明显的方法来更改{{1}}中的padding mode,我不知道是谁编写了您正在使用的库。检查模块文档中的填充模式。
运气好的话,你可以改为设置Ruby的填充模式,或者简单地在Ruby的一边填充字符串。
答案 2 :(得分:1)
由于Blowfish是一个64位分组密码,你必须pad the data并且Ruby实现不会自动为你做。
s = "input string"
len = s.length
mod = 8-len%8
padded = s.ljust(len+mod, "\0")
我只需要展示我的第一次尝试......
<击> encrypted = blowfish.encrypt_block(输入。 each_char。 each_slice(8)。 map {| slice | slice.count == 8? slice.join:slice.join.ljust(8,“\ 0”)}。join 击>
我使用\ 0,因为这似乎是PHP使用的。
答案 3 :(得分:0)
我不知道Crypt / Blowfish.php是什么或它是什么 - &gt; encrypt()方法,但是在调用crypt()时,字符串的差异可能是使用salt的php。
答案 4 :(得分:0)
看起来php自定义Blowfish脚本加密不正确。
在PHP4和PHP5中,您可以使用内置的crypt
函数来加密Blowfish。
CRYPT_BLOWFISH - 用下面的盐对河豚进行散列:“$ 2a $”,两位数的成本参数“$”,以及字母“./0-9A-Za-z”中的22位64位数字。在salt中使用此范围之外的字符将导致crypt()返回零长度字符串。两位数的成本参数是基于Blowfish的哈希算法的迭代计数的基数2对数,并且必须在04-31范围内,超出此范围的值将导致crypt()失败。
因此,您可以使用Blowfish调用$hash = crypt($yourString, '$2a$07$'.$aSalt)
加密。
如果您无权访问PHP代码,请完全忽略此答案。
答案 5 :(得分:0)
尝试使用blowfish.encrypt_string
代替encrypt_block