在本实验中,我们添加一个额外的消息 N = "Extra message" 到填充后的原始消息上: M = "This is a test message",并计算它的哈希值。该程序如下所示。
/* calculate_mac.c */
#include <stdio.h>
#include <openssl/sha.h>
int main(int argc, const char *argv[])
{
SHA256_CTX c;
unsigned char buffer[SHA256_DIGEST_LENGTH];
int i;
SHA256_Init(&c);
SHA256_Update(&c,
"This is a test message"
"\x80"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\xB0"
"Extra message",
64+13);
SHA256_Final(buffer, &c);
for(i = 0; i < 32; i++) {
printf("%02x", buffer[i]);
}
printf("\n");
return 0;
}
学生可以编译运行上面的程序:
$ gcc calculate_mac.c -o calculate_mac -lcrypto
$ ./calculate_mac
任务。学生应该更改上面清单中的代码,为以下请求计算MAC(假设我们知道MAC密钥):
http://www.seedlab-hashlen.com/?myname=<name>&uid=<uid>
&lstcmd=1<padding>&download=secret.txt
&mac=<hash-value>
就像上一个任务一样, <name> 的值应该是你的真实姓名。 <uid> 和 MAC 密钥的值应从 LabHome/key.txt 文件中获取。把请求发送到服务器,查看能否成功下载 secret.txt 文件。
应该注意的是,在 URL 中,需要通过将 \x 更改为 % 来对填充中的所有十六进制数字进行编码。例如,在上面的 URL 中,填充中的 \x80 应该替换为 %80。在服务器端,URL 中的编码数据将被改回十六进制数。