文章

Cryptopals Challenge 9

题目

Challenge 9 Set 2 - The Cryptopals Crypto Challenges image.png

解析

知识点

  • PKCS #7 是一种密码学标准,定义了用于加密消息的格式和语法。它通常用于数字签名和加密操作,以确保数据的机密性和完整性。
    • 其填充快是在尾部填充 k - (l mod k) 个八进制数,,所有这些八进制数的值都是 k - (l mod k),其中 l 是输入的长度。
    • 因此,如果报文长度比数据块少 x 个字节,那么就需要填充 x 个字节。 image.png

分析

给出的明文比块大小少 4 个字节,因此填充 4 个 \04 字节即可。

解决方案

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def PKCS7_pad(plaintext: bytes, block_size: int) -> bytes:  
    # 计算需要填充的字节  
    padding_byte = block_size - len(plaintext) % block_size  
    # 进行填充  
    plaintext += padding_byte.to_bytes(1, "big") * padding_byte  
    """  
    to_bytes(x, "big") 是整数对象的一个方法,用于将整数表示为指定字节顺序的字节数组。  
    参数解释:    第一个参数 x 表示希望将整数转换为多少字节的字节数组。  
    第二个参数 "big" 表示字节的顺序,这里是大端字节顺序(从高位到低位的顺序)。  
    """    return plaintext  
  
  
def main():  
    plaintext = "YELLOW SUBMARINE"  
    block_size = 20  
    plaintext_bytes = plaintext.encode()  
    print(PKCS7_pad(plaintext_bytes, block_size))  
  
  
if __name__ == "__main__":  
    main()

运行结果

1
b'YELLOW SUBMARINE\x04\x04\x04\x04'

参考

Set 2: Pwn the world. — A noob’s attempt at blogging.

本文由作者按照 CC BY 4.0 进行授权