首页
社区
课程
招聘
RSA加密密文的长度不是固定的吗?
2016-10-25 22:01 19090

RSA加密密文的长度不是固定的吗?

2016-10-25 22:01
19090
记得RSA加密的密文应该是跟私钥一样的固定长度,为什么1024位的RSA生成256位私钥,加密出来的密文有的是256位,有的是255位?
如何生成固定长度256位的?

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞0
打赏
分享
最新回复 (7)
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
草莓bl 2016-10-25 22:50
2
0
这个好像是有固定的位数的吧?
雪    币: 59
活跃值: (2266)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NutCracker 2016-10-25 22:58
3
0
RSA的明文长度及密文长度应该等同于N的位数,与公钥或私钥的长度没啥关系的。
如果求出来的结果小于N的位数,通常是要在前面补0的。
所以你说的有时候位数多,有时候位数少,肯定是不正常的。
不过有一种特殊情况,就是RSA算法在加密时为了防止相同明文块对应固定的密文块,
会引入一种随机填充机制,如RSA_PKCS1_PADDING会至少保留11个字节用作
填充,从而造成明文及密文长度小于N的长度,但是不管是明文还是密文它们的
长度仍旧是固定的,不会乱变。
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
草莓bl 2016-10-26 11:24
4
0
感觉看完脑细胞不够用
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
草莓bl 2016-10-26 11:25
5
0
还得这么麻烦吗
雪    币: 624
活跃值: (668)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
MistHill 6 2016-10-26 19:00
6
0
RSA的计算公式: C = (M^E) MOD N
无论是加密或解密,运算的最后一步都是对N取模,所以结果的位数一定小于、等于N的位数。

一个256位的N,结果为255位或256位都很正常。计算出来的,没法固定为256位!

这个与PADDING完全不相干。

为什么需要PADDING?
因为明文信息的长度有可能与“模”不同:如果明文位数小于“模”的长度,那么解密出来后怎么还原出原来的明文长度、有用的信息?需要某种规则来定义,这就是PADDING。
如果明文长度大于N,则需要按“模”的长度“分组”,最后一组可能同样需要PADDING。
“补足”可以自己定义,但加密和解密必须遵守相同的PADDING“协议”,否则就会解密不出原文。已经有好几种符合工业标准的PADDING规范,比如PKCS1.5:
[FONT="Courier"]/*
   RFC 2313 - PKCS #1: RSA Encryption Version 1.5
   https://tools.ietf.org/html/rfc2313
   EB = 00 || BT || PS || 00 || D
        EB - Encryption Block
        BT - Block Type                 :: 00 or 01 for private-key operation; 02 for public-key operation
        PS - Padding String             :: length = k-3-||D||
                                           BT 00: all 00
                                           BT 01: all FF
                                           BT 02: pseudorandomly generated and nonzero
         D - Data
         k - length of modulus in octets
*/[/FONT]


请注意填充块类型(Block Type)为02时,使用了伪随机数进行填充,所以相同的输入,每次加密结果都会不一样。
在私钥的情况下,通常用于服务端,出于性能考虑,用固定字节填充BT 00/01。
在公钥时,用于客户端,用伪随机数填充BT 02。
雪    币: 281
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
benzcomp 2016-10-26 20:06
7
0
确实如此,但是在搞的一个软件是这样做的:明文分段加密,解密时,先验证每一段密文的字符数,奇数位就跳出。
跟算法发现,他是在加密前,先在明文前随机加入两个字符,然后加密,保证得到256字符的密文,解密后,再把每一段解密后明文的前两个字符删除,最后合并成完整的明文。
雪    币: 59
活跃值: (2266)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NutCracker 2016-10-28 22:46
8
0
你这是对一个数进行加密的情况,当N为256位的时候,结果当然可以少于256位。
但是RSA在许多时候是对块加密的,例如以0x20字节为一组(可以看作是big-endian的256位数)
进行加密,那么加密结果也必须是0x20字节即256位,不足256位时高位补0,否则以后没法还原。

Padding时明文及密文也是固定长度的,假定原先明文为0x20字节,padding为11字节,则现在的明文及密文就只能是0x20-11字节。
游客
登录 | 注册 方可回帖
返回