PHP笔记

php使用openssl加密解密数据

2017-10-12  本文已影响199人  零一间
<?php


//公钥内容
$publicKey = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC50KD/Pwtc/dF8Gfj1Xpm6277B
AWQRlmsJIaT5Mpv1kbxPnplNEm8ZYnOFmmNLXvBG0abUxWiIwxDSXQGlnUpSZT0n
Hho/rDPHCthnK+MWUazfavX1iAWMYeY5jA4O/pLyOLZIZob9DTeaJYotkAaIy3vT
gfHPOGnofNGQM1b0IwIDAQAB
-----END PUBLIC KEY-----';

//私钥内容
$privateKey = '-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALnQoP8/C1z90XwZ
+PVembrbvsEBZBGWawkhpPkym/WRvE+emU0Sbxlic4WaY0te8EbRptTFaIjDENJd
AaWdSlJlPSceGj+sM8cK2Gcr4xZRrN9q9fWIBYxh5jmMDg7+kvI4tkhmhv0NN5ol
ii2QBojLe9OB8c84aeh80ZAzVvQjAgMBAAECgYBLv/ZyN+RNA5hL7FamyOsI1x57
ljKSTOzTqyiTAoO7566KEtDSL6qlAZKwq5DBIDH53OwTH2sPHd6Us5/BQU8TdrZz
WRQQCJcfjzx0Bu4UCD0Jny8haMIMPmgCOvO0WUzgdPRg8ySlCvqzT+gnTpoHxOzL
XE16gOQYnLO2aOBBQQJBAPe8nO+lSn3chWlDjY2yFwAd2weU+2usT6uOUMnSX9K7
tGBSGZOWfIFPKb/7NYeGdbzCpo2rz7ybk/xj6/wZVMMCQQDAA0ZbCZ68fyKGW+5U
kpIBTMTldKcORyf0GK6ARZlB4vjgU6U7dn5sRVyVx5/rlqLkXapj3a55fbGGWzvJ
VG0hAkEA33nem/OgSf9Wvck5dTvUsb886Q8E6nFrARgFWroSxLeclFMbTV6v+7nc
sJk9BX9O0DNLKXt2ju5NRZ0hsK1tHwJANXm0Am6vcrfFmb3Ipm0blJkYzP6r9+IB
Uo39K2Q2xo672V3ySpk5pFW870nlU+tj+k3Lwnxetx82bcDC6dNFgQJBAKUXHZ05
ItgMSkHtf0Q/Vtwk7Xs0QaOxTFoy4+2OGBZkqjHFJf94q07xHaQAjVbhB6GSr3m5
8HJCc68EMtnErTY=
-----END PRIVATE KEY-----
';

//从证书中提取公钥
$publicKey = openssl_pkey_get_public($publicKey);
//从证书中提取私钥
$privateKey = openssl_pkey_get_private($privateKey);
//提取成功返回资源标识,错误返回false
//var_dump(is_resource($publicKey));
//var_dump(is_resource($privateKey));

//原始数据
$data = '{"name":"jack","age":"22","address":"beijing"}';
//加密
$encrypted = "";
//解密
$decrypted = "";

echo 'source data:' . PHP_EOL . $data . PHP_EOL;

//私钥加密,公钥解密
echo '------------------type 1---------------------' . PHP_EOL;

//私钥加密
openssl_private_encrypt($data, $encrypted, $privateKey);
//加密后内容含有特殊字符,需编码转换
$encrypted = base64_encode($encrypted);
echo 'private key encrypt:' . PHP_EOL, $encrypted . PHP_EOL;
//公钥解密
openssl_public_decrypt(base64_decode($encrypted), $decrypted, $publicKey);
echo 'public key decrypt:' . PHP_EOL, $decrypted . PHP_EOL;

//公钥加密,私钥解密
echo '------------------type 2---------------------' . PHP_EOL;


//公钥加密
openssl_public_encrypt($data, $encrypted, $publicKey);
//加密后内容含有特殊字符,需编码转换
/*
Base64是MIME邮件中常用的编码方式之一。

主要思想:
    将输入的字符串或数据编码成只含有{'A'-'Z', 'a'-'z', '0'-'9', '+', '/'}这64个可打印字符的串,故称为“Base64”。
编码的方法:
    将输入数据流每次取6 bit,用此6 bit的值(0-63)作为索引去查表,输出相应字符。这样,每3个字节将编码为4个字符(3×8 → 4×6);不满4个字符的以'='填充。
 */
$encrypted = base64_encode($encrypted);
echo 'public key encrypt:' . PHP_EOL, $encrypted . PHP_EOL;

openssl_private_decrypt(base64_decode($encrypted), $decrypted, $privateKey);//私钥解密
echo 'private key decrypt:' . PHP_EOL, $decrypted . PHP_EOL;

//释放key关联秘钥
openssl_free_key($publicKey);
openssl_free_key($privateKey);
/*
输出结果:
source data:
{"name":"jack","age":"22","address":"beijing"}
------------------type 1---------------------
private key encrypt:
h9YT/t41nkyeoFtBDlTGmFW+oL+aapK8y1sBpoBHhgJJyNl4CSNSOclSiowTraRZOY7ZRbRVaJ7P7yaBYb1Jkdix9noF2zpygdoxlbjMP4fpW0bfcycwpa2Jzqis1RJYbzB9j/
S66oTYyYigOo2rQ+Wes5XCZ8F6W9nR90OA4nk=
public key decrypt:
{"name":"jack","age":"22","address":"beijing"}
------------------type 2---------------------
public key encrypt:
QgJESymniStWuqun4uBxlUwJkTzHbQrAfUu/AtwrlIURBiwzfmR4fB23ZAot0aoYC0mQfpgfkMpaEeVgPwvyGvr2Y4MvmmCcgGPU15LbN7BwdpeqOH369J9Bml01vXD569EY3Q
jDR3v7A/nWxwfT/cRPFsRtrKDCa3ivvtUtJLY=
private key decrypt:
{"name":"jack","age":"22","address":"beijing"}
*/
上一篇下一篇

猜你喜欢

热点阅读