在上一个任务中,我们展示了合法用户如何计算 MAC (了解 MAC 密钥)。在此任务中,我们将以攻击者的身份进行,即我们在不知道 MAC 密钥的情况下计算 MAC。假设我们知道了一个有效的请求 R},我们也知道 MAC 秘钥的长度,我们的工作是基于 R} 生成新的请求,同时仍然能够计算有效的 MAC 。
给定原始消息 M = "This is a test message" 及其 MAC 值,我们将说明如何在填充的 M 的末尾添加消息 "Extra message",然后在不知道秘密 MAC 密钥的情况下计算其 MAC 。
$ echo -n "This is a test message" | sha256sum
6f3438001129a90c5b1637928bf38bf26e39e57c6e9511005682048bedbef906
以下程序可用于计算新消息的 MAC :
/* length_ext.c */
#include <stdio.h>
#include <arpa/inet.h>
#include <openssl/sha.h>
int main(int argc, const char *argv[])
{
int i;
unsigned char buffer[SHA256_DIGEST_LENGTH];
SHA256_CTX c;
SHA256_Init(&c);
for(i=0; i<64; i++)
SHA256_Update(&c, "*", 1);
// MAC of the original message M (padded)
c.h[0] = htole32(0x6f343800);
c.h[1] = htole32(0x1129a90c);
c.h[2] = htole32(0x5b163792);
c.h[3] = htole32(0x8bf38bf2);
c.h[4] = htole32(0x6e39e57c);
c.h[5] = htole32(0x6e951100);
c.h[6] = htole32(0x5682048b);
c.h[7] = htole32(0xedbef906);
// 添加额外信息
SHA256_Update(&c, "Extra message", 13);
SHA256_Final(buffer, &c);
for(i = 0; i < 32; i++) {
printf("%02x", buffer[i]);
}
printf("\n");
return 0;
}
如下编译上面的程序:
$ gcc length_ext.c -o length_ext -lcrypto
任务。学生应首先为以下请求生成有效的 MAC(其中 <uid> 和 MAC 密钥应从 LabHome/key.txt 文件获得):
http://www.seedlab-hashlen.com/?myname=<name>&uid=<uid>
&lstcmd=1&mac=<mac>
请基于上面计算出的 <mac> 构造一个新的、包含 download 命令的请求。这一次,你不允许使用密钥。URL 形如:
http://www.seedlab-hashlen.com/?myname=<name>&uid=<uid>
&lstcmd=1<padding>&download=secret.txt&mac=<new-mac>
把构造出的请求发送给服务器,展示你能成功获得 secret.txt 文件的内容。