zoukankan      html  css  js  c++  java
  • PHP openssl加密扩展使用总结

    1、检查服务器是否已安装了openssl组件,没有则先安装好

      openssl version [-a]

     

    2、对称加密

      查询openssl支持的对称加密算法

      openssl_get_cipher_methods();

    加密:openssl_encrypt($data, $method, $passwd, $options, $iv);

    参数说明:

    $data: 加密明文

    $method: 加密方法

    $passwd: 加密密钥

    $options: 数据格式选项(可选)

    $iv: 加密初始化向量(可选)

    解密:openssl_decrypt($data, $method, $passwd, $options, $iv);

    参数说明:

    $data: 解密密文

    $method: 解密加密方法

    $passwd: 解密密钥

    $options: 数据格式选项(可选)

    $iv: 解密初始化向量(可选)

     

    3、生成公钥、私钥对

    (1)生成原始RSA私钥文件rsa_private_key.pem

         openssl genrsa -out rsa_private_key.pem 1024

    (2)将原始的RSA私钥转换为pkcs8模式

      openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem

    (3)生成RSA公钥 rsa_public_key.pem

    openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

     

    4、使用私钥加密、公钥解密

       使用的私钥为上述生成的rsa_private_key.pem文件内容

       使用的公钥为上述生成的rsa_public_key.pem文件内容

     1 // 生成密钥资源id
     2 $pi_key = openssl_pkey_get_private($private_key);
     3 $pu_key = openssl_pkey_get_public($public_key);
     4 
     5 // 私钥加密
     6 $encrypted = ‘’;
     7 openssl_private_encrypt($data, $encrypted, $pi_key);
     8 
     9 // 转码,这里的$encrypted就是私钥加密的字符串
    10 $encrypted = base64_encode($encrypted);
    11 
    12 // 公钥解密,$decrypted即为公钥解密后私钥加密前的明文
    13 $decrypted = ‘’;
    14 $encrypted = base64_decode($encrypted);
    15 openssl_public_decrypt($encrypted, $decrypted, $pu_key);

    5、使用公钥加密、私钥解密

       使用的私钥为上述生成的rsa_private_key.pem文件内容

       使用的公钥为上述生成的rsa_public_key.pem文件内容

     1 // 生成密钥资源id
     2 $pi_key = openssl_pkey_get_private($private_key);
     3 $pu_key = openssl_pkey_get_public($public_key);
     4 
     5 // 公钥加密
     6 $encrypted = ‘’;
     7 openssl_public_encrypt($data, $encrypted, $pu_key);
     8 
     9 // 转码,这里的$encrypted就是公钥加密的字符串
    10 $encrypted = base64_encode($encrypted);
    11 
    12 // 私钥解密,$decrypted即为私钥解密后公钥加密前的明文
    13 $decrypted = ‘’;
    14 $encrypted = base64_decode($encrypted);
    15 openssl_private_decrypt($encrypted, $decrypted, $pu_key);

    完整代码演示:

     1 <?php
     2 /**
     3  * Created by PhpStorm.
     4  * User: ahao
     5  * Date: 2016/11/20
     6  * Time: 10:12
     7  */
     8 // 列出openssl加密扩展支持的对称加密方法
     9 /*$methods = openssl_get_cipher_methods();
    10 echo "<pre>";
    11 var_dump($methods);
    12 
    13 $iv = substr(md5('test'),0,8);
    14 $encrypt_data = openssl_encrypt('codeman is a good man','des-cbc','passwd',OPENSSL_RAW_DATA,$iv);
    15 $encrypt_data = openssl_encrypt('codeman is a good man','des-cbc','passwd',OPENSSL_RAW_DATA);
    16 echo $encrypt_data;
    17 echo "<br/>";
    18 
    19 $decrypt_data = openssl_decrypt($encrypt_data,'des-cbc','passwd',OPENSSL_RAW_DATA,$iv);
    20 echo $decrypt_data;*/
    21 
    22 // 私钥
    23 $private_key = '-----BEGIN RSA PRIVATE KEY-----
    24 MIICXAIBAAKBgQDS6VbgEpOwVc8jXYx/uL6ItMS6aBPVo8fvw0pd90jLJYvfJcFJ
    25 dYVFh6JPRdpGhlIrED45VdsktcJvJj0cLNI5ZIZ680aS6JTFe3ScBY4Mi7bLKzBN
    26 YtMBtnkAFbMmWlCXV4qzZYg8+xNktY5ClZZCvZzzlaU5djtUSoxTLkxcmwIDAQAB
    27 AoGAZT944gZo+bynvH17JhEk/nFxA19VLjj6kSH6AFPmkQcMN2pjeIU/Hhq3k0Cg
    28 QTzYEy4wAMwzcFME7OC5c14c6GsnOQVEbzT3jA5lNuMnrvb+ehyE0w/O7ah8sSLQ
    29 3B42GFKkaKiuY2ufsVC4pv6LMn5Sh26ApW332yO0dXZXagECQQDvAWV+n41R9pUp
    30 iB0+ycBvkuE6yjlohc2MqAxdD+EYNgO4jb1F21pZcqasd/SbpiQwVUKk/uxlOvl9
    31 3dBlcOWbAkEA4eiMv8UiGwBxjBGrz+I/tBq56gcnjvlOkJFyAyxbKaA1C9C51eVv
    32 39OftI9DqCzcuAYZsCmspb6XEPBIB01VAQJAZVyAQM1Fz+b1p6F0VbaWiDsQjjBJ
    33 XIyyed6jL6yWWABAX7qs9L1sedbn3OkashAp9N2T4AnFE8GJIdo6kWrp1QJAGOiF
    34 LFfWDNgdrO393av6jicsPIuRZwhCC1qeEY+AdbR+ZNEczGLB1RIGV+g7830O0ROL
    35 HYtax+Od0HZN2tBCAQJBANIg+HO5+Qy5hgRO3+uRHERgUQxqHzheLdo5GnoQ/sfT
    36 sex4mxgze6oq+HldvNWzVjBu9g9417T5WMgyWQ8Unhw=
    37 -----END RSA PRIVATE KEY-----';
    38 
    39 // 公钥
    40 $public_key = '-----BEGIN PUBLIC KEY-----
    41 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDS6VbgEpOwVc8jXYx/uL6ItMS6
    42 aBPVo8fvw0pd90jLJYvfJcFJdYVFh6JPRdpGhlIrED45VdsktcJvJj0cLNI5ZIZ6
    43 80aS6JTFe3ScBY4Mi7bLKzBNYtMBtnkAFbMmWlCXV4qzZYg8+xNktY5ClZZCvZzz
    44 laU5djtUSoxTLkxcmwIDAQAB
    45 -----END PUBLIC KEY-----';
    46 
    47 //这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
    48 $pi_key = openssl_pkey_get_private($private_key);
    49 
    50 //这个函数可用来判断公钥是否是可用的
    51 $pu_key = openssl_pkey_get_public($public_key);//这个函数可用来判断公钥是否是可用的
    52 
    53 print_r($pi_key);  echo "<br/>";
    54 print_r($pu_key);  echo "<br/>";
    55 
    56 // 原始数据
    57 $data = 'codeman';
    58 $encrypted = '';
    59 $decrypted = '';
    60 
    61 echo "source data:",$data,"<br/>";
    62 echo "private key encrypt:<br/>";
    63 echo "私钥加密,公钥解密:<br/>";
    64 
    65 // 私钥加密
    66 openssl_private_encrypt($data, $encrypted, $pi_key);
    67 $encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
    68 echo $encrypted,"<br/>";
    69 
    70 // 公钥解密
    71 echo "public key decrypt:<br/>";
    72 openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来
    73 echo $decrypted,"<br/><br/>";
    74 
    75 echo "公钥加密,私钥解密:<br/>";
    76 //公钥加密
    77 openssl_public_encrypt($data, $encrypted, $pu_key);
    78 $encrypted = base64_encode($encrypted);
    79 echo $encrypted,"<br/>";
    80 
    81 // 私钥解密
    82 echo "private key decrypt:<br/>";
    83 openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私钥解密
    84 echo $decrypted,"<br/>";

    6、PHP openssl和mcrypt扩展的区别

    openssl是一种公私钥的网络通信安全协议,也算一种加密模式,php的openssl扩展是为了用这个协议加密和解密传输数据用的。与mcrypt相比,openssl支持更多的加密方法,使用更加简单,支持非对称加密解密,是安装签名https的核心组件。

  • 相关阅读:
    物流能力和综合层次结构
    new Eclipse 3.0+Lomboz 3.0+Tomcat 5.0.16配置
    30件你不知道可以通过Internet来办到的事
    《网上苏州》电子地图建设方案
    IT从业人员必看的10个论坛
    非常在线网站站长自述创业经历
    防止对 Visual Basic .NET 或 C# 代码进行反相工程
    略论中国人的思维方式
    C# vs. Java:相反的思维方式 (译文)
    Java多线程编程经验谈
  • 原文地址:https://www.cnblogs.com/huyihao/p/6082765.html
Copyright © 2011-2022 走看看