目录
对称加密
AES 加密算法
非对称加密
RSA 加密算法
为了保证网络传输数据的安全性, 涉及敏感数据的传输, 最好对数据预先加密, 然后再在网络上进行传输, 同时, 还要保证数据在另一端是可解密的, 并且还必须要通过钥匙 (公钥或私钥) 才能解密, 没有钥匙 (公钥或私钥) 的人即使是拿到了加密过的数据也无法解密.
对称加密
采用单钥密码系统的加密方法, 同一个密钥可以同时用作信息的加密和解密, 这种加密方法称为对称加密, 也称为单密钥加密.
在对称加密算法中常用的算法有: https://baike.baidu.com/item/DES , https://baike.baidu.com/item/3DES ,TDEA, https://baike.baidu.com/item/Blowfish ,RC2,RC4, https://baike.baidu.com/item/RC5 , https://baike.baidu.com/item/IDEA ,SKIPJACK,AES 等.
AES 加密算法
密码学中的高级加密标准(Advanced Encryption Standard,AES), 又称 Rijndael 加密法, 是美国联邦政府采用的一种区块加密标准. 这个标准用来替代原先的 DES, 已经被多方分析且广为全世界所使用. 2006 年, 高级加密标准已然成为对称密钥加密中最流行的算法之一.
PHP 的 OpenSSL 扩展已经实现了 AES 加密算法, 我们可以通过 OpenSSL 扩展提供的方法实现对数据的加密和解密, PHP 在 7.2 版本已经完全移除了 MCrypt 加密, PHP 手册在 7.1 迁移页面给出了替代方案, 就是用 OpenSSL 取代 MCrypt.
PHP AES 实现
PHP 实现代码:
- class AES
- {
- // 设置 AES 秘钥
- private static $aes_key = 'bUYJ3nTV6VBasdJF'; // 此处填写前后端共同约定的秘钥
- /**
- * 加密
- * @param string $str 要加密的数据
- * @return bool|string 加密后的数据
- */
- static public function encrypt($str) {
- $data = openssl_encrypt($str, 'AES-128-ECB', self::$aes_key, OPENSSL_RAW_DATA);
- $data = base64_encode($data);
- return $data;
- }
- /**
- * 解密
- * @param string $str 要解密的数据
- * @return string 解密后的数据
- */
- static public function decrypt($str) {
- $decrypted = openssl_decrypt(base64_decode($str), 'AES-128-ECB', self::$aes_key, OPENSSL_RAW_DATA);
- return $decrypted;
- }
- }
非对称加密
对称加密算法在加密和解密时使用的是同一个秘钥; 而非对称加密算法需要两个密钥来进行加密和解密, 这两个秘钥是公开密钥 (public key, 简称公钥) 和私有密钥(private key, 简称私钥).
在非对称加密中使用的主要算法有: https://baike.baidu.com/item/RSA , https://baike.baidu.com/item/Elgamal , 背包算法, Rabin,D-H, https://baike.baidu.com/item/ECC (椭圆曲线加密算法)等.
RSA 加密算法
RSA 是目前最有影响力的公钥加密算法, 该算法基于一个十分简单的数论事实: 将两个大素数相乘十分容易, 但那时想要对其乘积进行因式分解却极其困难, 因此可以将乘积公开作为加密密钥, 即公钥, 而两个大素数组合成私钥. 公钥是可发布的供任何人使用, 私钥则为自己所有, 供解密之用.
解密者拥有私钥, 并且将由私钥计算生成的公钥发布给加密者. 加密都使用公钥进行加密, 并将密文发送到解密者, 解密者用私钥解密将密文解码为明文.
以甲要把信息发给乙为例, 首先确定角色: 甲为加密者, 乙为解密者. 首先由乙随机确定一个 KEY, 称之为密匙, 将这个 KEY 始终保存在机器 B 中而不发出来; 然后, 由这个 KEY 计算出另一个 KEY, 称之为公匙. 这个公钥的特性是几乎不可能通过它自身计算出生成它的私钥. 接下来通过网络把这个公钥传给甲, 甲收到公钥后, 利用公钥对信息加密, 并把密文通过网络发送到乙, 最后乙利用已知的私钥, 就对密文进行解码了. 以上就是 RSA 算法的工作流程.
算法实现过程为:
随意选择两个大的质数 p 和 q,p 不等于 q, 计算 N=pq.
根据欧拉函数, 不大于 N 且与 N 互质的整数個数為(p-1)(q-1).
选择一个整数 e 与 (p-1)(q-1) 互质, 并且 e 小于(p-1)(q-1).
用以下这个公式计算 d:d* e ≡ 1 (mod (p-1)(q-1)).
将 p 和 q 的记录销毁.
以上内容中,(N,e)是公钥,(N,d)是私钥.
生成私钥和公钥
生成私钥文件:
openssl genrsa -out rsa_private_key.pem 1024
利用私钥, 生成公钥:
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
通过生成的公钥和私钥就可以对数据进行加解密:
PHP RSA 实现
PHP 实现代码(公钥加密私钥解密):
- class RSA
- {
- /**
- * @param string $str 要加密的数据
- * @param string $public_key 公钥
- * @return string
- */
- static public function encrypt($str, $public_key) {
- $encrypted = '';
- $pu_key = openssl_pkey_get_public($public_key);
- openssl_public_encrypt($str, $encrypted, $pu_key);// 公钥加密
- $encrypted = base64_encode($encrypted);
- return $encrypted;
- }
- /**
- * 解密
- * @param string $str 要解密的数据
- * @param string $private_key 私钥
- * @return string
- */
- static public function decrypt($str, $private_key) {
- $decrypted = '';
- $pi_key = openssl_pkey_get_private($private_key);
- openssl_private_decrypt(base64_decode($str), $decrypted, $pi_key);// 私钥解密
- return $decrypted;
- }
- }
PHP 实现代码(私钥加密公钥解密):
- class RSA
- {
- static public function encrypt($str, private_key) {
- $encrypted = '';
- $pi_key = openssl_pkey_get_private($private_key);
- openssl_private_encrypt($data, $encrypted, $pi_key); // 私钥加密
- $encrypted = base64_encode($encrypted);
- return $encrypted;
- }
- static public function decrypt($str, $public_key) {
- $decrypted = '';
- $pu_key = openssl_pkey_get_public($public_key);
- openssl_public_decrypt(base64_decode($str), $decrypted, $pu_key);// 公钥解密
- return $decrypted;
- }
- }
来源: https://www.cnblogs.com/itbsl/p/9965209.html