我已经阅读了这些以前密切相关的问题以及非常有用的答案:
> How to make Ruby AES-256-CBC and PHP MCRYPT_RIJNDAEL_128 play well together
> Part II: 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.encryptc.key = saltcipher = c.update(plain)cipher << c.finalputs Digest::MD5.hexdigest(cipher)
输出:18dee36145c07ab83452aefe2590c391
解决方法 实际上通常不是一个openssl解决方案,但也许你可以有一个有效的例子.require 'mcrypt'require 'openssl'plaintext = 'password'puts plaintextkey = '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 password6337137fd88148250fd135a43dbeb84a
和我的ruby版本:
[~/test] ➔ ruby -versionruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux]
希望这可以帮助.
总结以上是内存溢出为你收集整理的我可以在ruby中复制PHP的AES加密的确切行为吗?全部内容,希望文章能够帮你解决我可以在ruby中复制PHP的AES加密的确切行为吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)