我正在尝试执行已知文本攻击以获得32字节的密钥。 BlockSize是16个字节。
关于此:https://crypto.stackexchange.com/a/12512
或者这个:https://security.stackexchange.com/a/102110
据我了解:
1)加密已知的15个字节的块
2)用不同的尾部字节加密已知的256个16字节块
3)比较块并获得一个字节的秘密
void test() {
unsigned char KnownText[15];
memset(KnownText, 'A', 15);
unsigned char EncryptedText[32];
int result_size = AES_ECB.EncryptBlock(EncryptedText, KnownText, 15);
unsigned char CKnownText[16];
for (int i = 0; i < 256; ++i) {
memset(CKnownText, 'A', 16);
CKnownText[15] = i;
unsigned char Encrypted[32];
int enc_result = AES_ECB.EncryptBlock(Encrypted, CKnownText, 16);
if(memcmp(EncryptedText, Encrypted, 16) == 0) {
//match found
}
}
}
当i = 0时,我只能得到一个匹配项(假设因为在前15个字节的块后附加了0),甚至连秘密字节都没有。
我可以加密任意长度的任何已知数据并获得加密结果。
如何通过这种攻击获得钥匙?
答案 0 :(得分:0)
EncryptBlock
可能做的是:加密一个块。 15个字节的第一条消息的想法是,然后您将其秘密密钥块连接。我不知道会在哪里发生(除非EncryptBlock
的名字很不正确)。
当前,通过EncryptBlock
函数可以简单地将加密的第16个字节设置为零(使用零填充)。您可能需要创建一个模仿服务器应该执行的功能的函数,包括将服务器的秘密添加到初始消息中,并可能处理多个块的加密(假设该函数尚未执行此操作)。
请注意,这不是关于从分组密码中检索密钥,而是从明文中检索密钥的不是。该机密可能是由于某些恶意尝试执行消息身份验证而添加的。