2012-04-11 144 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