OpenSSL RSA加密模式
一、RSA_NO_PADDING模式,顾名思义,无填充;
测试运行时,也遇到几个问题,需要注意(以下举例均以模数1024bit,128字节):
1、加密数不能大于模数
否则,会报错:“data too large for modulus”,这个是正常的,否则大于模数解密时会出问题,因为加解密都是取模的。
因此,在读取文件加密时,每次读取128字节时,有可能大于模数,因此需要判断;大于模数时,读取127字节。
但问题也出来了:解密出来怎么判断第一个00是真实数据,还是需要去掉的呢?
PS:其他加密模式通过填充均避免了这种情况。
2、加密长度必须为keysize字节
如果不等于,则报错:“data too large /too small for key size”,因为无填充,所以你的输入必须满(特别是最后一个数,不足时需要自己填充了)!
善用RSA报错处理:
char err[256];int ret = RSA_public_encrypt(keysize_y/8,buf,pEncode,rsaK,RSA_NO_PADDING);if(ret==-1){// ERR_load_RSA_strings();ERR_load_crypto_strings();ERR_error_string(ERR_get_error(), err);printf("%s\n",err);return;}
二、RSA_PKCS1_PADDING 模式
/*RFC 2313 - PKCS #1: RSA Encryption Version 1.5 EB = 00 || BT || PS || 00 || DEB - Encryption BlockBT - Block Type :: 00 or 01 for private-key operation; 02 for public-key operationPS - Padding String :: length = k-3-||D||BT 00: all 00BT 01: all FFBT 02: pseudorandomly generated and nonzeroD - Datak - length of modulus in octets
*/
1、填充规则如上(其实看英文理解的更好,翻译的有词不达意的),
(1)EB为填充完毕后的加密块,EB = 00 || BT || PS || 00 || D
(2)BT块类型,00/01为私钥操作;02为公钥操作(即公钥加密时置02.......)
(3)PS为填充数组,长度=模长-3-输入明文长度,BT=00时:填充全00;BT=01时填充全FF;BT=02时填充非零随机数(实测:只要非零即可)
(4)D为要加密的明文数据
2、注意
填充PS,至少8字节,所以,输入明文最多(模长-11)字节;
只要按以上规则填充加密,你就可以与openSSL互相加解密。
(填充完毕后,其实就是按照无填充模式加密了)填充第一字节为00,保证了输入小于模数,肯定可以加密成功。
去填充也很简单,根据填充格式去掉即可,主要是00....00,后面的就是真实明文了。
三、RSA_PKCS1_OAEP_PADDING模式
据说是最安全的一种填充。
参考:https://blog.csdn.net/github_35454460/article/details/51862470
与OpenSSL源码对照看,能看的更明白。
(1)其hash函数用的是sha1,输出是20字节;所以加密输入不能大于(模长-42)字节;42字节为2个20字节、2个1字节(00、01,PS可以没有);
(2)经测试,seed可以是任何数,全0、随机均可;
(3)利用源码和GMP库,自写加密,然后OpenSSL解密通过;需要注意的是:加密后的GMP大数在写入数组给OpenSSL解密时,要写入到模数大小的数组里,比如1024bit、256字节,要前面置0,而不是后面置0;即整个大数放到数组里应该就是原来的样子,如果只有255字节大小,应该第一个字节为0;而我在测试时直接从位置0开始写入的导入最后一个字节为0,是错误的。其他模式同理。
(4)利用源码和GMP库,自加密后,自解密时,先x^e mod n为pading后的数据EM(上图中的),此数据应该小于等于127字节(1024模数的话),因为EM第一字节为0(EM为大数时第一字节0实际不存在的),进行padding_check时,输入的数据就是这127字节的数据。(而不能是128字节带着第一字节0)
OpenSSL RSA加密模式相关推荐
- Qt之arm使用openssl(RSA加密)
官网openssl-3.0.2.tar.gz版本源码:链接:https://pan.baidu.com/s/1iEv2X_99X3p3jyQnOx1C8g 提取码:61x9 使用过的源码:链接:ht ...
- OpenSSL RSA加密和解密
rsa加密的密钥格式常见的有两种: 一种是PKCS#1,密钥头为 -----BEGIN RSA PUBLIC KEY----- 一种是PKCS#8,密钥头为 -----BEGIN PUBLIC KEY ...
- Android 在 NDK 层使用 OpenSSL 进行 RSA 加密
前言 需求:需要在NDK层对一个Java层的字符串进行RSA加密,然后对加密的结果进行Base64返回到Java层 方案:选择使用OpenSSL来实现. 编译libssl.a和libcrypto.a静 ...
- 使用OpenSSL进行RSA加密和解密(非对称)
1. RSA加密和解密基础概念 RSA是一种非对称加密. RSA秘钥:私钥和公钥,一对私钥和公钥就像夫妻一样是唯一的,用私钥加密后必须用对应的公钥才能解密,用公钥加密后必须用对应的私钥才能解密. 加密 ...
- C++使用OPENSSL进行RSA加密,java服务端解密
RSA是一种非对称加密. 加密和解密方式:公钥加密-私钥解密,私钥加密-公钥解密 背景 为了网络数据安全,Web端(Java)要求用RSA加密算法传数据,公钥加密私钥解密方式(RSA有公钥加密私钥解密 ...
- 安卓和php接口数据传输加密,安卓与PHP间的RSA(openssl)交互加密的坑
这几天在写一个安卓的RSA公钥加密算法,用于跟PHP后台接口进行交互.在实践过程中发现了几个坑.其中我的公钥和私钥都是通过openssl生成的pem格式. 遇到的坑: 1.通过java的RSA公钥加密 ...
- OpenSSL中的大数接口与基于其的自用RSA加密接口设计
本文记录了初次接触OpenSSL中的大数模块,重温了RSA加密流程,使用OpenSSL的接口包装成自用RSA加密接口,并且利用自己的接口演示了Alice与Bob通过RSA加密进行通讯的一个示例. 概览 ...
- python3 rsa加密_【Python】Python3 实现 JS 中 RSA 加密的 NoPadding 模式
前因后果之哗啦啦废话连篇: 这几天本人在 Python 做某网站登陆的时候,发现其登陆时用户名和密码被加密了 F12 仔细看了一下,发现是调用了一个 js 的 rsa 加密库,页面 dom 中有 rs ...
- openssl 非对称加密 RSA 加密解密以及签名验证签名
1. 简介 openssl rsa.h 提供了密码学中公钥加密体系的一些接口, 本文主要讨论利用rsa.h接口开发以下功能 公钥私钥的生成 公钥加密,私钥解密 私钥加密,公钥解密 签名:私钥签名 验 ...
最新文章
- JDK 8 Stream 数据流效率怎么样?
- centos在yum install报错:Another app is currently holding the yum lock解决方法
- 可重入锁ReentrantLock--转载
- eclipse中properties文件编辑插件:PropertiesEditor
- 聊聊我常用的5款动态数据可视化工具
- matlab中的logspace,matlab中的logspace(a,b,n)究竟怎么理解,看下例题,谁能详细解给我看...
- Taro+react开发(63) 修改蓝湖的样式
- 软件工程详细设计说明书_软件设计师
- 有标号的DAG计数 II
- unity3D读取Txt文件中信息
- Web 开发常备工具
- [转] Python的import初探
- 算法:时间、空间复杂度
- 01-信贷路由项目架构和 rose 框架的搭建
- 自相关法谱估计matlab,自相关法估计功率谱密度
- 广告联盟的实现过程(一)
- php 获取数组四分位,如何在JavaScript(或PHP)中获得数组的中位数和四分位数/百分位数?...
- 《弃子长安》第十一章 一路向西
- Diagnostic Viewer 显示空白
- 微信小程序中实现瀑布流
热门文章
- Nuendo 4 v4.3 WiN 中文完整版音乐制作编曲软件下载
- 联想主板9针开关接线图_2020新款联想笔记本打开盖子自动开机的问题
- 动态规划问题思想及算法
- android SeekBar 样式大全
- MySql 查询课程成绩全都及格了的学生的学号、姓名与系别
- Python - 第一个爬虫代码,爬电子书下载地址
- HTML5 新增 API
- 【每日1刷系列】软件测试常见面试题—深层概念
- android studio inspect code,Android Studio使用inspect code删除 unused import
- Mastering OpenCV with Practical Computer Vision Projects