PHP RSA加解密示例

WBOY
WBOYasal
2016-08-08 09:20:121181semak imbas

转自:http://orangeholic.iteye.com/blog/2161771
参考:http://blog.csdn.net/clh604/article/details/20224735
1.生成密钥和公钥
开始前需要准备openssl环境
linux 需要安装openssl工具包,传送门
http://www.openssl.org/source/
window 下需要安装openssl的程序,传送门
http://slproweb.com/products/Win32OpenSSL.html
如果不想安装,可以用本例提供的密钥和公钥进行测试。

密钥生成
openssl genrsa 用于生成rsa私钥文件,生成是可以指定私钥长度和密码保护,具体参数请参考文档。

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格式,并输出文件名为private_key.pem的私钥,第三条根据私钥生成对应的RSA公钥 rsa_public_key.pem
从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给android跟ios等前端,反过来也可以,注意复制的时候只复制openssl后面的内容即可。

2.PHP用RSA加解密
开始前需要准备php openssl环境,开启PHP openssl扩展,window将php的配置文件php.ini中的
;extension=php_openssl.dll
改为
extension=php_openssl.dll

代码如下:

<code><span><span><?php </span><span>$private_key</span> = <span>'-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC3//sR2tXw0wrC2DySx8vNGlqt3Y7ldU9+LBLI6e1KS5lfc5jl
TGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2klBd6h4wrbbHA2XE1sq21ykja/
Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o2n1vP1D+tD3amHsK7QIDAQAB
AoGBAKH14bMitESqD4PYwODWmy7rrrvyFPEnJJTECLjvKB7IkrVxVDkp1XiJnGKH
2h5syHQ5qslPSGYJ1M/XkDnGINwaLVHVD3BoKKgKg1bZn7ao5pXT+herqxaVwWs6
ga63yVSIC8jcODxiuvxJnUMQRLaqoF6aUb/2VWc2T5MDmxLhAkEA3pwGpvXgLiWL
3h7QLYZLrLrbFRuRN4CYl4UYaAKokkAvZly04Glle8ycgOc2DzL4eiL4l/+x/gaq
deJU/cHLRQJBANOZY0mEoVkwhU4bScSdnfM6usQowYBEwHYYh/OTv1a3SqcCE1f+
qbAclCqeNiHajCcDmgYJ53LfIgyv0wCS54kCQAXaPkaHclRkQlAdqUV5IWYyJ25f
oiq+Y8SgCCs73qixrU1YpJy9yKA/meG9smsl4Oh9IOIGI+zUygh9YdSmEq0CQQC2
4G3IP2G3lNDRdZIm5NZ7PfnmyRabxk/UgVUWdk47IwTZHFkdhxKfC8QepUhBsAHL
QjifGXY4eJKUBm3FpDGJAkAFwUxYssiJjvrHwnHFbg0rFkvvY63OSmnRxiL4X6EY
yI9lblCsyfpl25l7l5zmJrAHn45zAiOoBrWqpM5edu7c
-----END RSA PRIVATE KEY-----'</span>;

<span>$public_key</span> = <span>'-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3//sR2tXw0wrC2DySx8vNGlqt
3Y7ldU9+LBLI6e1KS5lfc5jlTGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2kl
Bd6h4wrbbHA2XE1sq21ykja/Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o
2n1vP1D+tD3amHsK7QIDAQAB
-----END PUBLIC KEY-----'</span>;

<span>//echo $private_key;</span><span>$pi_key</span> =  openssl_pkey_get_private(<span>$private_key</span>);<span>//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id</span><span>$pu_key</span> = openssl_pkey_get_public(<span>$public_key</span>);<span>//这个函数可用来判断公钥是否是可用的</span>
print_r(<span>$pi_key</span>);<span>echo</span><span>"\n"</span>;
print_r(<span>$pu_key</span>);<span>echo</span><span>"\n"</span>;


<span>$data</span> = <span>"aassssasssddd"</span>;<span>//原始数据</span><span>$encrypted</span> = <span>""</span>; 
<span>$decrypted</span> = <span>""</span>; 

<span>echo</span><span>"source data:"</span>,<span>$data</span>,<span>"\n"</span>;

<span>echo</span><span>"private key encrypt:\n"</span>;

openssl_private_encrypt(<span>$data</span>,<span>$encrypted</span>,<span>$pi_key</span>);<span>//私钥加密</span><span>$encrypted</span> = base64_encode(<span>$encrypted</span>);<span>//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的</span><span>echo</span><span>$encrypted</span>,<span>"\n"</span>;

<span>echo</span><span>"public key decrypt:\n"</span>;

openssl_public_decrypt(base64_decode(<span>$encrypted</span>),<span>$decrypted</span>,<span>$pu_key</span>);<span>//私钥加密的内容通过公钥可用解密出来</span><span>echo</span><span>$decrypted</span>,<span>"\n"</span>;

<span>echo</span><span>"---------------------------------------\n"</span>;
<span>echo</span><span>"public key encrypt:\n"</span>;

openssl_public_encrypt(<span>$data</span>,<span>$encrypted</span>,<span>$pu_key</span>);<span>//公钥加密</span><span>$encrypted</span> = base64_encode(<span>$encrypted</span>);
<span>echo</span><span>$encrypted</span>,<span>"\n"</span>;

<span>echo</span><span>"private key decrypt:\n"</span>;
openssl_private_decrypt(base64_decode(<span>$encrypted</span>),<span>$decrypted</span>,<span>$pi_key</span>);<span>//私钥解密</span><span>echo</span><span>$decrypted</span>,<span>"\n"</span>;</span></span></code>

结果:

<code>原数据为<span>:</span>我的帐号是<span>:shiki</span>,密码是<span>:matata</span>
加密成功,加密后数据(base64_encode后)为<span>:X6q/u/hUW4o7z0tETaWuRt3ahvgT9/m+yiqABDDs9ccHRekB0YU9UAv5zA/VZawLoDVhiyl9bAc3WHeRIexz+gybUJKkI69RFkWHL5n3llfCeTdnSXIQ4Aa+ysfmCicxXwMeP2vUWZBcxJiRVLiGGe1shJjw/TxvmocOlaFRVnQ=</span>
解密成功,解密后数据为<span>:</span>我的帐号是<span>:shiki</span>,密码是<span>:matata</span></code>

以上就介绍了PHP RSA加解密示例,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn