SA密钥长度、明⽂长度和密⽂长度
本⽂介绍RSA加解密中必须考虑到的密钥长度、明⽂长度和密⽂长度问题,对第⼀次接触RSA的开发⼈员来说,RSA算是⽐较复杂的算法,RSA的复杂度是因为数学家把效率和安全也考虑进去的缘故。
本⽂先只谈密钥长度、明⽂长度和密⽂长度的概念知识,RSA的理论及⽰例等以后再谈。提到密钥,我们不得不提到RSA的三个重要⼤数:公钥指数e、私钥指数d和模值n。这三个⼤数是我们使⽤RSA时需要直接接触的,理解了本⽂的基础概念,即使未接触过RSA的开发⼈员也能应对⾃如的使⽤RSA相关函数库,⽆需深⼊了解e、d、n是如何⽣成的,只需要知道我该如何⽤、要注意什么。
⼀、密钥长度
1、密钥是指谁?
⾸先我们说的“密钥”是指谁?由于RSA密钥是(公钥+模值)、(私钥+模值)分组分发的,单独给对⽅⼀个公钥或私钥是没有任何⽤处,所以我们说的“密钥”其实是它们两者中的其中⼀组。但我们说的“密钥长度”⼀般只是指模值的位长度。⽬前主流可选值:1024、2048、3072、
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的位数,但从传输和存储⾓度,仍然是按照标准位长来进⾏的,所以,即使我们加密⼀字节的明⽂,运算出来的结果也要按照标准位长来使⽤(当然了,除⾮我们能再采取措施区分真实的位长,⼀般不在考虑)。字符串长度最大是多少
⾄于明⽂分⽚多次加密,⾃然密⽂长度成倍增长,但已不属于⼀次加密的问题,不能放到⼀起考虑。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。