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

火山引擎 最新活动