我正在尝试执行已知文本攻击以获得32个字节的密钥。
BlockSize是16个字节。

关于此:https://crypto.stackexchange.com/a/12512

或这个:https://security.stackexchange.com/a/102110

据我了解:

1)加密已知的15个字节的块

2)用不同的尾部字节加密已知的256个16字节块

3)比较块并获得一个字节的 secret

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时,我只有一个匹配项(假设因为0附加到了前15个字节的块中),它甚至都不是任何 secret 密钥字节。

我可以加密任意长度的任何已知数据并获得加密结果。

如何通过这种攻击获得 key ?

最佳答案

EncryptBlock可能做的是:加密一个块。 15字节的第一条消息的想法是,然后将 secret 密钥块连接到该消息。我看不到这种情况发生的地方(除非EncryptBlock的命名非常错误)。

当前,被加密的第16个字节很可能通过EncryptBlock函数简单地设置为零(使用零填充)。您可能需要创建一个模仿服务器应该执行的功能的函数,包括将服务器的 secret 添加到初始消息中,并可能处理多个块的加密(假定该函数尚未执行此操作)。

请注意,关于从分组密码中检索密钥,而是从明文中检索密钥,这不是,而是。此 secret 可能是由于某些恶意尝试执行消息身份验证而添加的。

关于c++ - AES ECB已知文本攻击,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51733627/

10-11 01:37