<?php
 /**
  * Created by PhpStorm.
  * User: hanks
  * Date: 6/2/2017
  * Time: 6:03 PM
  */
 //使用php函数生成密钥对
 //openssl模块提供了很多openssl相关的函数,参考手册 生成密钥对的方法如下:
 $privateKey = openssl_pkey_new([
     'private_key_bits' => 2048,  // private key的大小
     'private_key_type' => OPENSSL_KEYTYPE_RSA,
 ]);

 openssl_pkey_export_to_file($privateKey, 'php-private.key');
 $key = openssl_pkey_get_details($privateKey);
 file_put_contents('php-public.key', $key['key']);

 openssl_free_key($privateKey); // 释放资源
 <?php
 /**
  * Created by PhpStorm.
  * User: hanks
  * Date: 6/8/2017
  * Time: 12:20 PM
  */
 //使用密钥对加密数据
 //使用第一步的php函数生成的公钥对一段明文进行分段(chunk)再分段加密,(实际使用中也可以直接全部文本加密):
 //$plain = 'this is a 测试的数据';
 $plain = [
     0=>[
         '0'=>'sd',
         '1'=>'使得'
     ],
     1=>[
         '0'=>'sd2',
         '1'=>'使得2'
     ],
 ];
 echo 'plian text: ' . json_encode($plain,true);
 $plain = gzcompress(json_encode($plain,true)); // compress data
 $pubkeyStr = file_get_contents('./php-public.key');
 $publicKey = openssl_pkey_get_public($pubkeyStr);

 $p_key = openssl_pkey_get_details($publicKey);
 $chunkSize = ceil($p_key['bits'] / 8) -11; // 这里不知道为什么要-11,后面追加解释

 $output = '';

 while ($plain) {
     $chunk = substr($plain, 0, $chunkSize);
     $plain = substr($plain, $chunkSize);

     $encrypted = '';
     if ( !openssl_public_encrypt($chunk, $encrypted, $publicKey)) {
         die("failed to encrypt data");
     }
     $output .= $encrypted;
 }
 openssl_free_key($publicKey);
 $output = base64_encode($output);
 echo 'encrypted: ' . ($output);
 file_put_contents('./enc.data', $output);
 <?php
 /**
  * Created by PhpStorm.
  * User: hanks
  * Date: 6/8/2017
  * Time: 12:22 PM
  */
 //解密数据
 //使用私钥对数据进行解密:
 $keyStr = file_get_contents('./php-private.key');
 if (!$privateKey = openssl_pkey_get_private($keyStr)) {
     die('get private key failed');
 }

 $encrypted = file_get_contents('./enc.data');
 echo 'encrypted data: ' . $encrypted;

 $encrypted = base64_decode($encrypted);

 $p_key = openssl_pkey_get_details($privateKey);
 $chunkSize = ceil($p_key['bits'] / 8);
 $output = '';

 while ($encrypted) {
     $chunk = substr($encrypted, 0, $chunkSize);
     $encrypted = substr($encrypted, $chunkSize);
     $decryptd = '';
     if (!openssl_private_decrypt($chunk, $decryptd, $privateKey)) {
         die('failed to decrypt data');
     }
     $output .= $decryptd;
 }
 openssl_free_key($privateKey);
 $output = gzuncompress($output);
 echo "\ndecrypted data: ";
 var_dump(json_decode($output,true));

最新文章

  1. linux中kvm的安装及快照管理
  2. BZOJ1315 : Ural1557Network Attack
  3. js-小效果-手风琴
  4. watch 命令实时命令执行监控
  5. mysql数据库备份及恢复命令mysqldump,source的用法
  6. TeamViewer
  7. Git教程(2)官方命令文档及常用命令表
  8. Android(java)学习笔记248:ContentProvider使用之虚拟短信
  9. Android中的菜单
  10. [Leetcode][Python]20: Valid Parentheses
  11. 转:携程App的网络性能优化实践
  12. [Leetcode] 220. Contains Duplicate III
  13. P1273 有线电视网
  14. mysql MHA高可用测试
  15. CentOS下使用tcpdump网络抓包
  16. hibernate状态转换关系图【原】
  17. [ASP.NET]ScriptManager控件使用
  18. idea使用优化
  19. Linux input子系统简介
  20. ffmpeg——关于视频压缩

热门文章

  1. hadoop进不去web界面
  2. Java IO详解(五)------包装流
  3. hive网站日志数据分析
  4. Java图书管理系统(用Java常用集合实现)
  5. Javascript性能优化之节流函数
  6. UITextField关闭自动联想功能
  7. java虚拟机学习-JVM调优总结-分代垃圾回收详述(9)
  8. Mac主机映射到域名
  9. 用c++实现高精度加法
  10. 建造者模式—设计角度重温DNF中的角色