设为首页 收藏本站
查看: 717|回复: 0

[经验分享] 对 php 实现的 aes-128-cbc 加密解密进行 ruby 翻译,不兼容?困惑

[复制链接]

尚未签到

发表于 2017-4-12 11:16:30 | 显示全部楼层 |阅读模式
- 最近需要将一段 php 写的 aes-128-cbc 的加密和解密用 ruby 语言实现,翻译过程中没思路了,不知如何是好!
- 要达到的目的是:ruby 加密解密的结果能直接兼容这个被翻译的 php 加密机密方法。
==========================================================================================
- php 加密方法:

public static function aes128cbcEncrypt($key, $text) {
/* Open the cipher */
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
if (! $td) {
throw new GeneralSecurityException('Invalid mcrypt cipher, check your libmcrypt library and php-mcrypt extention');
}
// replaced MCRYPT_DEV_RANDOM with MCRYPT_RAND since windows doesn't have /dev/rand :)
srand((double)microtime() * 1000000);
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
/* Intialize encryption */
mcrypt_generic_init($td, $key, $iv);
/* Encrypt data */
$encrypted = mcrypt_generic($td, $text);
/* Terminate encryption handler */
mcrypt_generic_deinit($td);
/*
*  AES-128-CBC encryption.  The IV is returned as the first 16 bytes
* of the cipher text.
*/
return $iv . $encrypted;
}


- php 解密方法:

public static function aes128cbcDecrypt($key, $encrypted_text) {
/* Open the cipher */
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
if (is_callable('mb_substr')) {
$iv = mb_substr($encrypted_text, 0, Crypto::$CIPHER_BLOCK_SIZE, 'latin1');
} else {
$iv = substr($encrypted_text, 0, Crypto::$CIPHER_BLOCK_SIZE);
}
/* Initialize encryption module for decryption */
mcrypt_generic_init($td, $key, $iv);
/* Decrypt encrypted string */
if (is_callable('mb_substr')) {
$encrypted = mb_substr($encrypted_text, Crypto::$CIPHER_BLOCK_SIZE, mb_strlen($encrypted_text, 'latin1'), 'latin1');
} else {
$encrypted = substr($encrypted_text, Crypto::$CIPHER_BLOCK_SIZE);
}
$decrypted = mdecrypt_generic($td, $encrypted);
/* Terminate decryption handle and close module */
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
/* Show string */
return trim($decrypted);
}


-------------------------------------------------------------------------
# 翻译demo
- ruby encryption:

require 'openssl'
text = "abcdefghijklmnopqrstuvwxyz"
key = "1234567890123456"
alg = "AES-128-CBC"
iv = "6543210987654321"
file_name = "ruby.encrypted"
file_name_2 = "ruby.decrypted"
puts %(clear text:    "#{text}")
puts %(symmetric key: "#{key}")
puts %(initialization vector: "#{iv}")
puts %(cipher alg:    "#{alg}")
puts "--Encrypting--"
des = OpenSSL::Cipher::Cipher.new(alg)
des.encrypt
des.key = key
des.iv = iv
cipher =  des.update(text)
cipher << des.final
puts %(encrypted text: #{cipher})
puts
file = File.open(file_name, "w")
file.truncate(0)
file << cipher
file.close


- ruby decryption:

require 'openssl'
text = "abcdefghijklmnopqrstuvwxyz"
key = "1234567890123456"
alg = "AES-128-CBC"
iv = "6543210987654321"
file_name = "ruby.encrypted"
file_name_2 = "ruby.decrypted"
puts %(clear text:    "#{text}")
puts %(symmetric key: "#{key}")
puts %(initialization vector: "#{iv}")
puts %(cipher alg:    "#{alg}")
file = File.open(file_name, "r")
text = file.read(999999)
file.close
puts "--Decrypting--"
des = OpenSSL::Cipher::Cipher.new(alg)
des.decrypt
des.key = key
des.iv = iv
out =  des.update(text)
out << des.final
puts %(decrypted text: "#{out}")
puts
file = File.open(file_name_2, "w")
file.truncate(0)
file << des.final
file.close


- php encryption:

$text = "abcdefghijklmnopqrstuvwxyz";
$key = "1234567890123456";
$alg = "rijndael-128";
$iv = "6543210987654321";
$file_name = "php.encrypted";
$file_name_2 = "php.decrypted";
$mode = "cbc";
echo("clear test: $text\n");
echo("symmetric key: $key\n");
echo("initialization vector: $iv\n");
echo("cipher alg: $alg\n");
$td = mcrypt_module_open($alg, NULL, $mode, NULL);
//$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), $iv);
mcrypt_generic_init($td, $key, $iv);
$result = mcrypt_generic($td, $text);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
echo "result: $result\n";
$file = fopen($file_name, "w");
fwrite($file, $result);
fclose($file);


- php decryption:

$text = "abcdefghijklmnopqrstuvwxyz";
$key = "1234567890123456";
$alg = "rijndael-128";
$iv = "6543210987654321";
$file_name = "php.encrypted";
$file_name_2 = "php.decrypted";
$mode = "cbc";
$file = fopen($file_name, "r");
$text = fread($file, filesize($file_name));
fclose($file);
echo("clear test: $text\n");
echo("symmetric key: $key\n");
echo("initialization vector: $iv\n");
echo("cipher alg: $alg\n");
$td = mcrypt_module_open($alg, NULL, $mode, NULL);
//$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), $iv);
mcrypt_generic_init($td, $key, $iv);
$result = mdecrypt_generic($td, $text);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
echo "result: >>>$result<<<\n";
$file = fopen($file_name_2, "w");
fwrite($file, $result);
fclose($file);


==========================================================================================
从demo的运行对比来看加密解密貌似不兼容,我只是最近才接触这个东西,在此希望这方面的高手同行给予些帮助,
Thanks.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-363860-1-1.html 上篇帖子: PHP 应用程序的安全 -- 不能违反的四条安全规则 下篇帖子: PHP中功能强大却少使用的函数 -- 为你提供更多的思路
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表