首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >openssl AES256文件部分的多重加密(稍后加入)

openssl AES256文件部分的多重加密(稍后加入)
EN

Stack Overflow用户
提问于 2012-09-05 03:31:59
回答 2查看 996关注 0票数 1

对于部分文件上传和加密,我希望从一个大文件(例如: 100MB)中读取块(例如: 10MB),使用AES256对块进行加密,然后将块上传到服务器。在服务器上,这些块被连接到一个大文件中(然后该文件应该代表完整的加密文件)。

我希望避免对文件进行完全加密(例如: 100MB!)在取出块并将它们发送到服务器之前(CPU开销,因为我首先需要复制整个文件并对整个文件执行AES256 )。

我尝试了以下方法(以16MB文件为例=2块= 1*10MB + 1*6MB)

第1个区块为~10MB,确保区块大小为16的倍数(AES_BLOCK_SIZE)

代码语言:javascript
运行
复制
EVP_CIPHER_CTX e_ctx;
EVP_CIPHER_CTX_init(&e_ctx);
EVP_EncryptInit_ex(&e_ctx, EVP_aes_256_cbc(), NULL, key, iv);
EVP_EncryptUpdate(&e_ctx, enc_data, &outlen, unenc_data, chunksize_to_load_from_file_unencrypted);

在第一个块中,我没有调用EVP_EncryptFinal_ex(),因为加密还没有完成(也许这就是问题所在?)。

第2个区块大约为6MB,在那里我加密了上面&outlen的其余数据偏移量

代码语言:javascript
运行
复制
EVP_CIPHER_CTX e_ctx;
EVP_CIPHER_CTX_init(&e_ctx);
EVP_EncryptInit_ex(&e_ctx, EVP_aes_256_cbc(), NULL, key, iv);
EVP_EncryptUpdate(&e_ctx, enc_data, &outlen, unenc_data, chunksize_to_load_from_file_unencrypted);
EVP_EncryptFinal_ex(&e_ctx, enc_data+outlen, &final_length);

在服务器上,两个文件部分连接在一起。然后我可以“成功”解密该文件,与未加密的文件大小相同。但在偏移量~10MB处,某些字节不同(16字节!= AES_BLOCK_SIZE)

有什么想法吗?会不会是填充物的问题?这不只是结尾吗?当不通过EVP_EncryptUpdate传递整个文件时,EVP_EncryptFinal_ex的行为是否有所不同

如何传输加密的部分文件块,并在服务器上加入它们,以获得适当的加密文件?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-05 03:55:08

您对第二个块使用了错误的初始化向量。对于CBC,后续加密的iv应该是前一个密文的最后16个字节。这样,只需连接加密的部分,就可以得到整体的加密。

票数 1
EN

Stack Overflow用户

发布于 2012-09-05 05:24:44

通常情况下,您会使用计数器模式加密,但这似乎不适用于OpenSSL。使用OpenSSL块密码,您不能只在文件中间开始加密/解密。对于CBC,你需要知道之前的加密块,并将其作为IV插入。如果你在客户端连续加密它们,那么你就可以在服务器端相对容易地解密它们。

当然,您也可以单独加密每个块,然后将解密的块连接在一起。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12270141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档