首页 新闻 搜索 专区 学院

RSA加密问题

0
悬赏园豆:40 [已解决问题] 解决于 2016-03-15 13:40

根据RSA的数学算法,1024位密钥支持128字节的数据加密,为何.NET最大只支持117字节,还有11字节是什么?求大神解答。

RSA
Jason  Zhang的主页 Jason Zhang | 初学一级 | 园豆:168
提问于:2016-03-14 18:52
< >
分享
最佳答案
0

 

不止是.NET,RSA算法就要求加密的明文长度不能超过RSA密钥的长度减去11byte。是自身算法的原因限制的。

说具体点呢,是因为要填充(padding)。RSA实际可加密的明文长度最大其实是1024bits,因为RSA首先就限制了0<明文长度<密钥长度,但问题就来了:

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

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

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

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

 

收获园豆:40
我还是太年轻 | 小虾三级 |园豆:692 | 2016-03-14 19:21

我查了资料,PKCS#1的填充是这样的,EB=0x00+BT+PS+0x00+(明文) = 117字节。BT在私钥加密时取0x01,公钥加密取0x02。PS在私钥加密时取0xFF,公钥加密时取随机值。这里填充之后还是只有117字节,是我理解错了吗?

因为.NET没有提供私钥加密公钥解密的类库,所以根据RSA算法写了一个,但是现在碰到问题是.NET加密的数据我能解开,但是我加密的出来的数据.NET解不开,尝试使用.NET解密就报“不正确的数据”。

Jason Zhang | 园豆:168 (初学一级) | 2016-03-15 09:59

@Jason Zhang: 具体问题具体分析吧。追加到这个层次,我就帮不上你了,自己再研究研究。

我还是太年轻 | 园豆:692 (小虾三级) | 2016-03-15 11:09

@Jason Zhang:EB=0x00+BT+PS+0x00+(明文) = 128字节

Launcher | 园豆:45045 (高人七级) | 2016-03-15 11:39

@Launcher: 谢谢!仔细看填充方面的资料,确实是这样的。117字节限制是因为PS至少要有八个字节长。问题已解决。

Jason Zhang | 园豆:168 (初学一级) | 2016-03-15 13:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册