【发布时间】:2018-08-08 08:45:25
【问题描述】:
我正在尝试执行已知文本攻击以获取 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 时,我只得到一个匹配项(假设因为 0 被附加到第一个 15 字节块),它甚至不是任何密钥字节。
我可以加密任何长度的任何已知数据并获得加密结果。
我怎样才能通过这种攻击获得密钥?
【问题讨论】:
-
如果这是 C,
BYTE是什么?更传统的表示法是unsigned char或uint8_t。这是 AES 库强加的类型吗?这是 C++ 代码吗? -
BYTE是unsigned char。我已经删除了 c++ 标签,因为有人评论说它更像是 c 代码。在这种情况下,c++ 或 c 并不重要。无论如何,我已经将代码编辑得更清楚了。 -
如果你正在做类似
AES_ECB.EncryptBlock(...)的事情,这真的不是C 的事情。此外,在使用 C++ 时,您可以使用std::string和std::vector等工具,而不是 C 样式的字节数组(如果相关)。 -
如果我像
AES_ECB_EncryptBlock(...)那样做某事,它可能是 C,毕竟它只是一个处理块的函数。 -
"...如何使用此攻击获取密钥?":该链接是关于查找预先附加的密钥 (salt) 而不是加密密钥。引用:“如果服务器将我控制的数据附加到一个秘密......我有可能弄清楚秘密是什么......”
标签: c++ algorithm encryption aes