根据RSA的数学算法,1024位密钥支持128字节的数据加密,为何.NET最大只支持117字节,还有11字节是什么?求大神解答。
不止是.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字节了。
我查了资料,PKCS#1的填充是这样的,EB=0x00+BT+PS+0x00+(明文) = 117字节。BT在私钥加密时取0x01,公钥加密取0x02。PS在私钥加密时取0xFF,公钥加密时取随机值。这里填充之后还是只有117字节,是我理解错了吗?
因为.NET没有提供私钥加密公钥解密的类库,所以根据RSA算法写了一个,但是现在碰到问题是.NET加密的数据我能解开,但是我加密的出来的数据.NET解不开,尝试使用.NET解密就报“不正确的数据”。
@Jason Zhang: 具体问题具体分析吧。追加到这个层次,我就帮不上你了,自己再研究研究。
@Jason Zhang:EB=0x00+BT+PS+0x00+(明文) = 128字节
@Launcher: 谢谢!仔细看填充方面的资料,确实是这样的。117字节限制是因为PS至少要有八个字节长。问题已解决。