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_encodeencode的长度是和原文长度有个计算公式:
    <br />$len2 = $len1%3 &gt;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加密传输代码示例相关推荐

  1. Js参数RSA加密传输之jsencrypt.js的使用

    这篇文章主要介绍了Js参数RSA加密传输之jsencrypt.js的使用,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 注意几点: 1.参数传递的+号处理,在传输时会把+变成 ...

  2. rsa java代码_java加解密RSA使用方法代码示例

    最近为了分析一段请求流,不得不去研究一下RSA加密. 首先,强调一点:密钥的"钥"读"yue",不是"yao",额... 网上关于RSA的原 ...

  3. 14-SpringSecurity:前后端分离项目中用户名与密码通过RSA加密传输

    背景 登录认证几乎是所有互联网应用的必备功能,传统的用户名-密码认证方式依然流行,如何避免用户名.密码这类敏感信息在认证过程中被嗅探.破解? 这里将传统的用户名.密码明文传输方式改为采用 RSA 的非 ...

  4. iOS动态部署之RSA加密传输Patch补丁

    概要:这一篇博客主要说明下iOS客户端动态部署方案中,patch(补丁)是如何比较安全的加载到客户端中. 在整个过程中,需要使用RSA来加密(你可以选择其它的非对称加密算法),MD5来做校验(同样,你 ...

  5. php 配置文件加密工具类,SpringBoot集成Jasypt安全框架以及配置文件内容加密(代码示例)...

    本篇文章给大家带来的内容是关于SpringBoot集成Jasypt安全框架以及配置文件内容加密(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我们在SpringBoot项 ...

  6. 使用RSA加密传输账号密码信息

    原文地址:https://blog.springcoder.cn/posts/5b7ae417.html 背景 在开发中,通常会偷懒将用户的登录信息(账号密码)直接以明文的方式发送到后端,但我们的项目 ...

  7. python实现rsa加密解密代码_使用python实现rsa算法代码

    RSA算法是一种非对称加密算法,是现在广泛使用的公钥加密算法,主要应用是加密信息和数字签名. 维基百科给出的RSA算法简介如下: 假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息.她可以 ...

  8. java和python的SHA-1形式RSA加密方式代码互通

    说明: 由于只知道n和d两个参数,找了许久才找到对应的python方法来生成pem格式密钥对以及对字符串进行SHA-1方式加密签名 一.生成密钥对 1.openssl生成PKCS#1格式 openss ...

  9. java 采用MD5加密解密代码示例(不玩套路, 非标题党, 附带解密代码)

    package cn.demo; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; im ...

最新文章

  1. linux对称哈希 路由,基于 IP 哈希的路由
  2. 打包python程序
  3. android 自定义paint,Android中自定义常用的三个对象解析(Paint,Color,Canvas)
  4. Android之父深入解析Android
  5. Java线程—如何解决Swing的单线程问题-----------Swing线程机制
  6. python 切片_知乎问答之 Python 切片整理
  7. jQuery Mobile 中文手册 Ajax开发版(2)
  8. unity 调c++的dll
  9. 线性代数、微积分学习与回顾
  10. 2013北理机试-中缀转前缀
  11. 深度学习之基于Tensorflow2.0实现VGG16网络
  12. 巴特沃斯(Butterworth)滤波器 (1)
  13. 制作背景为透明的图标
  14. 解决报错Duplicate keys detected
  15. 虚拟机安装麒麟操作系统网络设置
  16. 2.2 Collections类 (Collections源码解析)
  17. 股票金融K线图控件AnyStock详细介绍教程
  18. u盘做启动盘重装系统教程
  19. Google Scholar GB格式引用
  20. Flash引导层动画的制作

热门文章

  1. linux日志管理命令详解
  2. 英语面试简短问题_用简单的英语解释产品设计
  3. npm构建脚本_NPM脚本简介
  4. node seneca_使用Node.js和Seneca编写国际象棋微服务,第1部分
  5. 数据通信技术(九:OSPF特殊区域配置(Cisco))
  6. php 保存表单数据,使用jquery和php自动保存表单数据
  7. 逻辑覆盖测试(四)判定/条件覆盖
  8. 参加完Python培训可以做什么
  9. java程序员入门先学什么开发者工具
  10. java timer cron_Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)