Heim  >  Artikel  >  Backend-Entwicklung  >  PHP RSA加解密示例

PHP RSA加解密示例

WBOY
WBOYOriginal
2016-08-08 09:20:121125Durchsuche

转自: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教程有兴趣的朋友有所帮助。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn