1

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

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

我尝试了以下(16MB 文件的示例 = 2 个块 = 1*10MB + 1*6MB)

第一个块约为 10MB,确保块大小是 16 的倍数(AES_BLOCK_SIZE)

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() 因为加密尚未完成(也许这是问题?)。

第二个块是~6MB,我从&outlen上面加密了其余的数据偏移量

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_EncryptFinal_ex通过整个文件时的行为会有所不同EVP_EncryptUpdate吗?

如何传输加密的部分文件块并将它们加入服务器以获得正确的加密文件?

谢谢!

4

2 回答 2

1

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

于 2012-09-04T19:55:08.003 回答
0

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

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

于 2012-09-04T21:24:43.613 回答