【问题标题】:Ruby to decrypt PHP encrypted textRuby 解密 PHP 加密文本
【发布时间】:2015-03-26 23:58:18
【问题描述】:

我想使用 Ruby 来解密一个用 PHP 加密的字符串。相同的解密逻辑适用于 PHP,但 Ruby 代码返回垃圾。

工作 PHP 示例:

<?php

$_RIJNDAEL_KEY_ = "uUxJIpSKMbOQQdtm6Y4rPEXeE9TAKUns";
$_RIJNDAEL_IV_ = "PiToVoRjwlg8UwxUxQKI4w==";
$ciphertext = 'T353/s48iKzAf61b2dCOnqUApYa4xxjye8he4oAtJHyyCKl8sCbI33hfP6IqOsQZEIWeQBCsvy97xwJMPD8RwLG4J0wgX9Ihlti1vMar+5nrLrCR4lAfZcoJopoBt1JVnDAojLW+y0S0y5c4GCdB8YrHzj4jv70dg3yX8DxlAWE=';


$content = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $_RIJNDAEL_KEY_, base64_decode($ciphertext), MCRYPT_MODE_ECB, $_RIJNDAEL_IV_);
echo $content . "\n";

?>

不工作的 Ruby 示例:

require "openssl"
require "digest"
require "uri"
require "base64"

data = Base64.decode64("T353/s48iKzAf61b2dCOnqUApYa4xxjye8he4oAtJHyyCKl8sCbI33hfP6IqOsQZEIWeQBCsvy97xwJMPD8RwLG4J0wgX9Ihlti1vMar+5nrLrCR4lAfZcoJopoBt1JVnDAojLW+y0S0y5c4GCdB8YrHzj4jv70dg3yX8DxlAWE=")
key = Base64.decode64('uUxJIpSKMbOQQdtm6Y4rPEXeE9TAKUns')
iv = Base64.decode64('PiToVoRjwlg8UwxUxQKI4w==')
aes = OpenSSL::Cipher.new('AES-128-ECB')

aes.decrypt
aes.padding = 0
aes.key = key
aes.iv = iv

plain = aes.update(data) + aes.final
puts plain

有人能解释一下吗?谢谢。

【问题讨论】:

  • 为什么Ruby版本的key和iv都做base64解码,PHP版本不行?

标签: ruby encryption


【解决方案1】:

这里的一切都是正确的。但。 在您的示例中必须使用 AES-256-ECB。

这里的代码是runnable:

require "openssl"
require "digest"
require "uri"
require "base64"

data = 'T353/s48iKzAf61b2dCOnqUApYa4xxjye8he4oAtJHyyCKl8sCbI33hfP6IqOsQZEIWeQBCsvy97xwJMPD8RwLG4J0wgX9Ihlti1vMar+5nrLrCR4lAfZcoJopoBt1JVnDAojLW+y0S0y5c4GCdB8YrHzj4jv70dg3yX8DxlAWE='
key = "uUxJIpSKMbOQQdtm6Y4rPEXeE9TAKUns"
#iv = 'PiToVoRjwlg8UwxUxQKI4w=='
aes = OpenSSL::Cipher::AES.new(256, :ECB)

#  Without padding checksum|4033315172 will be truncated!
aes.padding = 0
aes.decrypt
aes.key = key
#aes.iv = iv

plain = aes.update(data.unpack('m')[0]) + aes.final

decrypt 之后,我得到了以下内容:

=> "date_add|2015-01-28 01:36:17\xC2\xA4id_lang|1\xC2\xA4id_currency|1\xC2\xA4id_guest|12165\xC2\xA4id_connections|10668\xC2\xA4checksum|4033315172\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"

接下来。在此示例中没有零填充,checksum 的最后一个字符将被截断。如果可能,请不要使用 EBC 模式。 Here 就是原因。

最后,在这个例子中你不需要 IV。 祝你好运!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 2011-05-27
  • 2014-10-24
相关资源
最近更新 更多