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

本文介绍RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题,对第一次接触RSA的开发人员来讲,RSA算是比较复杂的算法,RSA算法自己其实也很简单,RSA的复杂度是由于数学家把效率和安全也考虑进去的缘故。html

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

1、密钥长度

一、密钥是指谁?

首先咱们说的“密钥”是指谁?因为RSA密钥是(公钥+模值)、(私钥+模值)分组分发的,单独给对方一个公钥或私钥是没有任何用处,因此咱们说的“密钥”实际上是它们二者中的其中一组。但咱们说的“密钥长度”通常只是指模值的位长度。目前主流可选值:102四、204八、307二、4096...算法

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

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

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

三、公钥指数如何肯定?

公钥指数是随意选的,但目前行业上公钥指数广泛选的都是65537(0x10001,5bits),该值是除了一、三、五、1七、257以外的最小素数,为何不选的大一点?固然能够,只是考虑到既要知足相对安全、又想运算的快一点(加密时),PKCS#1的一个建议值而已。函数

有意的把公钥指数选的小一点,可是对应私钥指数确定很大,意图也很明确,你们都要用公钥加密,因此你们时间很宝贵,须要快一点,您一我的私钥解密,时间长一点就多担待,少数服从多数的典型应用。加密

四、私钥指数如何肯定?

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

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

2、明文长度

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

因此,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。

3、密文长度

密文长度就是给定符合条件的明文加密出来的结果位长,这个能够肯定,加密后的密文位长跟密钥的位长度是相同的,由于加密公式:

C=(P^e)%n

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

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

相关文章

背景:计算机内部用补码表示二进制数。符号位1表示负数,0表...
大家好,我们现在来讲解关于加密方面的知识,说到加密我认为不...
相信大家在大学的《算法与数据结构》里面都学过快速排序(Qui...
加密在编程中的应用的是非常广泛的,尤其是在各种网络协议之...
前言我的目标是写一个非常详细的关于diff的干货,所以本文有...
对称加密算法 所有的对称加密都有一个共同的特点:加密和...