2012-04-11 137 views
0

以下函数在PHP中完美工作。它如何在Ruby on Rails中进行翻译。Ruby on Rails解密

请注意,privateKey和iv的长度均为32个字符。

mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $privateKey, base64_decode($enc), MCRYPT_MODE_CBC, $iv) 

我试图在Ruby中使用以下内容,但得到了一个错误的解密错误。

cipher = OpenSSL::Cipher.new('aes-256-cbc') 

cipher.decrypt 
cipher.key = privateKey 
cipher.iv = iv 

decrypted = '' << cipher.update(encrypted) << cipher.final 
+1

你不是用这个来输入密码吧? – 2012-04-11 14:10:22

+0

不,不是密码 – user812120 2012-04-17 13:27:07

回答

0

你是base64解码它在php的例子。你也在做红宝石吗?

require "base64" 
Base64.decode64(encrypted) 

除此之外,代码看起来很适合我。

+0

非常感谢您的快速回复 这里是完整的PHP代码 $ iv = base64_decode($ _ REQUEST [“bpi”]); $ enc = $ _REQUEST [“bpe”]; $ sig = $ _REQUEST [“bps”]; $ sig2 = hash_hmac(“sha256”,utf8_encode($ iv。'。'。$ enc),utf8_encode($ privateKey)); echo(mcrypt_decrypt(MCRYPT_RIJNDAEL_256,$ privateKey,base64_decode($ enc),MCRYPT_MODE_CBC,$ iv)); 它在PHP中工作正常 但上面的Ruby代码给了我一个糟糕的解密错误。我是在红宝石base64解码以及 – user812120 2012-04-11 11:52:07

+0

是否有与MCRYPT_RIJNDAEL_256等价的Ruby?如果我使用PHP中的MCRYPT_RIJNDAEL_256和Ruby中的AES-256-CBC使用相同的密钥(32个字符)和iv(32个字符)对相同的数据进行加密,然后对加密的数据进行base64编码,我总会得到不同的结果。但是,如果我在Ruby中使用MCRYPT_RIJNDAEL_128在Ruby中使用密钥(32个字符)和iv(16个字符),然后使用base64对加密数据进行编码,我会得到相同的结果。 – user812120 2012-04-17 13:25:47

1

这里是一些代码对我的作品:


def decrypt_data(data, pwd, iv) 
    encrypted_data = Base64.decode64(data) 
    aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC") 
    aes.decrypt 
    aes.key = Digest::MD5.hexdigest(pwd) 
    aes.iv = iv 
    result = aes.update(encrypted_data) + aes.final 
end 

在我的例子密码进行加密MD5。

我希望这能帮到

+0

非常感谢您的快速响应。但是,这似乎不适用于我。我是Ruby on Rails的新手。如果你能告诉我如何在Ruby on Rails中获得相同的结果,我将非常感激,如下面的php代码在php – user812120 2012-04-11 13:11:08

+0

中产生的如果我从上面的ruby代码中删除+ aes.final,我得到一个字符串,但它是不可读。 II不删除+ aes.final,我得到“坏解密”错误 – user812120 2012-04-11 13:49:16

+0

我发现这在PHP文档http://php.net/manual/fr/function.mcrypt-decrypt.php正如你所看到的,第一个评论sais“MCRYPT_RIJNDAEL_256不等同于AES_256”。这可能是一种方法... – 2012-04-11 13:55:54