RSA加密传输代码示例
RSA加密传输代码示例
涉及敏感数据的传输,双方最好约定使用加密解密。那RSA非对称加密就大有作为了。
服务端可以保留自己的私钥,发给客户端对应的公钥。这样就可以互相加解密了。php中rsa加解密实现:
首先要生成一对公钥私钥。前提是linux机器上安装了openssl命令。
生成私钥文件:
1openssl genrsa -out rsa_private_key.pem 1024
利用私钥,生成公钥:
1openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
php代码案例:
1<?php
2ini_set('error_reporting', -1);
3ini_set('display_errors', -1);
4header('Content-Type: text/html; charset=utf-8');
5
6$private_key = file_get_contents("/home/users/xx/test/rsa_private_key.pem");
7$public_key = file_get_contents("/home/users/xx/test/rsa_public_key.pem");
8
9$pi_key = openssl_pkey_get_private($private_key);// 可用返回资源id
10$pu_key = openssl_pkey_get_public($public_key);
11
12// 加密数据
13$data = array(
14 'id' => '1234567890',
15 'name' => '小明',
16 'mobile' => '123456',
17);
18// 转换为JSON格式
19$data = json_encode($data);
20
21$encrypted = '';
22$decrypted = '';
23
24
25// 公钥加密
26openssl_public_encrypt($data, $encrypted, $pu_key);
27// base64传输
28$encrypted = base64_encode($encrypted);
29echo $encrypted, "<br/>";
30
31//私钥解密
32openssl_private_decrypt(base64_decode($encrypted), $decrypted, $pi_key);
33echo $decrypted, "<br/>";
34
35// 打印加密明文
36print_r(json_decode($decrypted, true));
37
公钥加密(openssl_public_encrypt),私钥解密(openssl_private_decrypt)。
私钥加密(openssl_private_encrypt),公钥解密(openssl_public_decrypt)。
都是一个道理,代码类似。RSA加密解密有个填充方式padding的参数,不同编程语言之间交互,需要注意这个。
1padding can be one of OPENSSL_PKCS1_PADDING, OPENSSL_SSLV23_PADDING, OPENSSL_PKCS1_OAEP_PADDING,OPENSSL_NO_PADDING
大于1024字节加密
值得注意的是,如果选择密钥是1024bit
长的(openssl genrsa -out rsa_private_key.pem 1024)
,那么支持加密的明文长度字节最多只能是1024/8=128byte
;
如果加密的
padding
填充方式选择的是OPENSSL_PKCS1_PADDING
(这个要占用11个字节),那么明文长度最多只能就是128-11=117
字节。如果超出,那么这些openssl加解密函数会返回false
。这时有个解决办法,把需要加密的源字符串按少于117个长度分开为几组,在解密的时候以172个字节分为几组。
其中的『少于117』(只要不大于117即可)和『172』两个数字是怎么来的,值得一说。为什么少于117就行,因为
rsa encrypt
后的字节长度是固定的,就是密钥长1024bit/8=128byte
。因此只要encrypt
不返回false
,即只要不大于117个字节,那么返回加密后的都是128byte
。172是因为什么?因为128个字节base64_encode后的长度固定是172。
这里顺便普及下
base64_encode
。encode
的长度是和原文长度有个计算公式:<br />$len2 = $len1%3 >0 ? (floor($len1/3)4 + 4) : ($len14/3);<br />
明文超出长度的代码(前提是
1024bit
的密钥长,OPENSSL_PKCS1_PADDING
的填充方式,否则数字要变化)
1<?php
2$pi_key = openssl_pkey_get_private($private_key);// 资源类型
3$pu_key = openssl_pkey_get_public($public_key);
4
5$data = array(
6 'username' => '张三1',
7 'mobile' => '13321995977',
8 'info' => '14bMitESqD4PYwODWmy7rrrvyFPEnJJTECLjvKB7IkrVxVDkp1XiJnGKH
92h5syHQ5qslPSGYJ1M/XkDnGINwaLVHVD3BoKKgKg1bZn7ao5pXT+herqxaVwWs6
10ga63yVSIC8jcODxiuvxJnUMQRLaqoF6aUb/2VWc2T5MDmxLhAkEA3pwGpvXgLiWL
113h7QLYZLrLrbFRuRN4CYl4UYaAKokkAvZly04Glle8ycgOc2DzL4eiL4l/+x/gaq
12deJU/cHLRQJBANOZY0mEoVkwhU4bScSdnfM6usQowYBEwHYY',
13);
14
15$str = json_encode($data);
16$en = encrypt_rsa($str, $pu_key);
17
18$de = decrypt_rsa($en, $pi_key);
19echo $de;
20
21function encrypt_rsa($data, $pu_key){
22 $split = str_split($data, 100);// 1024bit && OPENSSL_PKCS1_PADDING 不大于117即可
23 foreach ($split as $part) {
24 $isOkay = openssl_public_encrypt($part, $en_data, $pu_key);
25 if(!$isOkay){
26 return false;
27 }
28 // echo strlen($en_data),'<br/>';
29 $encode_data .= base64_encode($en_data);
30 }
31 return $encode_data;
32}
33
34function decrypt_rsa($data, $pi_key){
35 $split = str_split($data, 172);// 1024bit 固定172
36 foreach ($split as $part) {
37 $isOkay = openssl_private_decrypt(base64_decode($part), $de_data, $pi_key);// base64在这里使用,因为172字节是一组,是encode来的
38 if(!$isOkay){
39 return false;
40 }
41 $decode_data .= $de_data;
42 }
43 return $decode_data;
44}
45

RSA加密传输代码示例的更多相关文章
- php RSA加密传输代码示例
涉及敏感数据的传输,双方最好约定使用加密解密.那RSA非对称加密就大有作为了. 服务端可以保留自己的私钥,发给客户端对应的公钥.这样就可以互相加解密了.php中rsa加解密实现: 首先要生成一对公钥私 ...
- php RSA加密传输代码示例(轉)
原文地址:http://www.cnblogs.com/firstForEver/p/5803940.html 涉及敏感数据的传输,双方最好约定使用加密解密.那RSA非对称加密就大有作为了. 服务端可 ...
- iOS动态部署之RSA加密传输Patch补丁
概要:这一篇博客主要说明下iOS客户端动态部署方案中,patch(补丁)是如何比较安全的加载到客户端中. 在整个过程中,需要使用RSA来加密(你可以选择其它的非对称加密算法),MD5来做校验(同样,你 ...
- Js参数RSA加密传输,jsencrypt.js的使用
注意几点: 1.参数传递的+号处理,在传输时会把+变成空格,不处理后端就报错了. 1.前段代码 <!DOCTYPE html> <html> <head> < ...
- RSA加密原理使用方式签名验证
RSA加密原理使用方式签名验证 加密是网络传输中非常重要的一环,它保证了信息的安全性,让他人无法通过抓包来获取通讯的信息也无法通过伪造信息而实现对系统的入侵.其中最为常用的信息传递加密方式就是RS ...
- vue实现rsa加密,数字签名,md5加密等
一.使用jsencrypt进行rsa加密 原文链接:Js参数RSA加密传输,jsencrypt.js的使用 - CSDN博客 *(原文处有一个地方不对,不需要转换+,rsa已经做过base64转码了) ...
- vue使用JSEncrypt实现rsa加密及挂载方法
挂载全局方法 使用jsencrypt进行rsa加密 原文链接:Js参数RSA加密传输,jsencrypt.js的使用 - CSDN博客* https://blog.csdn.net/p31201115 ...
- 用RSA加密实现Web登录密码加密传输
通常我们做一个Web应用程序的时候都需要登录,登录就要输入用户名和登录密码,并且,用户名和登录密码都是明文传输的,这样就有可能在中途被别人拦截,尤其是在网吧等场合. 这里顺带一个小插曲,我以前有家公司 ...
- 用RSA实现Web单点登录密码的加密传输
在使用通用权限管理系统(吉日嘎拉)的单点登录功能时,对登录密码使用了RSA加密(非对称加密),有使用这个权限管理系统的可参考下. 前端部分,请引用以下几个js文件: <script type=& ...
随机推荐
- springCloud feign使用/优化总结
基于springCloud Dalston.SR3版本 1.当接口参数是多个的时候 需要指定@RequestParam 中的value来明确一下. /** * 用户互扫 * @param uid 被扫 ...
- DataPipeline CTO陈肃:从ETL到ELT,AI时代数据集成的问题与解决方案
引言:2018年7月25日,DataPipeline CTO陈肃在第一期公开课上作了题为<从ETL到ELT,AI时代数据集成的问题与解决方案>的分享,本文根据陈肃分享内容整理而成. 大家好 ...
- firewalld防火墙设置
CentOS7/RHEL7系统默认的iptables管理工具是firewalld,不再是以往的iptables-services,命令用起来也是不一样了,当然你也可以选择卸载firewalld,安装i ...
- 迁移FRS至DFSR SYSVOL
截至2017年6月20日,Windows 2016 RS1系统为最后一版支持FRS,后续版本将不再包含该功能,详细见 https://support.microsoft.com/en-us/help/ ...
- Oracle知识点总结2
1.聚合函数:也叫分组函数. 常用聚合函数:返回的都是NUMBER类型的值. 注:避免使用 COUNT(*) ,而使用 COUNT(ROWID) 2.分组统计:group by 字段名 having ...
- 为什么区块链和加密行业需要 Web 3?
为什么区块链和加密行业需要 Web 3? “由于人们都想从互联网上获得好处,互联网已经演变成了一个导致不公平和分裂的引擎,它被强大的力量所支配,并且任由其摆布.“——万维网之父.互联网先驱 Tim B ...
- Day 2 下午
[POJ 3468]A Simple Problem with Integers给定Q个数A1, ..., AQ,多次进行以下操作:1.对区间[L, R]中的每个数都加n.2.求某个区间[L, R]中 ...
- c++ primer plus 第二章 \n与endl在输出上的区别
在书上看到如下一段话: 一个差别是,endl确保程序继续运行前刷新输出(将其立即显示在屏幕上):而使用"\n"不能提供这样的保证,这意味着在有些系统中,有时可能在您 ...
- IdentityServer4客户端如何获取自定义声明,了解一下?
前言 久违了各位,之前录制过IdentityServer4的基础视频(https://space.bilibili.com/319652230/#/),有兴趣了解的童鞋可以看一下,只不过未发表成博客. ...
- day06(深浅拷贝,元组,字典,集合)
1,今日内容: 1.深浅拷贝:**** 2.元组 - 元组可以存放可变类型 *** 3.字典:***** -- 增删改查 -- 常用方法 4.集合:** -- 集合运算 5.数据类型的相互转化 *** ...