C++ 已知文本攻击

C++ 已知文本攻击,c++,algorithm,encryption,aes,C++,Algorithm,Encryption,Aes,我正在尝试执行已知文本攻击以获取32字节的密钥。 块大小为16字节 关于这一点: 或者这个: 据我所知: 1) 加密已知的15字节块 2) 使用不同的尾随字节加密已知的256个16字节块 3) 比较块并获得一个字节的秘密 void test() { unsigned char KnownText[15]; memset(KnownText, 'A', 15); unsigned char EncryptedText[32]; int result_size =

我正在尝试执行已知文本攻击以获取32字节的密钥。 块大小为16字节

关于这一点:

或者这个:

据我所知:

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
        }
    }
}
void测试(){
无符号字符KnownText[15];
memset(KnownText'A',15);
未签名字符加密文本[32];
int result_size=AES_ECB.EncryptBlock(EncryptedText,KnownText,15);
无符号字符CKnownText[16];
对于(int i=0;i<256;++i){
memset(CKnownText'A',16);
CKnownText[15]=i;
未签名字符加密[32];
int enc_result=AES_ECB.EncryptBlock(加密,CKnownText,16);
if(memcmp(EncryptedText,Encrypted,16)=0){
//找到匹配项
}
}
}
当I=0时,我只得到一个匹配(假设因为0被附加到前15个字节的块中),它甚至不是任何密钥字节

我可以加密任何长度的任何已知数据,并得到加密结果


如何使用此攻击获取密钥?

EncryptBlock可能会执行它所说的操作:加密一个块。15字节的第一条消息的思想是将密钥块连接到它。我不知道这种情况会发生在哪里(除非
EncryptBlock
的名称非常糟糕)

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


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

如果这是C,那么什么是
字节
?更传统的表示法是
无符号字符
uint8\u t
。这是AES库强加的类型吗?这是C++代码吗?<代码>字节<代码>是代码>无符号char < /代码>。我已经删除了C++标签,因为有人评论它更像C代码。在这种情况下,C++或C并不重要。无论如何,我对代码进行了编辑,以使其更清晰。如果您正在执行类似于
AES\u ECB.EncryptBlock(…)
的操作,这确实很重要,因为这实际上不是C语言。当使用C++时,你可以使用诸如<代码> STD::String 和 >而不是C样式的字节数组(如果这是相关的)。如果我正在做SMTH,比如“代码> AESYECB加密块(…)< /代码>,它毕竟是一个只处理块的函数。”………………我怎么才能用这个攻击得到密钥呢?”:该链接是关于查找预先附加的机密(salt),而不是加密密钥。Quote:“如果服务器将我控制的数据附加上一个秘密…我有可能知道这个秘密是什么…”似乎
EncryptBlock
的名称不正确,它会对大小为的字节数组进行块加密。因此,如果我传递大小32或48,它将相应地生成
size+(BlockSize size%BlockSize)+1的加密字节数组。这不是某种服务器-客户端加密。普通C++项目。我确信我需要2到3个已知的文本块来获取每个ECB攻击文件中所写的密钥。但我一直在努力完成第一步——按照这些指南的说明获取密钥的第一个字节。顺便说一句,我已经尝试加密3块数组。它产生的结果和预期的3个相同的块一样。抱歉,但在这种情况下,它只执行ECB模式加密和零填充。因此,它将能够处理多个块,这不是您期望从函数名中得到的。但是仍然没有添加两个保存秘密的块的部分,并且该方法显然也没有添加两个块。那么,在密文中添加要查找的秘密在哪里呢?目前你只是在寻找零填充,而不是秘密。很明显,我误解了攻击的概念,它不提供密钥恢复,只是通过移动已知的加密块来泄露未知的加密字节。是吗?如果您认为可以通过与ECB相关的攻击检索分组密码的密钥,那么您的想法确实是错误的。密钥受分组密码保护,因此无论操作模式如何(ECB、CBC等),都无法检索密钥。您的代码也不会尝试恢复机密,因为它从不将机密放入明文消息中。提示:当试图模拟两方时,请编程两方。