You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:56:20