对于部分文件上传和加密,我想从大文件(例如: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
吗?
如何传输加密的部分文件块并将它们加入服务器以获得正确的加密文件?
谢谢!