zoukankan      html  css  js  c++  java
  • 单向加密 对称加密 非对称加密

    单向加密:

        单向加密又称为不可逆加密算法,在加密过程中不使用密钥,明文由系统加密处理成密文,密文无法解密。一般适合于验证,在验证过程中,重新输入明文,并经过同样的加密算法处理,得到相同的密文并被系统重新认证。广泛使用于口令加密。

      一:base64

        常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。

        主要就是BASE64Encoder、BASE64Decoder两个类

        BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充

       二:md5

         message-digest algorithm 5 

      三:Crypt加密:

        1.crypt()接受两个参数,第一个为需要加密的字符串,第二个为盐值(就是加密干扰值,如果没有提供,则默认由PHP自动生成);返回散列后的字符串或一个少于 13 字符的字符串,后者为了区别盐值。

        2.crypt()为单向加密,跟md5一样。

      四:Sha1加密:

        

    string sha1 ( string str[,boolraw_output = false ]

    1.跟md5很像,不同的是sha1()默认情况下返回40个字符的散列值,传入参数性质一样,第一个为加密的字符串,第二个为raw_output的布尔值,默认为false,如果设置为true,sha1()则会返回原始的20 位原始格式报文摘要

    2.sha1()也是单行加密,没有逆向解密算法

       五:Urlencode加密:
        

    string urlencode ( string $str )

    1.一个参数,传入要加密的字符串(通常应用于对URL的加密),

    2.urlencode为双向加密,可以用urldecode来加密(严格意义上来说,不算真正的加密)

    3.返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。

      
     
     
      对称加密:
     
        采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
      优缺点:

        对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。

        对称加密算法的缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。

      非对称加密:

      先说非对称加密  .  直接理解为   2把钥匙.  分别叫 公钥  私钥一把加密,另一把解密.   (每把都可用于加密,但是对应的那把才能解密)

      比如. 一间屋子,有2个门 ,对应2把不同的钥匙. 规则是,前门进,后门出或是后门前,前门出. 
    如果从前门进,只能使用前门钥匙进.  出去的话从后门出,只能使用后门钥匙.   
    如果后门进,就得用后门钥匙.出去走前门,只能用前门钥匙出. 
    那么PHP如何得到这两把钥匙呢,,,,php中,借助openssl实现.首先确定一下是否支持  phpinfo中 搜索 openssl 如果出现下图说明成功支持,本文建议在linux下测试

    在生成钥匙之前先要了解一个概念   1个是钥匙文件(里面是钥匙字符串) . 1个是钥匙对象.(专门用于各种操作,理解为实例化后使用)
    生成文件 代码如下

     1 <?php 
     2 //第一步,生成一把新钥匙对象这是私钥对象
     3 $key = openssl_pkey_new(); 
     4 //第二步,把生成的私钥,保存成私钥文件 
     5 openssl_pkey_export_to_file($key, './private.txt'); 
     6 //下面这句注视的意思是,从现有的私钥文件,获取到私钥对象
     7 //$key = openssl_get_privatekey(file_get_contents( './private.txt'));
     8 //从私钥中,获取公钥字符串  后面['key']的意思是从这个数组中直接获取该键
     9 $key_detail = openssl_pkey_get_details($key)['key'];
    10 //把公钥字符串,保存成文件 
    11 file_put_contents('./public.txt', $key_detail);
    12 echo '完成';

    刷新生成成功后.如图

    到此.钥匙获取完毕. 下一篇讲加密
    可以借助linux中的 ssh_keygen命令来生成 代码如下

     1 ssh-keygen -t rsa -N '' -f ./key -q 

    上面代码中  
    -t是指类型  rsa
    -N ''不需要密码
    -f 指定生成的私钥文件 是当前目录下的key
    -q 不需要废话.直接生成

    执行完后当前目录 会生成一个key 和一个key.pub  这两个文件 对应的也是公钥和私钥


    注意  php源码中这样定义

    1 enum php_openssl_key_type {
    2         OPENSSL_KEYTYPE_RSA,
    3         OPENSSL_KEYTYPE_DSA, 
    4         OPENSSL_KEYTYPE_DH,
    5         OPENSSL_KEYTYPE_DEFAULT = OPENSSL_KEYTYPE_RSA
    6 };

    可以看出.加密方式有rsa  dsa  dh   默认是rsa

     1 <?php 
     2 //第一步,取出私钥。 
     3 $private_key=openssl_get_privatekey(file_get_contents('./private.txt'));
     4 //第二步,取出公钥,2种方式 ,一种是从文件中取,如下
     5 //$public_key=openssl_get_publickey(file_get_contents('./public.txt'));
     6 //另一种是,从私钥里面取 ,理论上内存中计算要比文件中获取要快,两种方法任选其一
     7 $public_key=openssl_get_publickey(openssl_pkey_get_details($private_key)['key']);
     8 //原字符串
     9 $origin_str='中英文Abc+123';
    10 //使用公钥k加密函数进行加密,第一个参数原文,第二个参数是结果。 第三个参数是 公钥对象 (私钥对象会报错)
    11 openssl_public_encrypt($origin_str, $crypted, $public_key); 
    12 //var_dump($crypted是乱码);
    13 //使用公钥加密后。只能使用私钥解密函数进行解密,注意第三个参数是私钥对象
    14 openssl_private_decrypt($crypted, $decrypted, $private_key); 
    15 //var_dump($decrypted)得到了原文 
    16 //也可以 相反的操作。 私钥加密,公钥解密。如下
    17 openssl_private_encrypt($origin_str, $crypted, $private_key);
    18 openssl_public_decrypt($crypted, $result, $public_key);
    19 //vardump($result)也是原文

    一般实际应用中,其中一个页面加密后.传给另一个页面密文.然后通过密文进行解密.然后得到结果. 

    注意,公钥加密,需要私钥解密
    或是 私钥加密,公钥解密.   
    另外.公钥函数只能使用公钥对象. 私钥相同.
    还记得之前说过.私钥中提取公钥吗?所以说.最好使用公钥加密,以免传送过程被拦截私钥

    自己的代码:

     1 <?php
     2 //生成私钥文件
     3 //$key=openssl_pkey_new();
     4 //openssl_pkey_export_to_file($key,'./1.txt');
     5 
     6 //从文件中提取
     7 //$key=openssl_get_privatekey(file_get_contents('./1.txt'));
     8 //$key_dets=openssl_pkey_get_details($key)['key'];
     9 //
    10 //file_put_contents('./2.txt',$key_dets);
    11 
    12 
    13 //第一步 提取私钥
    14 $privatekey=openssl_get_privatekey(file_get_contents('./1.txt'));
    15 //第二步 取出公钥 2种方法 一种文件中取
    16 $putkey=openssl_get_publickey(file_get_contents('./5.txt'));
    17 
    18 //另一种从私钥文件中取
    19 //$putkey=openssl_get_publickey(openssl_pkey_get_details($privatekey)['key']);
    20 //原字符串
    21 //var_dump($privatekey,$putkey);
    22 
    23 $orign_str='中文';
    24 openssl_public_encrypt($orign_str,$crypted,$putkey);
    25 //var_dump($crypted);
    26 openssl_private_decrypt($crypted,$decrypted,$privatekey);
    27 var_dump($decrypted);
    28 ?>
  • 相关阅读:
    网络测量中基于Sketch方法的简单介绍
    Reading SBAR SDN flow-Based monitoring and Application Recognition
    Reading Meticulous Measurement of Control Packets in SDN
    Reading SketchVisor Robust Network Measurement for Sofeware Packet Processing
    ovs加dpdk在日志中查看更多运行细节的方法
    后缀数组
    (转载)LCA问题的Tarjan算法
    Codeforces Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) A. Checking the Calendar(水题)
    Vijos 1816统计数字(计数排序)
    卡特兰数
  • 原文地址:https://www.cnblogs.com/yx520zhao/p/6658688.html
Copyright © 2011-2022 走看看