AES加密密文精确长度计算及存储方法咨询
解决AES密文长度计算与文件存储问题
Hey there! Let's tackle your AES encryption issues step by step.
为什么strlen无法获取密文的精确长度?
AES加密后的输出是二进制数据,不是普通的字符串。二进制数据中很可能包含\0(空字符),而strlen()的工作逻辑是从起始地址开始计数,直到遇到第一个\0就停止——这就导致它完全无法正确计算密文的实际长度。
如何精确获取密文长度?
其实你的代码已经帮你处理好了!看一下aes_encrypt函数的最后一行:
*len = c_len + f_len;
这个len是你传入的指针,函数执行后,它指向的变量会被更新为密文的精确总长度。
举个调用示例,你只需要在调用时保存这个更新后的值:
// 假设你有明文和初始化好的EVP_CIPHER_CTX unsigned char *plaintext = (unsigned char*)"Hello World!"; int data_len = strlen((char*)plaintext); // 调用加密函数,data_len会被更新为密文长度 unsigned char *ciphertext = aes_encrypt(your_ctx, plaintext, &data_len); // 现在data_len就是密文的精确长度啦!
如何将密文精确存储到文件?
因为密文是二进制数据,你需要用二进制文件操作,不能用处理字符串的函数(比如fputs)。推荐使用fwrite来写入:
基础存储方式(直接写密文)
FILE *file_ptr = fopen("encrypted_data.bin", "wb"); if (file_ptr != NULL) { // 参数说明:要写入的数据、每个元素的字节数、元素总数、文件指针 fwrite(ciphertext, 1, data_len, file_ptr); fclose(file_ptr); }
注意打开文件时要用"wb"模式,表示二进制写入。
更健壮的存储方式(先写长度再写密文)
如果之后需要读取密文解密,建议先把密文长度写入文件开头,这样读取时能准确知道要读多少字节:
FILE *file_ptr = fopen("encrypted_data.bin", "wb"); if (file_ptr != NULL) { // 先写入密文长度(用int类型存储,占4字节) fwrite(&data_len, sizeof(int), 1, file_ptr); // 再写入密文数据 fwrite(ciphertext, 1, data_len, file_ptr); fclose(file_ptr); }
对应的读取方式:
FILE *file_ptr = fopen("encrypted_data.bin", "rb"); if (file_ptr != NULL) { int cipher_len; // 先读取长度 fread(&cipher_len, sizeof(int), 1, file_ptr); // 分配内存存储密文 unsigned char *ciphertext = palloc(cipher_len); // 读取密文数据 fread(ciphertext, 1, cipher_len, file_ptr); fclose(file_ptr); // 接下来就可以用ciphertext和cipher_len进行解密操作了 }
小提醒
密文是二进制数据,用普通文本编辑器打开会显示乱码,这是正常现象,不要误以为是加密出错啦!
内容的提问来源于stack exchange,提问作者Gaurav




