记录一下现代密码学课程第二次实验的题解,(主要还是反转课堂演示用
# Part 1
# Part 2
## Implement PKCS#7 padding
原题链接
根据 PKCS#7 标准,直接写
## Implement CBC mode
原题链接
这里要先实现一个 AES ECB 算法
根据 CBC Mode 的定义,令 AES ECB 加密一个 block 的算法为 transform
,可以得到 CBC Mode 的实现如下
我们还需要把密文分块
已知 iv 为 b"\x00"*16
,key 为 b"YELLOW SUBMARINE"
,可进行解密:
## An ECB/CBC detection oracle
原题链接
先生成随机的 key 和 padding,可以直接用urandom
编写一个函数,根据给定的 key 和 msg,在进行随机 padding 之后,随机采用 ECB 或者 CBC 加密
随机选择一个密钥,再选择一个连续三个块内容一致的明文,用上面的函数加密
因为选择的明文块有相同的内容,如果使用 ECB 模式得到的密文也是相同的,而 CBC 模式不会出现该问题,因此可以考虑统计有几个不同的密文块,如果存在相同密文块,则可以断定为 ECB 模式
## Byte-at-a-time ECB decryption (Simple)
原题链接
因为能在未知的明文前面进行填充,那就想办法将第一个未知的字符放在每个块的最后,这样我们就可以构造一个块进行碰撞(由15个已知的字符,和一个位置的字符)
先导入函数,并构造encryption_oracle
因为我们不知道未知明文的长度,因此需要爆破明文长度
构造明文空间,构造dfs进行搜索,这里不能全部递归,可能会爆栈
## ECB cut-and-paste
原题链接
先随便模拟一下题目的环境
因为是 ECB 模式,所以只要复制整个块过去就行,但是要注意 padding
## Byte-at-a-time ECB decryption (Harder)
原题链接
我们暂时假定这题的意思是,每次实验的prefix_len
随机但固定(不然真没法做了),所以直接求出prefix_len
,然后把prefix
补齐到整块,整个丢掉就好
修改 12 题代码
求未知部分长度,以及前缀导致的偏移量和需要的补齐长度
最后把补齐和移除前缀的操作加到search
里面,直接搜就好
## PKCS#7 padding validation
原题链接
根据标准实现 PKCS#7 padding
随便写一个测试
## CBC bitflipping attacks
原题链接
经典的比特反转攻击,这里的 key 是写死的,不然没法进行解密
由于已知加密后的结构,所以直接对 userdata 进行 padding,然后对 :
(0b111010
) 和 <
(0b111100
) 的最低位进行反转即可