亚马逊网站特点和经营范围,医院网站建设企业,东莞人才市场招聘官网,用flash做的网站欣赏PHP中使用OpenSSL生成RSA公钥私钥及进行加密解密示例 加密基础 加密算法一般分为两种#xff1a;对称加密算法和非对称加密算法。 对称加密 对称加密算法是消息发送者和接收者使用同一个密匙#xff0c;发送者使用密匙加密了文件#xff0c;接收者使用同样的密匙解密#x…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。 这个时候他会想到能够用我的公钥解密的数据必然是用我的私钥加的密。只有我知道我得私钥因此他就可以确认确实是我发的东西。 这样我们就能确认发送方身份了。这个过程叫做数字签名。当然具体的过程要稍微复杂一些。用私钥来加密数据用途就是数字签名。 三、总结 公钥和私钥是成对的它们互相解密。 公钥加密私钥解密。 私钥数字签名公钥验证。 简单测试 代码 ?php$config array(digest_alg sha512,private_key_bits 4096, //字节数 512 1024 2048 4096 等 ,不能加引号此处长度与加密的字符串长度有关系可以自己测试一下private_key_type OPENSSL_KEYTYPE_RSA, //加密类型);
$res openssl_pkey_new($config); //提取私钥
openssl_pkey_export($res, $private_key);//生成公钥
$public_key openssl_pkey_get_details($res);
// var_dump($public_key);$public_key$public_key[key];//显示数据
var_dump($private_key); //私钥
var_dump($public_key); //公钥//要加密的数据
$data http://www.cnblogs.com/wt645631686/;
echo 加密的数据.$data.\r\n; //私钥加密后的数据
openssl_private_encrypt($data,$encrypted,$private_key);//加密后的内容通常含有特殊字符需要base64编码转换下
$encrypted base64_encode($encrypted);
echo 私钥加密后的数据:.$encrypted.\r\n; //公钥解密
openssl_public_decrypt(base64_decode($encrypted), $decrypted, $public_key);
echo 公钥解密后的数据:.$decrypted,\r\n; //----相反操作。公钥加密
openssl_public_encrypt($data, $encrypted, $public_key);
$encrypted base64_encode($encrypted);
echo 公钥加密后的数据:.$encrypted.\r\n;openssl_private_decrypt(base64_decode($encrypted), $decrypted, $private_key);//私钥解密
echo 私钥解密后的数据:.$decrypted.n; 命令运行或者url请求 # php -f index.php string(916) -----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANSzr5MouSpOUAEv
pCubJKB51kqHibfUv3sfZyKchZ8tDzBtkKZmTIdHRSOz66LwMJWoqU8Cm1v5X1
tL8NCQR73EWkcx3IBMKOO5hTfXJFTWep6EL5ijEbvQ7iRVA8hXPUrZBU4jZlb
hnmC/XTyFLDrsHzxcpGj7Brp5hlAgMBAAECgYEAyRe4fuCZby3q5bQsi0LS8zk
lEHgKjSxd/uUJlOd2TS9ElPyBLVC6OYtgCokn1jxPMq7tFSTWlvCbfyGjbm9Mw0
gViOQYZM9l7iwZP628dMUwKkbyowbbFkRYHtZy6FOaIByujV0M2nwU7d6rx5R0M
YB5nAE4EqV8CkKYDvWECQQD9wN2G/h7RJrTbYcIOlP3oxI47LQaYCxLm1/fJ54C
Lsqi3jmygzukHE4ajDdoMe5DatOkljr7kORVy8kQWCzAkEA1pXG4jGO3F1oRuHh
iwYkTiFDDsL2x3bDSsFEShy/ogl2d/aPoMN8gcapgbghfMJnL8PBzHo3sQdMG3T1
pxV6RwJBAK6uZRF3wEkkhx36pvcY0823V19OmvSO7nT9Ez2bhElGvORXVCpDJaF
sbKO0dmVfbrFQFqt3H73oincRaSEqQcCQCWwowEhwTz1bxZcIFhh2MicUQHrvpqk
QoMD1THLQOFFf/WH74V913blhpdgBKyQL7uDNpGBUQg4sieUyAYsCQGo7jXSE
UnF15/VQTf0pU1yZyAocQM4j3HKCdGkkZ/ahPM0cCU0j9QDmlkJkNPzc3IadRW
eo90yANFW/Y3awk
-----END PRIVATE KEY-----string(272) -----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDUs6TKLkqTlABL6QrmySgedZK
h4m31L9/rH2cinIWfLQ8wbZCmZkyHR0Ujsui8DCVqKvlPAptbV9bS/DQkEe9xF
pHMdyATPijjufoU31yRU1nqfuhCYoxG70O4kVQPIVz1K2QVOI2ZW4Z5gv108hSw
67B88XKRowa6eYfpQIDAQAB
-----END PUBLIC KEY-----加密的数据http://www.cnblogs.com/wt645631686/ 私钥加密后的数据:ExLfHHqnUs/Ykna6d0sV7bxAU8WVbPrt5MPzHmalJskT8Nwdrkoz9O7tuihHROltEgOIs6rwgDrDYYiNtqqO/Co0vd8NplikX21EPxvyjDHGpfCiYcG1eAz3FGqQ4e0KfgiroDIuiQrlUfQ8zUQX2yniRnIF/DM6Bbg4e8 公钥解密后的数据:http://www.cnblogs.com/wt645631686/ 公钥加密后的数据:QQNKQBYgQzyHPez9fFC8Eo6zuLKMHuaRCfjQWSnMBY9JlntMXUEKDE/GS2mnpiwMByCyG1l1kL/wVjFl/nwFUrhQhYYWrgbJaWHGeRIdhqp7ixFOHZXdswCVHeDcluj2Ls/cLeo9v2lU7Y9DRgPUoT4vudgTSTeiW4mbpw 私钥解密后的数据:http://www.cnblogs.com/wt645631686/ 封装 ?php//生成证书
function exportOpenSSLFile(){$config array(digest_alg sha512,private_key_bits 4096, //字节数 512 1024 2048 4096 等private_key_type OPENSSL_KEYTYPE_RSA, //加密类型);$res openssl_pkey_new($config);if ( $res false ) return false;openssl_pkey_export($res, $private_key);$public_key openssl_pkey_get_details($res);$public_key $public_key[key];file_put_contents(./cert_public.key, $public_key);file_put_contents(./cert_private.pem, $private_key);openssl_free_key($res);
}
//加密解密
function authcode($string, $operation E) {$ssl_public file_get_contents(./cert_public.key);$ssl_private file_get_contents(./cert_private.pem);$pi_key openssl_pkey_get_private($ssl_private);//这个函数可用来判断私钥是否是可用的可用返回资源id Resource id$pu_key openssl_pkey_get_public($ssl_public);//这个函数可用来判断公钥是否是可用的if( false ($pi_key || $pu_key) ) return 证书错误;$data ;if( $operation D) {openssl_private_decrypt(base64_decode($string),$data,$pi_key);//私钥解密} else { openssl_public_encrypt($string, $data, $pu_key);//公钥加密$data base64_encode($data);}return $data;
}
// exportOpenSSLFile(); //生成秘钥证书
echo authcode(http://www.cnblogs.com/wt645631686/,E); //加密
echo authcode(dBYP0fSjY1i0yMTOaP8vwlUcCC4XvNIcWQGjNZCvajABE40wjHEUTuwauCIkqBzjCb04prcBkvsZdEO1VoBCmOOqL5CBsIm0yHjjnLHR6XaPfdcFjdsR/9oeQq2JGLMzjym/txgvxJyyl3RikjnzHvYQ4bxMS8G2ajWaHZjDSpfddEBcDkHgPiJGfNosDtpC3FOeuK6LW9ShrjB3QD5shTY8iUC38dnnhdEUGtfeF02mShC5gfxl6uGz/5LHbzDV1wvWzybd3axMZ5vSIlL8QDWnohYpRar1NBZhEv/QtKaV6teCI1Yj15aIvfhQYbTK2EbakSYQ6pOHAs6gbmhMo7Gc4iD1UXl1Qr7qW8uhTDz2vek1JqFUnU9B845dWPEv3u1DKzDxjXwiqNoghtu4R1iZOBKMaykUVu6yZH/mJdJiDCwOmM3lc8YAbCsYTH2gI5E/DE8km9Cecm8GY252s9hGqWUGm2kGZXTjRlMAkHD4zRJIyAExwX5yiq/FpvBj6v/E32H/06/jodw22WyHuvpPi33rAgbyAyhm5MIWF90v9TyClJDOI7JOZnuTofr0W9jC55uZKoF/4rTpFTFdOtatmg5y4iIjdzQ92EioB9oa9wAKwh35IQJLzk6hY73/LpOmvwQ5SEiRSJNzRuOIqbc77sA53oCd8,D); //解密 补充 http://web.chacuo.net/netrsakeypair 这个网站在线生成公钥和私钥 数字签名 非对称加密相关 openssl_get_publickey();别名openssl_pkey_get_public(); // 从证书导出公匙
openssl_get_privatekey();别名openssl_pkey_get_private(); // 从证书导出私匙 它们都只需要传入证书文件一般是.pem文件 openssl_private_encrypt() // 使用私匙加密
openssl_private_decrypt() // 使用私匙解密
openssl_public_decrypt() // 使用公匙解密 还有签名和验签函数 bool openssl_sign ( string $data , string $signature , mixed $priv_key_id [, mixed $signature_alg OPENSSL_ALGO_SHA1 ] )
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 ()得到形如 array(0 MD5,1 SHA1,2 SHA256,...
) 验签函数与签名函数相对只不过它要传入与私匙对应的公匙其结果为签名验证结果1为成功0为失败-1则表示错误 转载于:https://www.cnblogs.com/Johnny-li/p/10005930.html