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);// 可用返回资源id10$pu_key = openssl_pkey_get_public($public_key);1112// 加密数据13$data = array(14 'id' => '1234567890',15 'name' => '小明',16 'mobile' => '123456',17);18// 转换为JSON格式19$data = json_encode($data);2021$encrypted = '';22$decrypted = '';232425// 公钥加密26openssl_public_encrypt($data, $encrypted, $pu_key);27// base64传输28$encrypted = base64_encode($encrypted);29echo $encrypted, "<br/>";3031//私钥解密32openssl_private_decrypt(base64_decode($encrypted), $decrypted, $pi_key);33echo $decrypted, "<br/>";3435// 打印加密明文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);1415$str = json_encode($data);16$en = encrypt_rsa($str, $pu_key);1718$de = decrypt_rsa($en, $pi_key);19echo $de;2021function 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}3334function decrypt_rsa($data, $pi_key){35 $split = str_split($data, 172);// 1024bit 固定17236 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
转载于:https://www.cnblogs.com/tinywan/p/10179806.html
RSA加密传输代码示例相关推荐
- Js参数RSA加密传输之jsencrypt.js的使用
这篇文章主要介绍了Js参数RSA加密传输之jsencrypt.js的使用,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 注意几点: 1.参数传递的+号处理,在传输时会把+变成 ...
- rsa java代码_java加解密RSA使用方法代码示例
最近为了分析一段请求流,不得不去研究一下RSA加密. 首先,强调一点:密钥的"钥"读"yue",不是"yao",额... 网上关于RSA的原 ...
- 14-SpringSecurity:前后端分离项目中用户名与密码通过RSA加密传输
背景 登录认证几乎是所有互联网应用的必备功能,传统的用户名-密码认证方式依然流行,如何避免用户名.密码这类敏感信息在认证过程中被嗅探.破解? 这里将传统的用户名.密码明文传输方式改为采用 RSA 的非 ...
- iOS动态部署之RSA加密传输Patch补丁
概要:这一篇博客主要说明下iOS客户端动态部署方案中,patch(补丁)是如何比较安全的加载到客户端中. 在整个过程中,需要使用RSA来加密(你可以选择其它的非对称加密算法),MD5来做校验(同样,你 ...
- php 配置文件加密工具类,SpringBoot集成Jasypt安全框架以及配置文件内容加密(代码示例)...
本篇文章给大家带来的内容是关于SpringBoot集成Jasypt安全框架以及配置文件内容加密(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我们在SpringBoot项 ...
- 使用RSA加密传输账号密码信息
原文地址:https://blog.springcoder.cn/posts/5b7ae417.html 背景 在开发中,通常会偷懒将用户的登录信息(账号密码)直接以明文的方式发送到后端,但我们的项目 ...
- python实现rsa加密解密代码_使用python实现rsa算法代码
RSA算法是一种非对称加密算法,是现在广泛使用的公钥加密算法,主要应用是加密信息和数字签名. 维基百科给出的RSA算法简介如下: 假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息.她可以 ...
- java和python的SHA-1形式RSA加密方式代码互通
说明: 由于只知道n和d两个参数,找了许久才找到对应的python方法来生成pem格式密钥对以及对字符串进行SHA-1方式加密签名 一.生成密钥对 1.openssl生成PKCS#1格式 openss ...
- java 采用MD5加密解密代码示例(不玩套路, 非标题党, 附带解密代码)
package cn.demo; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; im ...
最新文章
- linux对称哈希 路由,基于 IP 哈希的路由
- 打包python程序
- android 自定义paint,Android中自定义常用的三个对象解析(Paint,Color,Canvas)
- Android之父深入解析Android
- Java线程—如何解决Swing的单线程问题-----------Swing线程机制
- python 切片_知乎问答之 Python 切片整理
- jQuery Mobile 中文手册 Ajax开发版(2)
- unity 调c++的dll
- 线性代数、微积分学习与回顾
- 2013北理机试-中缀转前缀
- 深度学习之基于Tensorflow2.0实现VGG16网络
- 巴特沃斯(Butterworth)滤波器 (1)
- 制作背景为透明的图标
- 解决报错Duplicate keys detected
- 虚拟机安装麒麟操作系统网络设置
- 2.2 Collections类 (Collections源码解析)
- 股票金融K线图控件AnyStock详细介绍教程
- u盘做启动盘重装系统教程
- Google Scholar GB格式引用
- Flash引导层动画的制作
热门文章
- linux日志管理命令详解
- 英语面试简短问题_用简单的英语解释产品设计
- npm构建脚本_NPM脚本简介
- node seneca_使用Node.js和Seneca编写国际象棋微服务,第1部分
- 数据通信技术(九:OSPF特殊区域配置(Cisco))
- php 保存表单数据,使用jquery和php自动保存表单数据
- 逻辑覆盖测试(四)判定/条件覆盖
- 参加完Python培训可以做什么
- java程序员入门先学什么开发者工具
- java timer cron_Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)