首页
社区
课程
招聘
[求助]AES-ECB算法填充明文后,解密疑惑。
发表于: 2019-1-25 20:54 11822

[求助]AES-ECB算法填充明文后,解密疑惑。

2019-1-25 20:54
11822
最近在做AES算法的研究, 遇到一个问题,百度、google后均无法解决,故请教下看雪大神。
问题:
AES-EBC模式,加密时,如果明文不足16的倍数, 会填充为16的倍数(这里假设填充0)。
此时分组加密后,得到的密文也是16的倍数。
解密时,同样的分组解密,也就是说,解密后的明文同样是16的倍数。
请问它是如何计算出正确的明文长度的?

举例:
明文:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]   15位字节
密文:[x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x]                  16位
按照分组解密后,应该是16字节, 他是如何将填充物去掉,得到真正明文15字节的? 求解惑。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-1-29 13:04 被人生边信道编辑 ,原因: 描述错误,明文示例多了一位
收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 228
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
一楼答谢。
感谢@ jackandkx 解答,完全解决我的疑惑。
最后于 2019-1-29 13:06 被人生边信道编辑 ,原因:
2019-1-25 21:03
0
雪    币: 3502
活跃值: (1493)
能力值: ( LV15,RANK:1045 )
在线值:
发帖
回帖
粉丝
3
首先 这是 ecb
其次 填充有 pad 和 unpad
2019-1-25 22:17
0
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

padding 有很多种, 你这种明文恰好 16 字节密文也是 16 字节的应当是 nopadding , nopadding 无法实现你说的不足 16 字节的情况下的 unpad.

 

还有比较常用的是 pkcs5padding, 不足 16 字节,例如缺 5 个字节,它会补上 5 个 0x5, 那如果恰好 16 个字节, 它会再添上 16 个 0x10.

2019-1-26 00:47
1
雪    币: 228
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
junkboy padding 有很多种, 你这种明文恰好 16 字节密文也是 16 字节的应当是 **nopadding** , **nopadding** 无法实现你说的不足 16 字节的情况下的 unpad. ...
谢谢。按您说的,例如缺5个字节,他会补5个字节,密文恰好是16个字节。 那么解密时,如何知道原始明文是5个字节呢。如何知道我填充了多少个0。
2019-1-26 08:51
0
雪    币: 228
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢答,例如缺5个字节,他会补5个字节,密文恰好是16个字节。 那么解密时,如何知道原始明文是5个字节呢。如何知道我填充了多少个0。
2019-1-26 08:52
0
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
人生边信道 谢谢。按您说的,例如缺5个字节,他会补5个字节,密文恰好是16个字节。 那么解密时,如何知道原始明文是5个字节呢。如何知道我填充了多少个0。
缺 5 个就填 5 个 5,缺 6 个就填 6 个 6
2019-1-26 09:00
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
8
楼上办法不错。
2019-1-26 12:00
0
雪    币: 291
活跃值: (181)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
9
关键在解密时如何知道原始明文是n个字节吧。
他只是给整成了16倍数做解密吧,解密接出来的结果是包含padding的,也就是包含你之前在明文中填充的字节的。
2019-1-28 11:21
0
雪    币: 204
活跃值: (911)
能力值: (RANK:1324 )
在线值:
发帖
回帖
粉丝
10
假如明文就是以5个\x05结尾的,如何判断出是否经过填充呢?
最后于 2019-1-28 12:00 被mratlatsn编辑 ,原因:
2019-1-28 11:59
0
雪    币: 204
活跃值: (911)
能力值: (RANK:1324 )
在线值:
发帖
回帖
粉丝
11
WIKIPEDIA上面解释的比较清楚:
If the original data is an integer multiple of N bytes, then an extra block of bytes with value N is added. This is necessary so the deciphering algorithm can determine with certainty whether the last byte of the last block is a pad byte indicating the number of padding bytes added or part of the plaintext message. Consider a plaintext message that is an integer multiple of N bytes with the last byte of plaintext being 01. With no additional information, the deciphering algorithm will not be able to determine whether the last byte is a plaintext byte or a pad byte. However, by adding N bytes each of value N after the 01 plaintext byte, the deciphering algorithm can always treat the last byte as a pad byte and strip the appropriate number of pad bytes off the end of the ciphertext; said number of bytes to be stripped based on the value of the last byte. 
最后于 2019-1-28 12:20 被mratlatsn编辑 ,原因:
2019-1-28 12:18
0
雪    币: 228
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
jackandkx WIKIPEDIA上面解释的比较清楚:If the original data is an  ...
谢答,完全解决我的问题。
例如{1,2,3,4,5,6,7,8,9},总共9个数值,取余16后是9,需要补充7个7,则最后数据变为{1,2,3,4,5,6,7,8,9,7,7,7,7,7,7,7}

需要特别注意一种情况:如果数据的个数刚好是16的倍数,那就要在补充16个字节(一定要)。例如{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},填充后的数据是{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16}

始终能通过最后一个字节判断出来 添加了几位填充物
2019-1-29 12:58
1
游客
登录 | 注册 方可回帖
返回
//