在Ruby中解密PHP MCRYPT_RIJNDAEL_256

时间:2014-05-19 18:49:12

标签: php ruby-on-rails ruby encryption mcrypt

我有一个填充了加密密码的数据库,我需要在Ruby中解密以进行平台更​​改。如何将这个PHP代码移植到Ruby?尝试过使用带有AES_256的Ruby中的OpenSSL,但是得到了“坏解密”#39;错误以及我的密钥($ salt)不够长的错误。

在下面的示例中,$ salt是一个25个字符的字符串。

这是PHP解密函数:

function decrypt_password($text, $salt)
{
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256,
        $salt, base64_decode($text), MCRYPT_MODE_ECB, 
        mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB),
        MCRYPT_RAND)));
}

2 个答案:

答案 0 :(得分:4)

还有一个用于mcrypt的ruby库。请参阅下面的示例实现:

require 'mcrypt'
require 'base64'

# base64_decode() equivalent
encrypted = Base64.decode64(text)

# preparing Mcrypt library for Rijndael cipher, 256 bits, ECB mode
cipher = Mcrypt.new(:rijndael_256, :ecb, salt, nil, :zeros)

# padding required
encrypted = encrypted.ljust((encrypted.size / 32.0).ceil * 32, "\0") 

# decrypt using Rijndael
decrypted = cipher.decrypt(encrypted).strip

依赖关系:libmcrypt

  • sudo apt-get install libmcrypt-dev(Ubuntu / Debian)
  • sudo yum install libmcrypt-devel(RHEL / CentOS / Fedora)

宝石:mcrypt

  • gem install ruby-mcrypt

答案 1 :(得分:3)

MCRYPT_RIJNDAEL_256算法实现AES,它使用256位块大小实现Rijndael。这不是默认模式,您可以找到Ruby here的实现。

此外,您似乎使用$salt变量作为键。密钥会自动扩展到下一个可用密钥大小。对于25个字节键,我假设将使用256位(32字节)密钥。这是$salt值,使用值为00的字节进行扩展。请注意,我假定每个字符都被编码为系统中的单个字节。

最后一个惊喜,您可以放心地忽略代码的mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)部分,因为ECB模式不使用IV,因此它返回的值被完全忽略。请注意,对字符串使用ECB模式 - 当然也使用密码 - 并不安全。

您应该至少使用带有随机IV的AES CBC。如果您不需要密码本身的值,则应考虑使用bcrypt而不是加密。