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

时间:2012-09-04 19:31:59

标签: c encryption openssl encryption-symmetric

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

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

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

第一个块大约是10MB,确保chunksize是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是否会有所不同?

如何传输加密的部分文件块并将它们连接到服务器上以获取正确的加密文件?

谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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