【问题标题】:Decrypting PHP MCRYPT_RIJNDAEL_256 in Ruby在 Ruby 中解密 PHP MCRYPT_RIJNDAEL_256
【发布时间】:2014-07-07 20:16:49
【问题描述】:

我有一个充满加密密码的数据库,我需要在 Ruby 中对其进行解密以进行平台更​​改。如何将此 PHP 代码移植到 Ruby?尝试在 Ruby 中使用带有 AES_256 的 OpenSSL,但出现“错误解密”错误以及我的密钥 ($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)));
}

【问题讨论】:

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


    【解决方案1】:

    还有一个用于 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

    【讨论】:

    • 其他答案提供了丰富的信息,但这实际上回答了我的完全相同的问题。在使用 ruby​​ 对需要解密的 300,000 多条记录进行 ETL 后刚刚确认。谢谢!
    • @TheLonelyGhost 这是一个非常大的编辑,你能解释一下你在那里做了什么吗?为什么要对代码进行如此大的修改?
    • @owlstead 我添加了 cmets 解释每一行,重构代码以完全适合问题中给出的变量名称以增加清晰度,并指出依赖关系以及如何在一些平台上安装它们。这有望澄清原始海报的意图。
    • 好的,批准了。感谢您的编辑。 Petr,这是一个广泛的编辑,如果您不同意,请回滚 - 这对我来说似乎很好。
    • 我觉得不错。感谢@TheLonelyGhost 将我的原始代码 sn-p 更改为真实答案。
    【解决方案2】:

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

    此外,您似乎使用$salt 变量作为键。密钥会自动扩展到下一个可用密钥大小。对于 25 个 byte 密钥,我假设将使用 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 而不是加密。

    【讨论】:

    • 请注意,我使用互联网搜索找到了 Ruby 代码,我无法保证它甚至可以工作。
    • 意识到欧洲央行的问题...这不是我的代码,而是其他人的代码,因此过渡! :) 谢谢,看看!
    • 不客气。见面别忘了踢同事:P
    • 我将使用一些不同的解决方案(本质上是回调 PHP 代码),因为这样做会更容易一些,所以我接受你的回答跨度>
    • @TheLonelyGhost 快速搜索显示它可能已移至github here
    猜你喜欢
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2018-01-24
    • 2015-10-04
    • 1970-01-01
    • 2013-08-08
    • 2015-03-26
    • 1970-01-01
    相关资源
    最近更新 更多