我可以在ruby中复制PHP的AES加密的确切行为吗?
我正在使用
Ruby on Rails重建
PHP Web应用程序,并且非常希望避免强制所有现有用户重置其加密密码. PHP网站使用
mcrypt_encrypt与AES-256-ECB,我不能在我的生活中使用ruby的
OpenSSL获得相同的密文.我也无法解密它们(原则上是好的)因为实际存储的是用户DB是AES密文的MD5哈希值.
我已经阅读了这些以前密切相关的问题以及非常有用的答案: > How to make Ruby AES-256-CBC and PHP MCRYPT_RIJNDAEL_128 play well together 包括那里引用的页面,如果我理解正确,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) 我使用了额外的宝石(ruby-mcrypt).似乎是openssl的一个问题.实际上问题似乎是Openssl不支持零填充并使用no-padding或default-openssl-padding.由于你在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] 希望这可以帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |