OpenSSL EVP API下AES_128_CBC生成密文与已知密文比对问题咨询
AES_128_CBC生成密文与已知密文比对问题(SEED实验相关)
免责声明:我正在完成SEED实验的作业,不需要实现层面的帮助,希望得到AES_128_CBC生成密文与已有已知密文比对方法的相关协助。
问题背景
- 已知AES密钥通过
srand()生成,且掌握文件生成的时间窗口,已经计算出起始种子,可生成起始种子到时间窗口结束范围内的所有密钥 - 计划使用OpenSSL API,结合生成的密钥和给定的IV,对明文执行aes_128_cbc加密,再和已知密文比对
- 参考OpenSSL官方对称加密示例实现算法,将已知明文、密文、IV都初始化为unsigned char数组,但生成的密文始终无法和已知密文匹配,怀疑是输入格式存在问题
相关代码
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"); } } }
疑问
我是否需要将每个cipher[i]转换为十六进制字符串后再进行比对?
后续编辑
编辑1
我写了一个bash脚本尝试实现相同逻辑,尝试比对密文的base64编码,但也没有成功。我对bash脚本编写经验不足,同时也没有完全掌握加密需要传入的数据类型要求:
编辑2
以下是我生成起始种子的流程:实验手册说明Alice在“2018-04-17 23:08:49”创建了一个pdf文件,我使用date命令date -d "2018-04-17 23:08:49" +%s得到了该时间点距离epoch的秒数,将其作为起始种子。实验同时说明Alice生成密钥的时间在该起始时间到之后2小时的范围内,因此我将种子范围的终点设为startSeed + 7200。
最终解决方案
经过修改我最终成功解决了问题:
- 调整为在正确的时间窗口内生成种子
- 设置AES算法不添加padding
- 将密文数组的分配空间改为仅16字节,修改
memcmp仅比对16字节
完成这些修改后成功复现了已知密文。
内容的提问来源于stack exchange,提问作者omri
相关产品推荐
相关产品推荐

