单向加密 对称加密 非对称加密

Posted 穷帅哥依然纵横一方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单向加密 对称加密 非对称加密相关的知识,希望对你有一定的参考价值。

单向加密:

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

  一: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 ?>

 

以上是关于单向加密 对称加密 非对称加密的主要内容,如果未能解决你的问题,请参考以下文章

数字签名数字证书对称加密算法非对称加密算法单向加密(散列算法)

PHP非对称加密

对称加密和非对称加密

数字签名数字证书对称加密算法非对称加密算法单向加密(散列算法)——Web网络系列学习笔记

对称加密算法以及使用方法

移动端加解密