我正在解决这个 ctf,您必须使用 PyCryptodome 模块通过 DES 加密消息。消息是“Launghezza di questa frase non è divisibile per 8”(意大利语)。我无法将此消息转换为字节,因为重音字符不包含在 utf-8 中(我认为这就是解释)。有人可以帮我加密消息吗?
from Crypto.Util.Padding import pad
from Crypto.Cipher import DES
Cipher = 'DES'
Mode_of_operation = 'CBC'
plaintext = b'La lunghezza di questa frase non è divisibile per 8'
padding_scheme = 'x923'
print(plaintext)
key = bytes.fromhex('fc479b5296ec6938')
cipher = DES.new(key, DES.MODE_CBC)
enc_message = cipher.encrypt(pad(plaintext, 8,padding_scheme))
print(cipher.iv.hex())
print(enc_message.hex())
我尝试将重音字符转换为“\xe8”,但 ctf 平台声明它不正确。
问题不在于 UTF-8 不支持重音字符(它支持),而在于你没有将字符串编码为 UTF-8 字节。
修改你的代码如下:
from Crypto.Util.Padding import pad
from Crypto.Cipher import DES
Cipher = 'DES'
Mode_of_operation = 'CBC'
plaintext = 'La lunghezza di questa frase non è divisibile per 8'
# 将字符串编码为 UTF-8 字节
plaintext = plaintext.encode('utf-8')
padding_scheme = 'x923'
print(plaintext)
key = bytes.fromhex('fc479b5296ec6938')
cipher = DES.new(key, DES.MODE_CBC)
enc_message = cipher.encrypt(pad(plaintext, 8,padding_scheme))
print(cipher.iv.hex())
print(enc_message.hex())
通过调用
plaintext.encode('utf-8')
,你将字符串转换为正确的字节表示,使加密正常工作。