章节大纲

  • 此任务主要使为了计算机专业或需要编程的相关领域学生设计的。学生应当和教师确认在他们的课程中是否要求完成此任务。
     
    在此任务中,我们提供给了一个明文和一个密文,你的任务是找出加密使用的密钥。你知道以下信息:
    • 加密使用了 aes-128-cbc 算法。
    • 加密此明文使用的密钥是一个少于 16 个字符的英语单词。这个单词可以从英语字典中找到。由于这个单词少于 16 个字符(即 128 bits,秘钥的长度),在单词的结尾附加了一些井号(#:十六进制值是 0x23)构成一个 128 bits 的密钥。
     
    你的目标是写一个程序找出加密密钥。你可以从网络上下载一个英语单词表。我们在 Labsetup.zip 文件中也附带了一个英语单词表。明文、密文和 IV 如下所示:
    Plaintext (total 21 characters): This is a top secret.
    Ciphertext (in hex format): 764aa26b55a4da654df6b19e4bce00f4
                                ed05e09346fb0e762583cb7da2ac93a2
    IV (in hex format):         aabbccddeeff00998877665544332211
     
    需要注意以下问题:
    • 如果你选择把明文存储在一个文件里,然后将文件输入到程序中,你需要检查文件的长度是否为 21 。如果你在文本编辑器中输入这条消息,有些编辑器会在文件的末尾添加一个特殊字符。存储消息最简单的方法是使用下面的命令(-n 标志使 echo 不在末尾添加换行符):
      $ echo -n "This is a top secret." > file
    • 在此任务中,你应当编写自己的程序来调用密码库。如果你只是简单地使用 openssl 命令完成此任务,将不会得分。可以在下面的链接中找到示例代码:
       https://www.openssl.org/docs/man1.1.1/man3/EVP_CipherInit.html
    • 当你使用 gcc 编译代码时,不要忘记加上 -lcrypto 选项。因为代码需要 crypto 库。参见下面的例子:
    • $ gcc -o myenc myenc.c -lcrypto