参考文章:
php之RSA加密解密_小吴-斌的博客-CSDN博客_php rsa加密
RSA和AES的区别_LC超人在良家的博客-CSDN博客_aes rsa
PHP实现非对称加密的方法 | 私钥及公钥加密解密的方法_php 公钥 私钥_LordForce的博客-CSDN博客
RSA非对称加密
特点:
只需交换公钥;公/秘钥机制,公钥加密,私钥解密;(或者私钥加密,公钥解密);
公钥负责加密,私钥负责解密;私钥负责签名,公钥负责验证。
非对称加密算法需要两个秘钥:公开密钥(publickey)和私有秘钥(privatekey).公开密钥和私有秘钥是一对,如果公开密钥对数据进行加密,只有用对应的私有秘钥才能解密;如果私有秘钥对数据进行加密那么只有用对应的公开密钥才能解密.因为加密解密使用的是两个不同的秘钥,所以这种算法叫做非对称加密算法.简单的说就是公钥加密私钥解密,私钥加密公钥解密
生成公私钥链接
http://web.chacuo.net/netrsakeypair
先来学习函数:
RSA 公钥加密 私钥解密 (公钥加密出来的内容每次刷新会改变)
openssl_public_encrypt() — 使用公钥加密数据
PHP: openssl_public_encrypt - Manual
openssl_private_decrypt — 使用私钥解密数据
PHP: openssl_private_decrypt - Manual
<?php
// 公钥
$public_key = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqdUu486t87Nq7e+yniTH
g+CIT+fO5H5tTSn9rs6nYKd3agTVusHf5jz0+JYERqof6wHj5xrnyV9Qn3NhnBUT
gfkbTs28uiyBmHdN/t4dWNuUdRmNQdud8EX686Wkii9xiSP1jpLVbJ86S+BLsD2J
svcRecxUMpKvZxTTsNZIFZD+/XkozXgQh6FRoLzGr1vheTHKAB1pjfGHgaSpYPWu
sTwn8eLaqzQNAdaYHeRSrx9Et6z97WqEsv4fx4wBaiixHwkYwAnfSooOq49r/YgV
KOQDJBtt3OSyybxkwDLf/nTEVacO36Cf7h2g872YgF58DG+gicJWhwRujfIvkGHf
tQIDAQAB
-----END PUBLIC KEY-----';
// 私钥
$private_key = '-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCp1S7jzq3zs2rt
77KeJMeD4IhP587kfm1NKf2uzqdgp3dqBNW6wd/mPPT4lgRGqh/rAePnGufJX1Cf
c2GcFROB+RtOzby6LIGYd03+3h1Y25R1GY1B253wRfrzpaSKL3GJI/WOktVsnzpL
4EuwPYmy9xF5zFQykq9nFNOw1kgVkP79eSjNeBCHoVGgvMavW+F5McoAHWmN8YeB
pKlg9a6xPCfx4tqrNA0B1pgd5FKvH0S3rP3taoSy/h/HjAFqKLEfCRjACd9Kig6r
j2v9iBUo5AMkG23c5LLJvGTAMt/+dMRVpw7foJ/uHaDzvZiAXnwMb6CJwlaHBG6N
8i+QYd+1AgMBAAECggEBAKOObkDwC3CWSpVo8WEB1K85rq0ddo9w/jyBAxG1bVZV
EVil3VulWMZ30AgTGX0gW+rMgDpSHAU/6PoWeVuCpK3YRKdI1ceKEyjNROz95c9s
cHWxrOtO4LTEAGFjFaoK9NF5MwQifq3ETrVCBkJtkU4sSMU+tZuazpd8ZD56ryMs
VbAvmtHurn502C3+cksW0krqyMUtyZzwAf1ysjC/6kqk+tbd8tSzZ9tB//IQEYsF
JC7N8bN5SnjHJxucVdiiMRUqO6zQGfA7b7gMRLXM0nE9XmaXHKiHKV8HJGPBiJ8f
S7bHcAGWa1m+Q/dzOwQx5arI1x9xcC7oER2SwzFgiiECgYEA2GujCNdDl2UT0UaF
9l4Nq94O2oOg2/PRm7DvQkZ4Xb4xJFtxpQkJu0rP4cq53dSTjUGBA2hiCm4lzrKL
AA8MjhsPBFnldEFjQOI0fC7Y1g+ydh0L6lbj49Eod4YcG3Qf2L+Az4lr5A7ww274
2xrh4R8SsvyJg+Q5UpWl3hF0d00CgYEAyORnr4di9VHVS604K96UHluJZL94dycY
d2MxAmraNFsSjWTVRC0LeGtkluwhBQCtpzJpB14eeVgHGqqhl5LATMu86RRs1y+Z
A+/6MzUEeunNkNMBueJ1Vx3smWNSzOSrU+inV2W5DUTJLx7C2x0ZHCKa7wj3hXOC
tDViH/RFZgkCgYEAxoMkzq01sJ7kaKe5pVxsSeOr2D+4w0iIUbkgHbiqG8KjLOg7
+9eod4WN3Vyo1JNyrLUS899BXrPeNhSLb4heSdMEGUekMtjvg8p5vhbyipdnaPQH
w/Hjo0ptRgVbrsr7k0NFkhhJQK17pqgZ2FB2NJrd+hOux64F7nyZ4nI8VFkCgYBg
f98SoS02/GVCIeYepJ9v6baY76S1T9Ff4AT1zVAd4DWMOAh95EljQesi2DCQT6Aa
9YsgH+TxkwhuldJjlfnLqf6H0+jogRO2oXsFSA1r4Y1+aO2mVhLZkyVJFT378Egg
WVyxDcsThZxChztAt7yNGE5mTl9f+nmpiQ8mnFcNyQKBgQDAACbgjNOStirsdAtJ
1numHm3zZ42ZPtv6UWlcy5SGJxKwuAeCSpsiz6qKbLStkxF7R0Qio4X0WTf8WWH4
NPwyxlHjEU3WKX8jsrRVCzRE9yURfhO2avO1bg1MwOJoodRQ0lJEMcrPhRXdq3L0
zkCvTA6kfgk/GSmKp4IoKNFS9Q==
-----END PRIVATE KEY-----';
$data = json_encode(['name'=>'ki','age'=>99,'city'=>'河南','gender'=>'男'],JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
$public_key = openssl_pkey_get_public($public_key); // 判断公钥是否可用
if (!$public_key) {
echo "公钥不可用";
exit;
}
$isSuccess = openssl_public_encrypt($data,$encrypt_data,$public_key);
echo $isSuccess;
echo "<hr>";
echo $encrypt_data;
echo "<hr>";
$private_key = openssl_pkey_get_private($private_key); // 判断私钥是否可用
if (!$private_key) {
echo "私钥不可用";
exit;
}
$isSuccess = openssl_private_decrypt($encrypt_data, $decrypt_data, $private_key);
echo $isSuccess;
echo "<hr>";
echo $decrypt_data;
echo "<hr>";
RSA 私钥签名 公钥验签
openssl_sign — 生成签名
PHP: openssl_sign - 手动
openssl_verify — 验证签名
PHP: openssl_verify - Manual
<?php
// 公钥
$public_key = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqdUu486t87Nq7e+yniTH
g+CIT+fO5H5tTSn9rs6nYKd3agTVusHf5jz0+JYERqof6wHj5xrnyV9Qn3NhnBUT
gfkbTs28uiyBmHdN/t4dWNuUdRmNQdud8EX686Wkii9xiSP1jpLVbJ86S+BLsD2J
svcRecxUMpKvZxTTsNZIFZD+/XkozXgQh6FRoLzGr1vheTHKAB1pjfGHgaSpYPWu
sTwn8eLaqzQNAdaYHeRSrx9Et6z97WqEsv4fx4wBaiixHwkYwAnfSooOq49r/YgV
KOQDJBtt3OSyybxkwDLf/nTEVacO36Cf7h2g872YgF58DG+gicJWhwRujfIvkGHf
tQIDAQAB
-----END PUBLIC KEY-----';
// 私钥
$private_key = '-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCp1S7jzq3zs2rt
77KeJMeD4IhP587kfm1NKf2uzqdgp3dqBNW6wd/mPPT4lgRGqh/rAePnGufJX1Cf
c2GcFROB+RtOzby6LIGYd03+3h1Y25R1GY1B253wRfrzpaSKL3GJI/WOktVsnzpL
4EuwPYmy9xF5zFQykq9nFNOw1kgVkP79eSjNeBCHoVGgvMavW+F5McoAHWmN8YeB
pKlg9a6xPCfx4tqrNA0B1pgd5FKvH0S3rP3taoSy/h/HjAFqKLEfCRjACd9Kig6r
j2v9iBUo5AMkG23c5LLJvGTAMt/+dMRVpw7foJ/uHaDzvZiAXnwMb6CJwlaHBG6N
8i+QYd+1AgMBAAECggEBAKOObkDwC3CWSpVo8WEB1K85rq0ddo9w/jyBAxG1bVZV
EVil3VulWMZ30AgTGX0gW+rMgDpSHAU/6PoWeVuCpK3YRKdI1ceKEyjNROz95c9s
cHWxrOtO4LTEAGFjFaoK9NF5MwQifq3ETrVCBkJtkU4sSMU+tZuazpd8ZD56ryMs
VbAvmtHurn502C3+cksW0krqyMUtyZzwAf1ysjC/6kqk+tbd8tSzZ9tB//IQEYsF
JC7N8bN5SnjHJxucVdiiMRUqO6zQGfA7b7gMRLXM0nE9XmaXHKiHKV8HJGPBiJ8f
S7bHcAGWa1m+Q/dzOwQx5arI1x9xcC7oER2SwzFgiiECgYEA2GujCNdDl2UT0UaF
9l4Nq94O2oOg2/PRm7DvQkZ4Xb4xJFtxpQkJu0rP4cq53dSTjUGBA2hiCm4lzrKL
AA8MjhsPBFnldEFjQOI0fC7Y1g+ydh0L6lbj49Eod4YcG3Qf2L+Az4lr5A7ww274
2xrh4R8SsvyJg+Q5UpWl3hF0d00CgYEAyORnr4di9VHVS604K96UHluJZL94dycY
d2MxAmraNFsSjWTVRC0LeGtkluwhBQCtpzJpB14eeVgHGqqhl5LATMu86RRs1y+Z
A+/6MzUEeunNkNMBueJ1Vx3smWNSzOSrU+inV2W5DUTJLx7C2x0ZHCKa7wj3hXOC
tDViH/RFZgkCgYEAxoMkzq01sJ7kaKe5pVxsSeOr2D+4w0iIUbkgHbiqG8KjLOg7
+9eod4WN3Vyo1JNyrLUS899BXrPeNhSLb4heSdMEGUekMtjvg8p5vhbyipdnaPQH
w/Hjo0ptRgVbrsr7k0NFkhhJQK17pqgZ2FB2NJrd+hOux64F7nyZ4nI8VFkCgYBg
f98SoS02/GVCIeYepJ9v6baY76S1T9Ff4AT1zVAd4DWMOAh95EljQesi2DCQT6Aa
9YsgH+TxkwhuldJjlfnLqf6H0+jogRO2oXsFSA1r4Y1+aO2mVhLZkyVJFT378Egg
WVyxDcsThZxChztAt7yNGE5mTl9f+nmpiQ8mnFcNyQKBgQDAACbgjNOStirsdAtJ
1numHm3zZ42ZPtv6UWlcy5SGJxKwuAeCSpsiz6qKbLStkxF7R0Qio4X0WTf8WWH4
NPwyxlHjEU3WKX8jsrRVCzRE9yURfhO2avO1bg1MwOJoodRQ0lJEMcrPhRXdq3L0
zkCvTA6kfgk/GSmKp4IoKNFS9Q==
-----END PRIVATE KEY-----';
$data = json_encode(['name'=>'ki','age'=>99,'city'=>'河南','gender'=>'男'],JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
/**
* 公钥加密 私钥解密
*/
// $public_key = openssl_pkey_get_public($public_key); // 判断公钥是否可用
// if (!$public_key) {
// echo "公钥不可用";
// exit;
// }
// $isSuccess = openssl_public_encrypt($data,$encrypt_data,$public_key);
//
// echo $isSuccess;
// echo "<hr>";
// echo $encrypt_data;
// echo "<hr>";
//
// $private_key = openssl_pkey_get_private($private_key); // 判断私钥是否可用
// if (!$private_key) {
// echo "私钥不可用";
// exit;
// }
// $isSuccess = openssl_private_decrypt($encrypt_data, $decrypt_data, $private_key);
// echo $isSuccess;
// echo "<hr>";
// echo $decrypt_data;
// echo "<hr>";
/**
*
*/
// 私钥签名
openssl_sign($data, $signature, $private_key);
$sign = base64_encode($signature);
var_dump($sign);
echo "<hr>";
// 公钥验签 需要用加密前的数据
echo openssl_verify($data, base64_decode($sign), $public_key);
RSA 私钥加密 公钥解密 (私钥加密出来的内容永远不会变)
openssl_private_encrypt — 使用私钥加密数据
PHP: openssl_private_encrypt - Manual
openssl_public_decrypt — 使用公钥解密数据
PHP: openssl_public_decrypt - Manual
<?php
// 公钥
$public_key = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqdUu486t87Nq7e+yniTH
g+CIT+fO5H5tTSn9rs6nYKd3agTVusHf5jz0+JYERqof6wHj5xrnyV9Qn3NhnBUT
gfkbTs28uiyBmHdN/t4dWNuUdRmNQdud8EX686Wkii9xiSP1jpLVbJ86S+BLsD2J
svcRecxUMpKvZxTTsNZIFZD+/XkozXgQh6FRoLzGr1vheTHKAB1pjfGHgaSpYPWu
sTwn8eLaqzQNAdaYHeRSrx9Et6z97WqEsv4fx4wBaiixHwkYwAnfSooOq49r/YgV
KOQDJBtt3OSyybxkwDLf/nTEVacO36Cf7h2g872YgF58DG+gicJWhwRujfIvkGHf
tQIDAQAB
-----END PUBLIC KEY-----';
// 私钥
$private_key = '-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCp1S7jzq3zs2rt
77KeJMeD4IhP587kfm1NKf2uzqdgp3dqBNW6wd/mPPT4lgRGqh/rAePnGufJX1Cf
c2GcFROB+RtOzby6LIGYd03+3h1Y25R1GY1B253wRfrzpaSKL3GJI/WOktVsnzpL
4EuwPYmy9xF5zFQykq9nFNOw1kgVkP79eSjNeBCHoVGgvMavW+F5McoAHWmN8YeB
pKlg9a6xPCfx4tqrNA0B1pgd5FKvH0S3rP3taoSy/h/HjAFqKLEfCRjACd9Kig6r
j2v9iBUo5AMkG23c5LLJvGTAMt/+dMRVpw7foJ/uHaDzvZiAXnwMb6CJwlaHBG6N
8i+QYd+1AgMBAAECggEBAKOObkDwC3CWSpVo8WEB1K85rq0ddo9w/jyBAxG1bVZV
EVil3VulWMZ30AgTGX0gW+rMgDpSHAU/6PoWeVuCpK3YRKdI1ceKEyjNROz95c9s
cHWxrOtO4LTEAGFjFaoK9NF5MwQifq3ETrVCBkJtkU4sSMU+tZuazpd8ZD56ryMs
VbAvmtHurn502C3+cksW0krqyMUtyZzwAf1ysjC/6kqk+tbd8tSzZ9tB//IQEYsF
JC7N8bN5SnjHJxucVdiiMRUqO6zQGfA7b7gMRLXM0nE9XmaXHKiHKV8HJGPBiJ8f
S7bHcAGWa1m+Q/dzOwQx5arI1x9xcC7oER2SwzFgiiECgYEA2GujCNdDl2UT0UaF
9l4Nq94O2oOg2/PRm7DvQkZ4Xb4xJFtxpQkJu0rP4cq53dSTjUGBA2hiCm4lzrKL
AA8MjhsPBFnldEFjQOI0fC7Y1g+ydh0L6lbj49Eod4YcG3Qf2L+Az4lr5A7ww274
2xrh4R8SsvyJg+Q5UpWl3hF0d00CgYEAyORnr4di9VHVS604K96UHluJZL94dycY
d2MxAmraNFsSjWTVRC0LeGtkluwhBQCtpzJpB14eeVgHGqqhl5LATMu86RRs1y+Z
A+/6MzUEeunNkNMBueJ1Vx3smWNSzOSrU+inV2W5DUTJLx7C2x0ZHCKa7wj3hXOC
tDViH/RFZgkCgYEAxoMkzq01sJ7kaKe5pVxsSeOr2D+4w0iIUbkgHbiqG8KjLOg7
+9eod4WN3Vyo1JNyrLUS899BXrPeNhSLb4heSdMEGUekMtjvg8p5vhbyipdnaPQH
w/Hjo0ptRgVbrsr7k0NFkhhJQK17pqgZ2FB2NJrd+hOux64F7nyZ4nI8VFkCgYBg
f98SoS02/GVCIeYepJ9v6baY76S1T9Ff4AT1zVAd4DWMOAh95EljQesi2DCQT6Aa
9YsgH+TxkwhuldJjlfnLqf6H0+jogRO2oXsFSA1r4Y1+aO2mVhLZkyVJFT378Egg
WVyxDcsThZxChztAt7yNGE5mTl9f+nmpiQ8mnFcNyQKBgQDAACbgjNOStirsdAtJ
1numHm3zZ42ZPtv6UWlcy5SGJxKwuAeCSpsiz6qKbLStkxF7R0Qio4X0WTf8WWH4
NPwyxlHjEU3WKX8jsrRVCzRE9yURfhO2avO1bg1MwOJoodRQ0lJEMcrPhRXdq3L0
zkCvTA6kfgk/GSmKp4IoKNFS9Q==
-----END PRIVATE KEY-----';
$data = json_encode(['name'=>'ki','age'=>99,'city'=>'河南','gender'=>'男'],JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
/**
* 公钥加密 私钥解密
*/
// $public_key = openssl_pkey_get_public($public_key); // 判断公钥是否可用
// if (!$public_key) {
// echo "公钥不可用";
// exit;
// }
// $isSuccess = openssl_public_encrypt($data,$encrypt_data,$public_key);
//
// echo $isSuccess;
// echo "<hr>";
// echo $encrypt_data;
// echo "<hr>";
//
// $private_key = openssl_pkey_get_private($private_key); // 判断私钥是否可用
// if (!$private_key) {
// echo "私钥不可用";
// exit;
// }
// $isSuccess = openssl_private_decrypt($encrypt_data, $decrypt_data, $private_key);
// echo $isSuccess;
// echo "<hr>";
// echo $decrypt_data;
// echo "<hr>";
/**
* 私钥加密 公钥解密
*/
$private_key = openssl_pkey_get_private($private_key); // 判断私钥是否可用
if (!$private_key) {
echo "私钥不可用";
exit;
}
$isSuccess = openssl_private_encrypt($data,$encrypt_data,$private_key);
echo $isSuccess;
echo "<hr>";
echo $encrypt_data;
echo "<hr>";
$public_key = openssl_pkey_get_public($public_key); // 判断公钥是否可用
if (!$public_key) {
echo "公钥不可用";
exit;
}
$isSuccess = openssl_public_decrypt($encrypt_data, $decrypt_data, $public_key);
echo $isSuccess;
echo "<hr>";
echo $decrypt_data;
echo "<hr>";
AES对称加密
对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。
对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。
对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。
对称加密,加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。
先来学习函数:
openssl_encrypt() — 加密数据
PHP: openssl_encrypt - Manual
openssl_decrypt— 解密数据
PHP: openssl_decrypt - Manual
推荐自己经常用的随机数生成 ( 可用来生成iv 和 key )
在线随机密码生成器-随机字符串生成器
<?php
$key = '6gA^PNB9x_aY^qbl';
$iv = 'EVi%N+N%Q6BtNtt9';
$method = "AES-128-CBC";
$data = json_encode(['name'=>'ki','age'=>99,'city'=>'河南','gender'=>'男'],JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
// 加密
$encrypt = base64_encode(openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv));
echo $encrypt;
echo "<hr>";
$decrypt = openssl_decrypt(base64_decode($encrypt), $method, $key, OPENSSL_RAW_DATA, $iv);
echo $decrypt;
echo "<hr>";
怎么使用?参考gitee上别人开源代码:
AES-RSA: PHP和JS前后端数据加解密
看了上面的代码 我画了一张流程图
疑问与总结
1.因为是随机key和iv做到了一次一密 ( 但是传输了加密的key 和 iv 个人觉得iv可以都是固定的 这样节省时间 )
2.后端返回响应数据是使用了私钥生成的签名 签名验签是需要公钥 和 原来没加密的数据 以及加密后的数据 返回的是布尔值 验签是为了确定是否可以使用 前端接受的数据里面也返回了没加密的key 和 iv 感觉验签是多此一举
3.服务端返回相应数据 不如干净利落使用前端公钥加密key 和 iv 前端使用前端的私钥解密
4.加密本身就是损失性能换来更高的安全性 但是要记住没有破解不了的加密 只要前端/APP被反编译出来,加密是没用的
5.个人感觉不如一个简单的AES加密即可 把前端/App 重要代码 混淆加固加密来的更实在
自己可以根据上面的加密方式来进行自己想要的加密,基本加密内容就是上面列出来的,可以在此基础上玩点花活,我参考的几个博客里面每个人都有不同的加解密,但是基础都是上面列出来的加密方式
补充:
关于前端其实就是两个包
npm install crypto-js
npm install jsencrypt
相关代码 参考上面开源链接里面写好的