提到密钥,我们不得不提到RSA的三个重要大数:公钥指数e、私钥指数d和模值n。这三个大数是我们使用RSA时需要直接接触的,理解了本文的基础概念,即使未接触过RSA的开发人员也能应对自如的使用RSA相关函数库,无需深入了解e、d、n是如何生成的,只需要知道我该如何用、要注意什么。

一、密钥长度

1、密钥是指谁?

首先我们说的“密钥”是指谁?由于RSA密钥是(公钥+模值)、(私钥+模值)分组分发的,单独给对方一个公钥或私钥是没有任何用处,所以我们说的“密钥”其实是它们两者中的其中一组。但我们说的“密钥长度”一般只是指模值的位长度。目前主流可选值:1024、2048、3072、4096...

2、模值主流长度是多少?

目前主流密钥长度至少都是1024bits以上,低于1024bit的密钥已经不建议使用(安全问题)。那么上限在哪里?没有上限,多大都可以使用。所以,主流的模值是1024位,实际运算结果可能会略小于1024bits,注意,这个值不是绝对的,跟素数的生成算法有关系,只是告诉素数生成器“帮我生成一个接近1024位的素数而已”,然后生成器“好,给您一个,这个差不多1024位”。

素数生成器这么厉害?说生成1024位就会出个1024位的大整数?真实的情况是素数生成器也只是在1024bits对应的整数附近进行“摸索”而已,大家其实都不容易,又要快又要准确又要随机性,那么素数生成器也只能应付一下,找到1024位的算是好运,没找到1024位,1023位也照样送出来:)。

3、公钥指数如何确定?

公钥指数是随意选的,但目前行业上公钥指数普遍选的都是65537(0x10001,5bits),该值是除了1、3、5、17、257之外的最小素数,为什么不选的大一点?当然可以,只是考虑到既要满足相对安全、又想运算的快一点(加密时),PKCS#1的一个建议值而已。

有意的把公钥指数选的小一点,但是对应私钥指数肯定很大,意图也很明确,大家都要用公钥加密,所以大家时间很宝贵,需要快一点,您一个人私钥解密,时间长一点就多担待,少数服从多数的典型应用。

4、私钥指数如何确定?

公钥指数随意选,那么私钥就不能再随意选了,只能根据算法公式(ed%k=1,k=(p-1)(q-1))进行运算出来。那么私钥指数会是多少位?根据ed关系,私钥d=(x*k+1)/e,所以单看这个公式,私钥指数似乎也不是唯一结果,可能大于也可能小于1024bits的,但我们习惯上也是指某个小于1024bits的大整数。

包括前文的公钥指数,在实际运算和存储时为方便一般都是按照标准位长进行使用,前面不足部分补0填充,所以,使用保存和转换这些密钥需要注意统一缓冲区的长度。

二、明文长度

网上有说明文长度小于等于密钥长度(Bytes)-11,这说法本身不太准确,会给人感觉RSA 1024只能加密117字节长度明文。实际上,RSA算法本身要求加密内容也就是明文长度m必须0<m<n,也就是说内容这个大整数不能超过n,否则就出错。那么如果m=0是什么结果?普遍RSA加密器会直接返回全0结果。如果m>n,运算就会出错?!那怎么办?且听下文分解。

所以,RSA实际可加密的明文长度最大也是1024bits,但问题就来了:

如果小于这个长度怎么办?就需要进行padding,因为如果没有padding,用户无法确分解密后内容的真实长度,字符串之类的内容问题还不大,以0作为结束符,但对二进制数据就很难理解,因为不确定后面的0是内容还是内容结束符。

只要用到padding,那么就要占用实际的明文长度,于是才有117字节的说法。我们一般使用的padding标准有NoPPadding、OAEPPadding、PKCS1Padding等,其中PKCS#1建议的padding就占用了11个字节。

如果大于这个长度怎么办?很多算法的padding往往是在后边的,但PKCS的padding则是在前面的,此为有意设计,有意的把第一个字节置0以确保m的值小于n。

这样,128字节(1024bits)-减去11字节正好是117字节,但对于RSA加密来讲,padding也是参与加密的,所以,依然按照1024bits去理解,但实际的明文只有117字节了。

关于PKCS#1 padding规范可参考:RFC2313 chapter 8.1,我们在把明文送给RSA加密器前,要确认这个值是不是大于n,也就是如果接近n位长,那么需要先padding再分段加密。除非我们是“定长定量自己可控可理解”的加密不需要padding。

三、密文长度

密文长度就是给定符合条件的明文加密出来的结果位长,这个可以确定,加密后的密文位长跟密钥的位长度是相同的,因为加密公式:

C=(P^e)%n

所以,C最大值就是n-1,所以不可能超过n的位数。尽管可能小于n的位数,但从传输和存储角度,仍然是按照标准位长来进行的,所以,即使我们加密一字节的明文,运算出来的结果也要按照标准位长来使用(当然了,除非我们能再采取措施区分真实的位长,一般不在考虑)。

至于明文分片多次加密,自然密文长度成倍增长,但已不属于一次加密的问题,不能放到一起考虑。

RSA 密钥 明文 密文 长度介绍相关推荐

  1. RSA密钥长度、明文长度和密文长度

    RSA密钥长度.明文长度和密文长度 本文整理RSA加解密中必须考虑到的密钥长度.明文长度和密文长度问题知识,对第一次接触RSA的开发人员来说,RSA算是比较复杂的算法,以后还会补充几篇RSA基础知识专 ...

  2. [crypto]-05-转载:PKCS #1 RSA Encryption Version 1.5介绍

    转载:https://www.cnblogs.com/spencerN/archive/2012/10/18/2729602.html 在进行RSA运算时需要将源数据D转化为Encryption bl ...

  3. LKT系列加密芯片如何预置openssl生成的rsa密钥完成运算(三)

    第三篇 如何使用加密芯片完成RSA运算 1.测试目标 使用已经预置RSA密钥的LKT系列加密芯片完成运算 2.测试环境 本示例运行环境为windows系统.测试软件LCS KIT.LKT-K100开发 ...

  4. RSA密钥生成、加密解密、数据签名验签

    公钥.私钥生成 准备工作,基础的帮助类 使用java代码生成公钥私钥 使用openssl生成公钥私钥 加解密 数据签名及验签 数据加解密及签名验签测试 注意项 公钥.私钥生成 准备工作,基础的帮助类 ...

  5. js实现rsa密钥的加密、解密与生成

    今天想用js实现rsa的加解密的,在网上找了好久,下载啊什么的,十分麻烦,今天我也不bb的直接放代码 rsa.html <!DOCTYPE html> <html lang=&quo ...

  6. [Linux] 在 Linux CLI 使用 ssh-keygen 生成 RSA 密钥

    RSA 是一种公钥加密算法,在 1977 年由麻省理工学院的 Ron Rivest, Adi Shamir, Leonard Adleman 三人一起提出,因此该算法命名以三人姓氏首字母组合而成. S ...

  7. openssl和keytool生成rsa密钥及证书开发指南

    目录 一 .什么是RSA 二.der编码与pem编码 三.openssl命令生成rsa密钥 四.RSA加密标准PKCS 五.密钥与证书 六.jks证书 一. 什么是RSA RSA是一种公钥密码算法,它 ...

  8. RSA密钥格式解析 DER-PEM 转换代码

    环境: ubuntu20.4 内核 5.10.10 RSA是最常见的非对称加密算法,RSA的原理就不做介绍了,主要介绍一下密钥格式,linux 进行密钥转换编程. 要学习RSA编码,首先需要理解RSA ...

  9. 【C 语言】文件操作 ( 文件加密解密 | 加密解密原理 | 对称加密原理 | 非密钥整数倍长度的数据加密处理 )

    文章目录 一.对称加密原理 二.非密钥整数倍长度的数据加密处理 一.对称加密原理 给定一个 密钥 , 密钥的 长度不确定 , 可能是 323232 字节 , 也可能是 646464 字节 ; 将 被加 ...

最新文章

  1. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY11-特征选择和稀疏学习
  2. Fedora配置网络DHCP
  3. 成就优秀程序员的很多因素你知道多少?
  4. JEECG - 基于代码生成器的J2EE智能开发框架 杂记:【演示视频和源码】
  5. hdu2074java
  6. 第1章-确定superboot210如何为smart210的nand flash进行的分区划分
  7. ios 裁剪框大小_ios – 如何将视频裁剪为特定大小?
  8. 个人推荐讲的非常好的数据结构免费[速成 速成 速成]视频了
  9. 小度wifi还原为无线网卡
  10. 使用pandas sns绘图
  11. 黑盒测试方法之错误推测法概述
  12. 爬虫模拟登陆强智教务系统
  13. 请帮我写一封情书,500字左右
  14. 现代笑话二则:1.宿舍找钱;2.不漂亮的漂亮。
  15. c++ C2001 常量中有换行符
  16. canvas中getContext(“2d“) 对象的属性和方法
  17. 系统认证风险预测方案总结
  18. 第五十五讲 插件设备树
  19. AtCoder Beginner Contest 250 C~E 题解
  20. PIR热释电红外人体感应IC

热门文章

  1. PCB铜箔厚度、线宽与允许通多电流大小的关系
  2. ASCII、GB2312、GBK、Unicode、UTF-8介绍和转换
  3. cookie之登录用户凭证
  4. 如何避免表单重复提交
  5. 6款实用开源报表工具 | 码云周刊第 83 期
  6. 分布式b2b b2c o2o电子商务云平台
  7. genisoimage命令用法
  8. ElasticSearch 组合过滤器
  9. windows环境下如何安装memcached教程
  10. linux 下批量修改文件的编码