CI加密,cryptojs解密, 使用aes-256-cbc
2016-06-01 18:16
537 查看
使用的版本为CodeIgniter 3.02., cryptojs 3.1.6, php需要支持php-openssl扩展,此外还使用了一个jquery扩展,用于base64转换(https://github.com/carlo/jquery-base64)
先上代码。
php代码
$this->load->library('encryption');
$key =$this->encryption->create_key(32);
$txt = '测试文本';
$this->encryption->initialize(['driver'=> 'openssl']);
$txt_encrypted =$this->encryption->encrypt($txt, ['cipher' => 'aes-256', 'mode' =>'cbc', 'key' => $key, 'hmac' =>false, 'raw_data' => false]);
$result = ['key' => base64_encode($key),'txt_encrypted' => $txt_encrypted];
$this->load->view('test_encryption',$result);
对应模板页的js代码
var txt = $.base64.decode("<?php echo $txt_encrypted;?>");
var key = "<?php echo $key; ?>";
var iv = $.base64.encode(txt.substr(0, 16));
var temp_txt = $.base64.encode(txt.substr(16));
var message = CryptoJS.format.OpenSSL.parse(temp_txt);
var decrypted = CryptoJS.AES.decrypt(message, CryptoJS.enc.Base64.parse(key), { iv:CryptoJS.enc.Base64.parse(iv), format: CryptoJS.format.OpenSSL});
document.writeln(decrypted.toString(CryptoJS.enc.Utf8));
先讲一下CI中的Encrytion类的加密处理。
在刚刚的示例中,调用Encrytion的encrypt方法时,做了下面几件事(因为我执行时手工配置了参数,只加密,不生成hash,因此略过了该步骤)。
1 生成一个随机的$iv向量。
2 调用openssl_encrypt()方法加密,得到加密结果$data。
3 返回base64_encode($iv.$data)。
我自己写了一段代码表示以上过程,如下:
$raw_txt = '这是用来测试的文本';
$key= openssl_random_pseudo_bytes(32); //随机生成一个32字节的key
$iv= openssl_random_pseudo_bytes(16); //随机生成一个16字节的 iv向量
$method= 'aes-256-cbc';
$encrypted_txt= openssl_encrypt($raw_txt, $method, $key, 1, $iv);
$data= base64_encode($iv.$encrypted_txt);
然后,就可以用Encrytion类解密了。
$this->load->library('encryption');
$decrypted_txt= $this->encryption->decrypt($data, ['cipher' => 'aes-256', 'mode'=> 'cbc', 'key' => $key, 'hmac' => false, 'raw_data' => false]);
assert($raw_txt== $decrypted_txt);
注意到在调用openssl_encrypt函数时的第4个参数,默认情况下这个参数是0,表示将结果用base64编码输出,这里为1,表示不进行编码。也就是
openssl_encrypt($raw_txt, $method, $key, 0,$iv) 等于base64_encode(openssl_encrypt($raw_txt, $method, $key, 1, $iv)
在使用cryptojs解码时,需要iv向量,所以我们要做下面这些事:
1 得到key和Encrytion->encrypt的输出data
2 分离data,得到iv和openssl加密后的文本
3 调用CryptoJS中的方法进行解密,得到文本
我将这几个文件一起打包上传了,使用的时候注意将文件放入正确的位置,并更改js文件的引用路径。
地址在这里 http://download.csdn.net/download/scorper/9538184
先上代码。
php代码
$this->load->library('encryption');
$key =$this->encryption->create_key(32);
$txt = '测试文本';
$this->encryption->initialize(['driver'=> 'openssl']);
$txt_encrypted =$this->encryption->encrypt($txt, ['cipher' => 'aes-256', 'mode' =>'cbc', 'key' => $key, 'hmac' =>false, 'raw_data' => false]);
$result = ['key' => base64_encode($key),'txt_encrypted' => $txt_encrypted];
$this->load->view('test_encryption',$result);
对应模板页的js代码
var txt = $.base64.decode("<?php echo $txt_encrypted;?>");
var key = "<?php echo $key; ?>";
var iv = $.base64.encode(txt.substr(0, 16));
var temp_txt = $.base64.encode(txt.substr(16));
var message = CryptoJS.format.OpenSSL.parse(temp_txt);
var decrypted = CryptoJS.AES.decrypt(message, CryptoJS.enc.Base64.parse(key), { iv:CryptoJS.enc.Base64.parse(iv), format: CryptoJS.format.OpenSSL});
document.writeln(decrypted.toString(CryptoJS.enc.Utf8));
先讲一下CI中的Encrytion类的加密处理。
在刚刚的示例中,调用Encrytion的encrypt方法时,做了下面几件事(因为我执行时手工配置了参数,只加密,不生成hash,因此略过了该步骤)。
1 生成一个随机的$iv向量。
2 调用openssl_encrypt()方法加密,得到加密结果$data。
3 返回base64_encode($iv.$data)。
我自己写了一段代码表示以上过程,如下:
$raw_txt = '这是用来测试的文本';
$key= openssl_random_pseudo_bytes(32); //随机生成一个32字节的key
$iv= openssl_random_pseudo_bytes(16); //随机生成一个16字节的 iv向量
$method= 'aes-256-cbc';
$encrypted_txt= openssl_encrypt($raw_txt, $method, $key, 1, $iv);
$data= base64_encode($iv.$encrypted_txt);
然后,就可以用Encrytion类解密了。
$this->load->library('encryption');
$decrypted_txt= $this->encryption->decrypt($data, ['cipher' => 'aes-256', 'mode'=> 'cbc', 'key' => $key, 'hmac' => false, 'raw_data' => false]);
assert($raw_txt== $decrypted_txt);
注意到在调用openssl_encrypt函数时的第4个参数,默认情况下这个参数是0,表示将结果用base64编码输出,这里为1,表示不进行编码。也就是
openssl_encrypt($raw_txt, $method, $key, 0,$iv) 等于base64_encode(openssl_encrypt($raw_txt, $method, $key, 1, $iv)
在使用cryptojs解码时,需要iv向量,所以我们要做下面这些事:
1 得到key和Encrytion->encrypt的输出data
2 分离data,得到iv和openssl加密后的文本
3 调用CryptoJS中的方法进行解密,得到文本
我将这几个文件一起打包上传了,使用的时候注意将文件放入正确的位置,并更改js文件的引用路径。
地址在这里 http://download.csdn.net/download/scorper/9538184
相关文章推荐
- 一个关于if else容易迷惑的问题
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- JSP/PHP基于Ajax的分页功能实现
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- PHP数据库长连接mysql_pconnect的细节
- Php Installing An Expansion
- rem : web app适配的秘密武器
- jquery高级应用之Deferred对象
- php7 读取php.ini[4]
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充
- Linux Apache+MySQL+PHP
- 建立Apache+PHP+MySQL数据库驱动的动态网站
- C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例
- PHP 5.3.0 安装分析心得
- apache 环境下 php 的配置注意事项