陈广安个人网站
会写代码的咸鱼
陈广安个人网站阿里云盘资源
陈广安个人网站网盘资源搜索
“ 梦想还是要有的,万一实现了呢!”
— 马云

PHP字符串异或加解密以及RSA加解密

创建时间:2017-08-01

PHP 异或加解密,将字符串进行跟指定秘钥进行位移运算


加密字符串

$key = md5('chenguangan');//秘钥
$data = $arr['pass']^$key;//需要加密的原始数据异或秘钥得到加密后的数据


解密字符串

$key = md5('chenguangan');//秘钥
//将加密后的数据$data跟秘钥进行异或位移运算得到原始数据
 $str = $data^$key;



PHP  RSA加解密实例,加密字符串入库,然后查找数据库,将数据解密

PHP服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了

加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)

linux新建文件夹  mkdir xxx

cd进入 xxx文件夹

在当前文件夹下面运行运行下面代码


openssl genrsa -out rsa_private_key.pem 1024

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem


运行之后,会在当前目录下面生成三个文件

第一条命令生成原始 RSA私钥文件 rsa_private_key.pem

第二条命令将原始 RSA私钥转换为 pkcs8格式

第三条生成RSA公钥 rsa_public_key.pem

从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给Android跟iOS等前端


RSA加密语法

将私钥文件内容private_key.pem 装到变量

        $private_key = '-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC8RnOWQ+tyztAd7yRaHPKnud0SZfikoz44nrmcv0RNXzjCZvvs
eAbHfa9geexYxs8k5/2OMKuw+z/aD5fktJ5RsjFBnB7jFhcbq/OqtzscjvM6uVRs
doh7vTnF393qf6d3VvPKW0Yju+QjlX2v+uRk3p+Ed6r7RiMdVcN9zmklsQIDAQAB
AoGAcVLaiezR0GXpYMsrj03zRL+b8FIOalKTxhLL2CxMGWIiUOkZ48iPFA5zvFdG
ylzIHAfDV422Gi3wzfkqzQ9mZu7bTZcnH/1upV5TYZ/1uI2N0VPpnj3kboB3f7ea
HhQ+2L6PFbKIQd10oR0CQQDfWQXhWu03yYdgS3N7UTBQZCIzz2ahMGa41BhxQgyu
ZbXDkHqH/qEFqlPL9Wmb82zJC2cL+LFix2r8Gi1YPIki
-----END RSA PRIVATE KEY-----';
        $pi_key = openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
        $data = $arr['pass'];//需要加密的原始数据
        $encrypted = "";//用来装加密后的数据
        openssl_private_encrypt($data,$encrypted,$pi_key);//私钥加密(加密内容,加密之后存放的变量,私钥)
        $passData = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的,得到加密后的字符串 $passData



PHP  RSA解密语法

        $public_key = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8RnOWQ+tyztAd7yRaHPKnud0S
Zfikoz44nrmcv0RNXzjCZvvseAbHfa9geexYxs8k5/2OMKuw+z/aD5fktJ5RsjFB
nB7jFhcbq/OqtzscjvM6uVRsdoh7vTnF393qf6d3VvPKW0Yju+QjlX2v+uRk3p+E
d6r7RiMdVcN9zmklsQIDAQAB
-----END PUBLIC KEY-----';
        $pu_key = openssl_pkey_get_public($public_key);//这个函数可用来判断公钥是否是可用的
        $arr =  Db::query("select * from {$this->tb}");
        $data = '';//用来装加密后的数据
        for($i=0;$i<count($arr);$i++){
            openssl_public_decrypt(base64_decode($arr[$i]['pass']),$data,$pu_key);//私钥加密的内容通过公钥可用解密出来
            $arr[$i]['pass'] = $data;//将加密后的数据返回到原来的数组里面
        }
        return $arr;