本文介绍RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题,对第一次接触RSA的开发人员来说,RSA算是比较复杂的算法,天缘以后还会补充几篇RSA基础知识专题文章,用最简单最通俗的语言描述RSA,让各位了解RSA算法本身其实也很简单,RSA的复杂度是因为数学家把效率和安全也考虑进去的缘故。

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

一、密钥长度

1、密钥是指谁?

首先我们说的“密钥”是指谁?由于RSA密钥是(公钥+模值)、(私钥+模值)分组分发的,单独给对方一个公钥或私钥是没有任何用处,所以我们说的“密钥”其实是它们两者中的其中一组。但我们说的“密钥长度”一般只是指模值的位长度。目前主流可选值:1024、2048、3072、4096... 单位:位 ,这是二进制数字的计数单位,1024位(bit)中的位是二进制中最小的单元,比如“0001”这是四位,“0001 0010“这种就是8位了”,1字节(Byte)=8位(bit)。128字节等于1024位,也就是说签名或者加密之后的byte数组的长度为128。如果转化为16进制  (1个byte 占用8bit,1个16进制位占4bit),所以128*2 =256

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的位数,但从传输和存储角度,仍然是按照标准位长来进行的,所以,即使我们加密一字节的明文,运算出来的结果也要按照标准位长来使用(当然了,除非我们能再采取措施区分真实的位长,一般不在考虑)。

如果密钥是1024位,也就是说签名或者加密之后的byte数组的长度为128。如果转化为16进制  (1个byte 占用8bit,1个16进制位占4bit),所以128*2 =256

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

非对称数字签名算法 :RSA 秘钥长度相关推荐

  1. java 3des 32位密钥_3des,java_java 中32位秘钥长度的 3des加密方法?,3des,java - phpStudy...

    java 中32位秘钥长度的 3des加密方法? java 中 3des加密 默认是24位秘钥的 现在需求是 32位秘钥加密 尝试很多种方法 解决 结果都不正确 // 密钥 private final ...

  2. python3 rsa加密_python3产生RSA秘钥对并执行加解密操作详解

    加密使用的是公钥对数据进行加密,而且当你使用一把1024bit的rsa公钥的时候,你一次只能加密最多117byte的数据,如果数据量超过这个数,可能会涉及到对数据进行分段加密的问题.而且现在rsa 1 ...

  3. 【加密与解密】Openssl 生成的RSA秘钥如被C#使用解密

    openssl生成的RSA公私钥对保存一个pem文件中,生成时可以选择加密与不加密,如果要提取私钥需要用到openssl rsa进行提取,之后用c#转换为xml之后再对加密数据进行解密,详细如下: 1 ...

  4. ssh rsa秘钥不可用

    现象 ssh登录秘钥鉴权失败: git远程仓库秘钥鉴权失败: 原因 openssh升级后不再支持rsa算法. 解决方案 使用其他算法重新生成密钥.比如:ssh-keygen -t ed25519. s ...

  5. PEM格式RSA 秘钥转bin格式

    公钥PUBKey.bits = 1024;for(int tmp=0;tmp<128;tmp++){PUBKey.modulus[tmp]=decode[29+tmp];}PUBKey.expo ...

  6. 区分获取SM2、RSA类型证书的密钥长度、秘钥算法和签名算法值

    最近不知道在忙什么,也不知道写点什么,直接丢个工具类吧~~~ /*** 获取X509证书的秘钥算法和秘钥长度** @param certificate* @return*/public static ...

  7. 密码算法原理与分析:RSA安全与秘钥基础设施

    本文转自网络文章,内容均为非盈利,版权归原作者所有. 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除. 原文作者:evilpan 原文地址:RSA安全与秘钥基础设施 目录 前言 RSA原理 秘钥 ...

  8. RSA安全与秘钥基础设施

    之前写过一篇对称加密与攻击案例分析,而对于非对称加密,虽然接触的时间不短了,但一直没有很系统的记录过.因此趁着国庆家里蹲的五天长假,就来好好回顾总结一下. 前言 其实从加密的定语就能看出,对称加密表示 ...

  9. 利用Xshell实现非对称秘钥对安全登陆linux服务器(Centos、Ubuntu)

    非对称加密算法简述: 对称加密算法在加密和解密时使用的是同一个秘钥:而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private ke ...

最新文章

  1. 2018-4-7 包子阳书本39页例题
  2. 增加行星轮减速后机械臂调试
  3. Qt下使用Shader绘制三角形
  4. dsp调音一次多少钱_DSP调音中EQ使用技巧
  5. 【最小生成树】水箱(P5952)
  6. 22 大端序和小端序
  7. CentOS6.5 安装ORACLE 安装界面乱码解决方案
  8. Object-C,四则运算计算器
  9. 【ELK】ELK安装与配置
  10. 吴恩达机器学习(十二)主成分分析(降维、PCA)
  11. 软件框架的理解(转载)
  12. JDBC连接各种数据库的方法(经典)
  13. 【MySQL】 锁机制:InnoDB引擎中锁分类以及表锁、行锁、页锁详解
  14. 微信windows版_微信多开教程:Win、Mac、iOS、Android
  15. 【程序人生】领导素质 | 第 5 级领导力:个人谦逊和坚定意志的胜利 | Level 5 Leadership: The Triumph of Humility and Fierce Resolve
  16. 【JAVA】一种寻找错误的方法
  17. Lorem在HTML的使用
  18. 使用python编写彩色圆圈
  19. C语言:优先级与运算符的介绍
  20. pythonista免费下载-pythonista 3ios

热门文章

  1. css立体3d效果动画,css3 实现动画,变换基点及3D效果~
  2. C语言之简单版本银行储蓄系统4(结构体版本)
  3. portal 源代码
  4. ubuntu18安装Nvidia显卡驱动(亲测有效)
  5. 读书笔记之《程序员你为什么这么累-晓风轻编码规范》
  6. 禁用微软杀毒和移除以Paint 3D打开的相关注册表:
  7. matlab多元方程整数解,matlab多元非线性方程组解法
  8. 帕金森病会引起哪些并发症
  9. HTML5网页设计基础——精美电商悬浮窗
  10. Portal产品对比分析报告