免责声明:我正在一个种子实验室工作,做家庭作业;我不需要帮助来实现,但我希望获得一些关于如何将从AES_128_CBC生成的密文与我所拥有的给定密文进行比较的帮助。
在本任务中,我们知道使用srand()生成了AES的密钥,并且知道创建文件的时间窗口。我计算了起始种子,因此我可以从起始种子生成所有密钥,直到时间窗口结束。
接下来,需要做的就是使用openSSL API使用计算出的密钥和给定的初始化向量对明文执行aes_128_cbc。
我在这里使用了来自openSSL的示例代码:Symmetric enrycption and decription来执行aes-128-cbc算法。在我的代码中,我已经将已知的明文和密文以及IV初始化为无符号字符数组。问题是,当我生成一个密文与我已知的密文进行比较时,我永远无法得到匹配,我有一种感觉,这是因为我格式化输入的方式。
下面是我用来初始化明文,密文,IV,生成密钥和密文的代码:
void main(){
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
unsigned int i;
unsigned char key[7201][KEYSIZE];
unsigned char iv[] = "09080706050403020100A2B2C2D2E2F2";
unsigned char plaintext[] = "255044462D312E350A25D0D4C5D80A34";
unsigned char ciphertext[] = "D06BF9D0DAB8E8EF880660D2AF65AA82";
unsigned int startSeed = 1524020929;
unsigned char cipher[7201][128];
int cipher_len;
// 2 hours is 7200 seconds
//printf("Beginning keygen\n");
for(i = 0; i <= (7200); i++){
srand(i + startSeed);
//printf("Here\n");
for(int j = 0; j < KEYSIZE; j++){
//printf("Assigning key value\n");
key[i][j] = rand() % 256;
//printf("%.2x", (unsigned char)key[j]);
}
//printf("\n");
cipher_len = encrypt(plaintext, strlen((char *)plaintext), key[i], iv, cipher[i]);
//printf("%d\n", sizeof(cipher));
//BIO_dump_fp(stdout, (const char *)cipher, cipher_len);
if(memcmp(cipher[i], ciphertext, 128) == 0){
printf("found matching ciphertext");
}
}
}是否需要在比较之前将每个密码转换为十六进制字符串?
编辑:我写了一个bash脚本来尝试做同样的事情,看看我是否可以比较密文的base64编码,但没有运气。我对bash脚本非常缺乏经验,我仍然不能很好地掌握我应该传递到加密中的数据类型:

编辑2:下面是我用来生成起始种子的过程。实验手册上说Alice在"2018-04-17 23:08:49“创建了一个pdf文件。我使用了一个日期命令date -d "2018-04-17 23:08:49" +%s来获取自开始时期以来的秒数。这就是我用作起始种子的内容。实验室还指出,已知Alice在此开始时间和2小时后生成了密钥,这就是我将种子范围的结束设置为startSeed + 7200的原因。
最后一次编辑:经过修改后,我终于让它工作了。我这样做是为了在适当的时间窗口中生成种子,并且我这样做是为了使AES算法不会添加填充。
此外,我只为密文数组分配了16个字节,并将memcmp更改为只查看16个字节。在这些更改之后,我能够重现已知的密文。
发布于 2021-10-10 00:36:16
除了我为使用适当的种子范围和静态解码十六进制输入字符串所做的修复之外,在我的实现中最糟糕的是比较一个16字节长的char数组和一个128字节长的char数组。我将生成的密文字符数组改为只有16个字节,并且在memcmp()中一次只比较16个字节。
https://stackoverflow.com/questions/69487783
复制相似问题