gpt4 book ai didi

php - 我可以在 ruby​​ 中复制 PHP 的 AES 加密的确切行为吗?

转载 作者:可可西里 更新时间:2023-10-31 22:47:39 24 4
gpt4 key购买 nike

我正在用 Ruby on Rails 重建一个 PHP 网络应用程序,并且非常希望避免强制所有现有用户重置他们的加密密码。 PHP 站点将 mcrypt_encrypt 与 AES-256-ECB 结合使用,我终生无法使用 ruby​​ 的 OpenSSL 获得相同的密文。我也无法解密它们(原则上这很好),因为实际存储在用户数据库中的是 AES 密文的 MD5 哈希值。

我已经阅读了之前这些密切相关的问题和非常有用的答案:

包括那里引用的页面,如果我理解正确的话,PHP 和 ruby​​ 实现使用不同的填充方法。由于我不得不忍受 PHP 方面的工作方式,有没有办法以某种方式在 ruby​​/OpenSSL 上强制使用相同的填充方法?我正在使用 ruby 1.9.2-p180。

这是 PHP 中的示例代码:

$salt = "12345678901234567890123456789012";
$plain = "password";
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$cipher = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $plain, MCRYPT_MODE_ECB, $iv);

echo md5($cipher);

输出:6337137fd88148250fd135a43dbeb84a

在 ruby 中:

require 'openssl'

salt = "12345678901234567890123456789012"
plain = "password";

c = OpenSSL::Cipher.new("AES-256-ECB")
c.encrypt
c.key = salt
cipher = c.update(plain)
cipher << c.final

puts Digest::MD5.hexdigest(cipher)

输出:18dee36145c07ab83452aefe2590c391

最佳答案

实际上通常不是一个 openssl 解决方案,但也许您有一个工作示例就可以了。

require 'mcrypt'
require 'openssl'

plaintext = 'password'
puts plaintext

key = '12345678901234567890123456789012'

enc = Mcrypt.new(:rijndael_256, :ecb, key, nil, :zeros)
encrypted = enc.encrypt(plaintext)

puts Digest::MD5.hexdigest(encrypted)

我使用了一个额外的 gem(ruby-mcrypt)。似乎是 openssl 的问题。实际上,问题似乎是 Openssl 不支持零填充,而是使用无填充或默认 openssl 填充。由于您在 php 中使用零填充,因此您必须在 ruby​​ 中也使用零填充。

php 脚本在我的机器上的输出:

[~/test] ➔ php5 t.php 
6337137fd88148250fd135a43dbeb84a

对于 ruby​​ 脚本:

[~/test] ➔ ruby t2.rb 
password
6337137fd88148250fd135a43dbeb84a

和我的 ruby 版本:

[~/test] ➔ ruby -version
ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux]

希望这对您有所帮助。

关于php - 我可以在 ruby​​ 中复制 PHP 的 AES 加密的确切行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6699908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com