一、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加密模式相关推荐

  1. Qt之arm使用openssl(RSA加密)

    官网openssl-3.0.2.tar.gz版本源码:链接:https://pan.baidu.com/s/1iEv2X_99X3p3jyQnOx1C8g  提取码:61x9 使用过的源码:链接:ht ...

  2. OpenSSL RSA加密和解密

    rsa加密的密钥格式常见的有两种: 一种是PKCS#1,密钥头为 -----BEGIN RSA PUBLIC KEY----- 一种是PKCS#8,密钥头为 -----BEGIN PUBLIC KEY ...

  3. Android 在 NDK 层使用 OpenSSL 进行 RSA 加密

    前言 需求:需要在NDK层对一个Java层的字符串进行RSA加密,然后对加密的结果进行Base64返回到Java层 方案:选择使用OpenSSL来实现. 编译libssl.a和libcrypto.a静 ...

  4. 使用OpenSSL进行RSA加密和解密(非对称)

    1. RSA加密和解密基础概念 RSA是一种非对称加密. RSA秘钥:私钥和公钥,一对私钥和公钥就像夫妻一样是唯一的,用私钥加密后必须用对应的公钥才能解密,用公钥加密后必须用对应的私钥才能解密. 加密 ...

  5. C++使用OPENSSL进行RSA加密,java服务端解密

    RSA是一种非对称加密. 加密和解密方式:公钥加密-私钥解密,私钥加密-公钥解密 背景 为了网络数据安全,Web端(Java)要求用RSA加密算法传数据,公钥加密私钥解密方式(RSA有公钥加密私钥解密 ...

  6. 安卓和php接口数据传输加密,安卓与PHP间的RSA(openssl)交互加密的坑

    这几天在写一个安卓的RSA公钥加密算法,用于跟PHP后台接口进行交互.在实践过程中发现了几个坑.其中我的公钥和私钥都是通过openssl生成的pem格式. 遇到的坑: 1.通过java的RSA公钥加密 ...

  7. OpenSSL中的大数接口与基于其的自用RSA加密接口设计

    本文记录了初次接触OpenSSL中的大数模块,重温了RSA加密流程,使用OpenSSL的接口包装成自用RSA加密接口,并且利用自己的接口演示了Alice与Bob通过RSA加密进行通讯的一个示例. 概览 ...

  8. python3 rsa加密_【Python】Python3 实现 JS 中 RSA 加密的 NoPadding 模式

    前因后果之哗啦啦废话连篇: 这几天本人在 Python 做某网站登陆的时候,发现其登陆时用户名和密码被加密了 F12 仔细看了一下,发现是调用了一个 js 的 rsa 加密库,页面 dom 中有 rs ...

  9. openssl 非对称加密 RSA 加密解密以及签名验证签名

    1. 简介 openssl  rsa.h 提供了密码学中公钥加密体系的一些接口, 本文主要讨论利用rsa.h接口开发以下功能 公钥私钥的生成 公钥加密,私钥解密 私钥加密,公钥解密 签名:私钥签名 验 ...

最新文章

  1. JDK 8 Stream 数据流效率怎么样?
  2. centos在yum install报错:Another app is currently holding the yum lock解决方法
  3. 可重入锁ReentrantLock--转载
  4. eclipse中properties文件编辑插件:PropertiesEditor
  5. 聊聊我常用的5款动态数据可视化工具
  6. matlab中的logspace,matlab中的logspace(a,b,n)究竟怎么理解,看下例题,谁能详细解给我看...
  7. Taro+react开发(63) 修改蓝湖的样式
  8. 软件工程详细设计说明书_软件设计师
  9. 有标号的DAG计数 II
  10. unity3D读取Txt文件中信息
  11. Web 开发常备工具
  12. [转] Python的import初探
  13. 算法:时间、空间复杂度
  14. 01-信贷路由项目架构和 rose 框架的搭建
  15. 自相关法谱估计matlab,自相关法估计功率谱密度
  16. 广告联盟的实现过程(一)
  17. php 获取数组四分位,如何在JavaScript(或PHP)中获得数组的中位数和四分位数/百分位数?...
  18. 《弃子长安》第十一章 一路向西
  19. Diagnostic Viewer 显示空白
  20. 微信小程序中实现瀑布流

热门文章

  1. Nuendo 4 v4.3 WiN 中文完整版音乐制作编曲软件下载
  2. 联想主板9针开关接线图_2020新款联想笔记本打开盖子自动开机的问题
  3. 动态规划问题思想及算法
  4. android SeekBar 样式大全
  5. MySql 查询课程成绩全都及格了的学生的学号、姓名与系别
  6. Python - 第一个爬虫代码,爬电子书下载地址
  7. HTML5 新增 API
  8. 【每日1刷系列】软件测试常见面试题—深层概念
  9. android studio inspect code,Android Studio使用inspect code删除 unused import
  10. Mastering OpenCV with Practical Computer Vision Projects