对于部分文件上传和加密,我想从一个大文件(例如: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
的行为是否不同?如何传输加密的部分文件块并将其加入服务器以获得正确的加密文件?
谢谢!
最佳答案
您对第二个块使用了错误的初始化向量。对于CBC,后续加密的iv
应该是前一密文的最后16个字节。这样,只要将加密的部分连接起来,就可以对整个部分进行加密。
关于c - openssl AES256文件部分的多重加密(稍后加入),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12270141/