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 ?>
  • 相关阅读:
    增强for循环
    java魔性的类型
    回溯算法
    UE4报错cmd.exe failed with args /c
    C#中GetHashCode的各类实现
    Unity3D中的meta文件笔记
    数值分析笔记(3)——数值计算中的原则
    数值分析笔记(2)——有效数字
    数值分析笔记(1)——误差的来源和分类
    数值分析笔记(0)——数值分析研究的对象和内容
  • 原文地址:https://www.cnblogs.com/yx520zhao/p/6658688.html
Copyright © 2011-2022 走看看