电脑资源网

 找回密码
 立即注册
查看: 59|回复: 0

PHP中常用加解密方式PHP中使用OpenSSL生成RSA公钥私钥及进行...,

[复制链接]

3

主题

3

帖子

17

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
17
发表于 2019-9-1 16:22:11 | 显示全部楼层 |阅读模式
PHP中使用OpenSSL生成RSA公钥私钥及进行加密解密示例
加密基础
加密算法一般分为两种:对称加密算法和非对称加密算法。

对称加密
对称加密算法是消息发送者和接收者使用同一个密匙,发送者使用密匙加密了文件,接收者使用同样的密匙解密,获取信息。常见的对称加密算法有:des/aes/3des.

对称加密算法的特点有:速度快,加密前后文件大小变化不大,但是密匙的保管是个大问题,因为消息发送方和接收方任意一方的密匙丢失,都会导致信息传输变得不安全。

非对称加密
与对称加密相对的是非对称加密,非对称加密的核心思想是使用一对相对的密匙,分为公匙和私匙,私匙自己安全保存,而将公匙公开。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。发送数据前只需要使用接收方的公匙加密就行了。常见的非对称加密算法有RSA/DSA:

非对称加密虽然没有密匙保存问题,但其计算量大,加密速度很慢,有时候我们还需要对大块数据进行分块加密。

数字签名
为了保证数据的完整性,还需要通过散列函数计算得到一个散列值,这个散列值被称为数字签名。其特点有:

无论原始数据是多大,结果的长度相同的;
输入一样,输出也相同;
对输入的微小改变,会使结果产生很大的变化;
加密过程不可逆,无法通过散列值得到原来的数据;
常见的数字签名算法有md5,hash1等算法。

php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密
一、公钥加密
假设一下,我找了两个数字,一个是1,一个是2。我把2保留起来,不告诉你们,当做我的私钥,然后我告诉大家,1是我的公钥。

我有一个文件,不能让别人看,我就用1加密了。别人找到了这个文件,但是他不知道2就是解密的私钥啊,所以他解不开,只有我可以用数字2,就是我的私钥,来解密。这样我就可以保护数据了。

我的好朋友x用我的公钥1加密了字符a,加密后成了b,放在网上。别人偷到了这个文件,但是别人解不开,因为别人不知道2就是我的私钥,只有我才能解密,解密后就得到a。这样,我们就可以传送加密的数据了。

二、私钥签名
如果我用私钥加密一段数据(当然只有我可以用私钥加密,因为只有我知道2是我的私钥),结果所有的人都看到我的内容了,因为他们都知道我的公钥是1,那么这种加密有什么用处呢?

但是我的好朋友x说有人冒充我给他发信。怎么办呢?我把我要发的信,内容是c,用我的私钥2,加密,加密后的内容是d,发给x,再告诉他解密看是不是c。他用我的公钥1解密,发现果然是c。
这个时候,他会想到,能够用我的公钥解密的数据,必然是用我的私钥加的密。只有我知道我得私钥,因此他就可以确认确实是我发的东西。
这样我们就能确认发送方身份了。这个过程叫做数字签名。当然具体的过程要稍微复杂一些。用私钥来加密数据,用途就是数字签名。

三、总结
公钥和私钥是成对的,它们互相解密。

公钥加密,私钥解密。

私钥数字签名,公钥验证。

简单测试

代码:

  1. <?php

  2. $config = array(
  3.     "digest_alg"    => "sha512",
  4.     "private_key_bits" => 4096,           //字节数  512 1024 2048  4096 等 ,不能加引号,此处长度与加密的字符串长度有关系,可以自己测试一下
  5.     "private_key_type" => OPENSSL_KEYTYPE_RSA,   //加密类型
  6.   );
  7. $res =    openssl_pkey_new($config);

  8. //提取私钥
  9. openssl_pkey_export($res, $private_key);

  10. //生成公钥
  11. $public_key = openssl_pkey_get_details($res);
  12. // var_dump($public_key);

  13. $public_key=$public_key["key"];

  14. //显示数据
  15. var_dump($private_key);    //私钥
  16. var_dump($public_key);     //公钥

  17. //要加密的数据
  18. $data = "http://www.cnblogs.com/wt645631686/";
  19. echo '加密的数据:'.$data."\r\n";  

  20. //私钥加密后的数据
  21. openssl_private_encrypt($data,$encrypted,$private_key);

  22. //加密后的内容通常含有特殊字符,需要base64编码转换下
  23. $encrypted = base64_encode($encrypted);
  24. echo "私钥加密后的数据:".$encrypted."\r\n";  

  25. //公钥解密  
  26. openssl_public_decrypt(base64_decode($encrypted), $decrypted, $public_key);
  27. echo "公钥解密后的数据:".$decrypted,"\r\n";  
  28.   
  29. //----相反操作。公钥加密
  30. openssl_public_encrypt($data, $encrypted, $public_key);
  31. $encrypted = base64_encode($encrypted);  
  32. echo "公钥加密后的数据:".$encrypted."\r\n";
  33.   
  34. openssl_private_decrypt(base64_decode($encrypted), $decrypted, $private_key);//私钥解密  
  35. echo "私钥解密后的数据:".$decrypted."n";
复制代码

命令运行或者url请求
# php -f index.php
  1. string(916) "-----BEGIN PRIVATE KEY-----
  2. MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANSzr5MouSpOUAEv
  3. pCubJKB51kqHibfUv3+sfZyKchZ8tDzBtkKZmTIdHRSOz66LwMJWoq+U8Cm1v5X1
  4. tL8NCQR73EWkcx3IBM+KOO5+hTfXJFTWep+6EL5ijEbvQ7iRVA8hXPUrZBU4jZlb
  5. hnmC/XTyFLDrsHzxcpGj7Brp5h+lAgMBAAECgYEAyRe4fuCZby3q5bQs+i0LS8zk
  6. lEHgKjSxd/uUJlOd2TS9ElPyBLVC6OYtgCokn1jxPMq7tFSTWlvCbfyGjbm9Mw0+
  7. gViOQYZM9l7iwZP628dMUwKkbyo+wbbFkRYHtZy6FOaIByujV0M2nwU7d6rx5R0M
  8. YB5nAE4EqV8CkKYDvWECQQD9wN2G/h7RJrTbYcIOlP3oxI47LQaYCxLm1/fJ54+C
  9. Lsqi3jmygzukHE4ajDdoMe5DatOkljr7+kORVy8kQWCzAkEA1pXG4jGO3F1oRuHh
  10. iwYkTiFDDsL2x3bDSsFEShy/ogl2d/aPoMN8gcapgbghfMJnL8PBzHo3sQdMG3T1
  11. pxV6RwJBAK6uZRF3wEkkhx36pvcY0823+V19OmvSO7nT9Ez2bhElGvORXVCpDJaF
  12. sbKO0dmVfbrFQFqt3H73oincRaSEqQcCQCWwowEhwTz1bxZcIFhh2MicUQHrvpqk
  13. QoMD1THLQOF+Ff/WH74V9+13blhpdgBKyQL7uDNpGBUQ+g4sieUyAYsCQGo7jXSE
  14. UnF15+/VQTf0pU1yZyAocQM4j3HKC+dGkkZ/ahPM0cCU0j9QDmlkJkNPzc3IadRW
  15. eo90yANFW/Y3awk=
  16. -----END PRIVATE KEY-----
  17. "
  18. string(272) "-----BEGIN PUBLIC KEY-----
  19. MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDUs6+TKLkqTlABL6QrmySgedZK
  20. h4m31L9/rH2cinIWfLQ8wbZCmZkyHR0Ujs+ui8DCVqKvlPAptb+V9bS/DQkEe9xF
  21. pHMdyATPijjufoU31yRU1nqfuhC+YoxG70O4kVQPIVz1K2QVOI2ZW4Z5gv108hSw
  22. 67B88XKRo+wa6eYfpQIDAQAB
  23. -----END PUBLIC KEY-----
  24. "
复制代码
  1. 加密的数据:http://www.cnblogs.com/wt645631686/

  2. 私钥加密后的数据:ExLfHHqnUs/Ykna6d0sV7bxAU8WVbPrt5MPzHma+lJskT8Nwdrkoz9O7tuihHROltEgOIs6rwgDrDYYiNtqqO/Co0vd8NplikX21EPxvyjDHGpfCiYcG1eA+z3FGqQ4e0+KfgiroDIu+iQrlUfQ8z+UQX2yniRnIF/DM6Bbg4e8=

  3. 公钥解密后的数据:http://www.cnblogs.com/wt645631686/

  4. 公钥加密后的数据:QQNK+QBYgQzyHP+ez9fFC8Eo6zuLKMHuaRCfjQWSnMBY9JlntMXUEKDE/GS2mnpiwMByCyG+1l1kL/wVjFl/nwFUrhQhYYW+rgbJaWHGeRIdhqp7ixFOHZXdswCVHeDcluj2Ls/cLeo9v2lU7Y9DRgPUo+T4vudgTSTeiW4mbpw=

  5. 私钥解密后的数据:http://www.cnblogs.com/wt645631686
复制代码
  1. <?php

  2. //生成证书
  3. function exportOpenSSLFile(){
  4.   $config = array(
  5.     "digest_alg"        => "sha512",
  6.     "private_key_bits"     => 4096,           //字节数  512 1024 2048  4096 等
  7.     "private_key_type"     => OPENSSL_KEYTYPE_RSA,   //加密类型
  8.   );
  9.   $res = openssl_pkey_new($config);
  10.   if ( $res == false ) return false;
  11.   openssl_pkey_export($res, $private_key);
  12.   $public_key = openssl_pkey_get_details($res);
  13.   $public_key = $public_key["key"];
  14.   file_put_contents("./cert_public.key", $public_key);
  15.   file_put_contents("./cert_private.pem", $private_key);
  16.   openssl_free_key($res);
  17. }
  18. //加密解密
  19. function authcode($string, $operation = 'E') {
  20.   $ssl_public     = file_get_contents("./cert_public.key");
  21.   $ssl_private    = file_get_contents("./cert_private.pem");
  22.   $pi_key         = openssl_pkey_get_private($ssl_private);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
  23.   $pu_key         = openssl_pkey_get_public($ssl_public);//这个函数可用来判断公钥是否是可用的
  24.   if( false == ($pi_key || $pu_key) ) return '证书错误';
  25.   $data = "";
  26.   if( $operation == 'D') {
  27.     openssl_private_decrypt(base64_decode($string),$data,$pi_key);//私钥解密
  28.   } else {
  29.     openssl_public_encrypt($string, $data, $pu_key);//公钥加密
  30.     $data = base64_encode($data);
  31.   }
  32.   return $data;
  33. }
  34. // exportOpenSSLFile();         //生成秘钥证书
  35. echo authcode('http://www.cnblogs.com/wt645631686/','E');        //加密
  36. echo authcode('dBYP0fSjY1i0yM+TOaP8vwlUcCC4XvNIcWQGjNZCvajABE40wjHEUTuwauCIkqBzjCb04prcBkvsZdEO1VoBCmOOqL5CBsIm0yHjjnLHR6XaPfdcFjdsR/9oeQq2JGLMzjym/txgvxJyyl3RikjnzHvYQ4bxMS8G2ajWaHZjDSp+fddEBcDkHgPiJGfNosDtpC3FOeuK6LW9ShrjB3QD5s+hTY8iUC38+dnnhdEUGtfeF02mShC5gfxl6uGz/5LHbzDV1wvWz+ybd3axMZ5vSIlL8QDWnohYpRar1NBZhEv/QtKaV6teCI1Yj15aIvfhQYbT+K2EbakSYQ6pOHAs6gbmhMo7Gc4iD1UXl1Qr7qW8uhTDz2vek1JqFUnU9B845dWPEv3u1DKzDxjXwiqNoghtu4R1iZOBKMaykUVu6yZH/mJdJiDCwOmM3l+c8YAbCsYTH2gI5E/DE8km9Cecm8GY252s9hGqWUGm2kGZXTjRl+MAkHD4zRJIyAExwX5yiq/FpvBj6v/E32H/06/jodw22WyHuvpPi33rAgbyAyhm5MIWF90v9TyClJDOI7JOZnuTofr0W9jC55uZKoF/4rTpFTFdOtatmg5y4iIjdzQ92EioB9oa9wAKwh35IQJLzk6hY73/LpOm+vwQ+5SEiRSJNzRuOIqbc77sA53oCd8=','D');       //解密
复制代码

补充:

http://web.chacuo.net/netrsakeypair 这个网站,在线生成公钥和私钥
数字签名
非对称加密相关:
  1. openssl_get_publickey();别名:openssl_pkey_get_public();      // 从证书导出公匙;
  2. openssl_get_privatekey();别名:openssl_pkey_get_private();    // 从证书导出私匙;
复制代码

它们都只需要传入证书文件(一般是.pem文件);
  1. openssl_private_encrypt();  // 使用私匙加密;
  2. openssl_private_decrypt();  // 使用私匙解密;
  3. openssl_public_decrypt();  // 使用公匙解密;
复制代码

还有签名和验签函数:
  1. bool openssl_sign ( string $data , string &$signature , mixed $priv_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )
  2. int openssl_verify ( string $data , string $signature , mixed $pub_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )
复制代码

签名函数:$data为要签名的数据;$signature为签名结果的引用变量;$priv_key_id为签名所使用的私匙;$signature_alg为签名要使用的算法,其算法列表可以使用openssl_get_md_methods ()得到,形如:
  1. array(
  2.     0 => MD5,
  3.     1 => SHA1,
  4.     2 => SHA256,
  5.     ...
  6. )
复制代码

验签函数:与签名函数相对,只不过它要传入与私匙对应的公匙;其结果为签名验证结果,1为成功,0为失败,-1则表示错误;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|电脑资源网-软件系统下载,资源分享 ( 粤ICP备17111396号-1

GMT+8, 2019-10-15 16:51 , Processed in 0.144686 second(s), 22 queries .

styles by 未来集市 >

© 2019-2022 电脑资源网

快速回复 返回顶部 返回列表