首先,关于RSA的加密介绍文章,就不多说了。直接看这个网页吧(作者写的计算机科普文章是极好的)

http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

我要实现的功能就是通过这对公钥和密钥,实现客户端软件对密码进行加密(采用公钥),然后网站端(php)采用密钥进行解密验证。

开始吧。

php服务端利用内置函数生成公钥和密钥。记得这需要php服务器安装了openssl扩展。先生成cer文件和pfx文件。cer文件相当于公钥(可以发给客户端),pfx是密钥(必须严格保存于服务器端不能泄露)。

$dn = array(

"countryName" => 'zh', //所在国家名称

"stateOrProvinceName" => 'GuangDong', //所在省份名称

"localityName" => 'ShenZhen', //所在城市名称

"organizationName" => 'baibai', //注册人姓名

"organizationalUnitName" => 'company', //组织名称

"commonName" => 'bbb', //公共名称

"emailAddress" => '123@.qq.com' //邮箱

);

$privkeypass = 'cf'; //私钥密码

$numberofdays = 3650; //有效时长

$cerpath = "./test.cer"; //生成证书路径

$pfxpath = "./test.pfx"; //密钥文件路径//生成证书

$privkey = openssl_pkey_new();

$csr = openssl_csr_new($dn, $privkey);

$sscert = openssl_csr_sign($csr, null, $privkey, $numberofdays);

openssl_x509_export_to_file($sscert, $cerpath); //导出证书到文件

//openssl_pkcs12_export_to_file($sscert, $pfxpath, $privkey, $privkeypass); //生成密钥文件

openssl_pkey_export_to_file($privkey, $pfxpath); //生成密钥文件

以下是是php端进行简单测试的代码:

/*

//私钥加密

$cer_key = file_get_contents($pfxpath); //获取密钥内容

openssl_pkcs12_read($cer_key, $certs, $privkeypass);

openssl_sign($data, $signMsg, $certs['pkey'],OPENSSL_ALGO_SHA1); //注册生成加密信息

$signMsg = base64_encode($signMsg); //base64转码加密信息

//echo $signMsg;

//公钥解密

$cer_key = file_get_contents($cerpath); //获取证书内容

$unsignMsg=base64_decode($signMsg);//base64解码加密信息

$cer = openssl_x509_read($cer_key); //读取公钥

$res = openssl_verify($data, $unsignMsg, $cer); //验证

echo $res; //输出验证结果,1:验证成功,0:验证失败

*/

$data = "123456";

$crypted = "";

$key = file_get_contents($cerpath);

//公钥加密

openssl_public_encrypt($data, $crypted, $key);

echo base64_encode($crypted)."
";

//echo $crypted."
";

//私钥解密

$decrypted = "";

$s = file_get_contents($pfxpath);

//echo "
$s
";

$key2 = openssl_pkey_get_private(file_get_contents($pfxpath));

if(openssl_private_decrypt($crypted, $decrypted, $key2)){

echo $decrypted;

}

else{

echo "failed";

}

客户端通过加载cer文件,将要加密的文本用公钥加密。以下是一个函数

//通过读取本地的cer文件,得到公钥,然后对文本内容加密,返回加密后的文本,最后传到服务器端,与密钥进行比对

public static String getRSAText(Context context,String strText){

try {

//读取证书文件

InputStream inStream = context.getResources().getAssets().open("test.cer");

//创建X509工厂类

CertificateFactory cf = CertificateFactory.getInstance("X.509");

//创建证书对象

X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream);

inStream.close();

Cipher c1 = Cipher.getInstance("RSA/None/PKCS1Padding");

c1.init(Cipher.PUBLIC_KEY, cert);

byte[] cipherText = c1.doFinal(strText.getBytes());

//base64转换一下,方便传输

String res = Base64.encodeToString(cipherText,Base64.DEFAULT);

return res;

}

catch (InvalidKeyException e){

}

catch (IOException e){

}

catch (CertificateException e){

}

catch (NoSuchPaddingException e){

}

catch (IllegalBlockSizeException e){

}

catch (BadPaddingException e){

}

catch (NoSuchAlgorithmException e){

}

return "";

}

下边是php端用pfx文件(里边放有密钥)进行解密的代码。我改写成了一个函数。参数是pfx文件路径,pfx文件名,要解密的字符串

function getPassword( $path,$pfx_file_name,$str ){

$pfxpath = $path . "/public/$pfx_file_name"; //密钥文件路径

//$cerpath = "./test.cer"; //生成证书路径

//私钥解密

$decrypted = "";

$key2 = openssl_pkey_get_private(file_get_contents($pfxpath));

$res = openssl_private_decrypt(base64_decode($str), $decrypted, $key2);

if($res){

return $decrypted;

}

else{

return "";

}

}

php 加密cer_php 生成RSA非对称加密用的证书-cer-pfx文件相关推荐

  1. 前后端数据加密传输 RSA非对称加密

    任务需求:要求登陆时将密码加密之后再进行传输到后端. 经过半天查询摸索折腾,于是有了如下成果: 加密方式:RSA非对称加密. 实现方式:公钥加密,私钥解密. 研究进度:javascript与java端 ...

  2. 微信小程序RSA非对称加密。

    因公司做的产品为金融项目,所以对数据安全性有很高要求,因为项目中的数据都会通过3DES 对称加密,和RSA非对称加密进行数据传输. 在这里先简单介绍一下什么是对称加密和非对称加密 对称加密:对称加密采 ...

  3. RSA非对称加密和解密(同时生成密钥)

    RSA非对称加密和解密(同时生成密钥) 准备jar包 bcprov-jdk16-1.46.jar commons-codec-1.15.jar 获取jar地址:https://mvnrepositor ...

  4. JSON 接口如何实现 RSA 非对称加密与签名

    代码地址如下: http://www.demodashi.com/demo/14000.html 一.概述 1. 数字签名的作用:保证数据完整性,机密性和发送方角色的不可抵赖性,加密与签字结合时,两套 ...

  5. php利用openssl实现RSA非对称加密签名

    来源:http://www.webiji.com/archives/412 php利用openssl实现RSA非对称加密签名 1. 先用php生成一对公钥和私钥 $res = openssl_pkey ...

  6. Atitit RSA非对称加密原理与解决方案

    Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制  3 1.4. 基于rsa的授权验证机器码 4 1.5. ...

  7. java rsa 117_java实现RSA非对称加密解密

    之前写过一篇java实现AES对称加密解密 在对密码加密传输的场景下 RSA非对称加密解密可能会更加适合. 原理就是后台生成一对公钥和私钥,公钥给前端用来加密,后台用私钥去解密,保证了传输过程中就算被 ...

  8. Springboot+RSA非对称加密

    这是百度百科对(对称加密丶非对称加密)的解释: (1)对称加密算法在加密和解密时使用的是同一个秘钥. (2)非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称 ...

  9. 数据加密 RSA非对称加密篇

    先把代码贴上来,理论后续补充,暂时可先参考数据加密 总篇 package com.jlpay.partner.utils;import android.util.Base64;import java. ...

最新文章

  1. tensorboard图上存在直线_高中数学必修二直线与圆:真是让我没想到,他俩的关系还挺不简单...
  2. 多目标跟踪2021总结
  3. Linux文件被自动加属性保护,Linux下如何对文件进行权限保护以防止文件被人改动...
  4. javascript如何释放内存
  5. 在windows中手动安装第三方模块
  6. linux公司常用基础命令必知必会一
  7. 断点帧数测试软件,《幽灵行动:断点》PC版性能表现分析
  8. Java连接sap无明显报错信息,Kettle连接SAP报错问题
  9. oracle 左连接 权限,Oracle 左连接、右连接、全外连接、(+)号作用
  10. 工程思想——关于串口通讯协议帧数据的一些想法
  11. jQuery框架的ajax
  12. Linux安装无线网卡RTL8811CU
  13. python按位置从字符串提取子串的操作是_Python基础-字符串操作和“容器”的操作...
  14. 嵌入式--RTC实时时钟原理及相关库函数功能
  15. 华为鸿蒙到底是不是安卓系统套了个壳?
  16. 怎么正确有效学习计算机专业
  17. 【Scheme 系列】对宏(macros)的恐惧
  18. 【PTA】 试试手气
  19. ArcGIS10.5安装出现1068错误:依赖服务或组无法启动(已解决)
  20. 随风潜入夜,润物细无声----听朱正辉老师谈3G与现代化信息生活

热门文章

  1. PAT1055 集体照 (25 分)【3/6通过】
  2. netty系列之:一口多用,使用同一端口运行不同协议
  3. redis 硬件要求_Redis持久化机制
  4. 微信能远程控制电脑吗_牛皮!微信远程控制电脑这个神器太厉害了!
  5. kotlin学习之类的扩展(四)
  6. Go 语言学习笔记(二):函数
  7. 【解析】在高级语言源程序中, 常需要用户定义的标识符为程序中的对象命名,常见的命名对象有()
  8. 数据结构题:根据所给权值设计相应的哈夫曼树,并设计哈夫曼编码
  9. 汇编怎么输入_一位过来人的嵌入式汇编语言学习经验
  10. 为什么要避免不可重复读_脏读、幻读和不可重复读?为啥?