章节大纲

  • 在上一个任务中,我们展示了合法用户如何计算 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 文件的内容。