首页 > 编程语言 >php中rsa加密解密详解

php中rsa加密解密详解

时间:2023-10-11 09:12:52浏览次数:43  
标签:私钥 rsa private 解密 pem key 加密 php

php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密,希望能帮助到大家。

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

下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令:

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等前端

2、php中用生成的公钥、私钥进行加密解密,直接上代码

<?php
$private_key = '-----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-----';

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

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


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

echo "source data:",$data,"\n";

echo "private key encrypt:\n";

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

echo "public key decrypt:\n";

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

echo "---------------------------------------\n";
echo "public key encrypt:\n";

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

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

php_openssl.dll 扩展必须打开

标签:私钥,rsa,private,解密,pem,key,加密,php
From: https://www.cnblogs.com/bkhdd/p/17756221.html

相关文章

  • rsa 公共模数攻击脚本
    '''rsa3-->c1,c2,e1,e2公共模数攻击'''fromCrypto.Util.numberimport*importgmpy2'''c1=pow(m,e1,N)c2=pow(m,e2,N)''''''m=pow(c1,d1,N)m=pow(c2,d2,N)'''c1=......
  • rsa 不止一个p
    已知e,n,c,p,q(但是n?=p*q)例如:'''n=p*p*p*q*q'''importgmpy2fromCrypto.Util.numberimport*e=q=p=c=n=p*p*p*q*q'''当n分解类似p*p*pphi=p*p*p-p*p'''phi=(p**3-p**2)*(q**2-q)d=gmpy2.invert(e,phi)......
  • rsa dp泄露脚本
    已知c,e,n,dp求m(dp=d%(p-1))importgmpy2fromCrypto.Util.numberimport*n=dp=c=e=tmp=e*dp-1#根据联立条件有:e*dp=1+k(p-1),故求解p的式子为:(p-1)=(e*dp-1)/kforkinrange(1,e):#因为K上限只到e,故遍历求解iftmp%k==0:#验证(p-1)是否为整除结果......
  • rsa 最常规模板脚本
    已知c,e,n求m(n能分解p,q)importgmpy2fromCrypto.Util.numberimport*c=e=n=n=p*q#yafufactordb.com分解np= q= phi=(p-1)*(q-1)d=gmpy2.invert(e,phi)m=gmpy2.powmod(c,d,n)print(long_to_bytes(m))......
  • phpStrom配置sass编译和JS压缩混淆
    1JS压缩混淆(YUICompressor)1.1安装java文件(jre-8u201-windows-x64.exe)1.2YUICompressor下载https://github.com/yui/yuicompressor/releases1.3Phpstrom配置:设置-工具-filewatcher配置YUICompressor参数Program参数:D:\MyLocalSoftWare\compressTool\java\bin\jav......
  • php常用总结
    1.PHP处理脚本解析(脚本不乱码)header('Conent-type:text/html;charset=utf-8');2.常用的系统函数2.1有关输出的函数:print和print_rprint()==类似于echo输出提供的内容,本质是一种结构(不是函数),返回1,可以不需要使用括号;print_r()==类似于var_dump,但是比var_dump简单,不会......
  • php之AJAX
    AJAX简介AJAX=AsynchronousJavaScriptAndXML(异步JavaScript及XML)AJAX是AsynchronousJavaScriptAndXML的首字母缩写。AJAX并不是一种新的编程语言,而仅仅是一种新的技术,它可以创建更好、更快且交互性更强的web应用程序。AJAX使用JavaScript在web浏览器与......
  • php面向对象
    1.简介在面向对象的程序设计(英语:Object-orientedprogramming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。在现实世界里我们所面对的事情都是对象,如计算机、电视机、自行车等对象的主要三个特性:1.对象的行为:可以对对象施加那些操作......
  • php之Cookies和Sessions
    PHPCookies1.什么是Cookie?cookie常用于识别用户cookie是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送cookie。通过PHP,您能够创建并取回cookie的值2.如何创建cookie?setcookie()函数用于设置cookie。setcookie()函数......
  • DES加密解密
    来源:https://blog.csdn.net/Zhangchen9091/article/details/46278463https://blog.51cto.com/cbcw/6289416usingSystem;usingSystem.IO;usingSystem.Security.Cryptography;usingSystem.Text;namespaceConsoleApp1{publicclassDES3Util{publ......