在ruby中使用Blowfish加密字符串会返回比php中的相同进程更短的字符串

这让我很困惑。

当我尝试使用以下输入来加密带有Blowfish的字符串时:key =“some 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) => # 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"] 

假设Crypt_Blowfish使用mcrypt或者就像它一样,你遇到了填充问题。 特别是,字符串用空字节右边填充,直到它与块大小的倍数一样长。 从PHP交互式shell:

 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 

似乎没有一种明显的方法来改变mcrypt的填充模式 ,我不知道是谁编写了你正在使用的库。 检查模块文档中的填充模式。

运气好的话,你可以改为设置Ruby的填充模式,或者简单地在Ruby的一边填充字符串。

等等,你的Ruby输出是8个字节? 你的输入是12 – 这是在这里出错的Ruby代码。

我没有使用Crypt :: Blowfish(并且文档很少)但是你可能需要将你的输入填充到64位的倍数。

由于Blowfish是64位分组密码,因此您必须填充数据 ,而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使用的。

我不知道Crypt / Blowfish.php是什么或它是什么 – > encrypt()方法,但是在调用crypt()时,字符串的差异可能是使用salt的php。

看起来php自定义Blowfish脚本加密不正确。

在PHP4和PHP5中,您可以使用内置的crypt函数来加密Blowfish。

PHP crypt() 。

CRYPT_BLOWFISH – 带有盐的河豚散列如下:“$ 2a $”,两位数的成本参数“$”,以及字母“./0-9A-Za-z”中的22位64位数字。 在salt中使用此范围之外的字符将导致crypt()返回零长度字符串。 两位数的成本参数是基于Blowfish的哈希算法的迭代计数的基数2对数,并且必须在04-31范围内,超出此范围的值将导致crypt()失败。

所以你可以使用Blowfish来调用$hash = crypt($yourString, '$2a$07$'.$aSalt)来加密。

如果您无权访问PHP代码,请完全忽略此答案。

尝试使用blowfish.encrypt_string而不是encrypt_block