对于部分文件上传和加密,我希望从一个大文件(例如: 100MB)中读取块(例如: 10MB),使用AES256对块进行加密,然后将块上传到服务器。在服务器上,这些块被连接到一个大文件中(然后该文件应该代表完整的加密文件)。
我希望避免对文件进行完全加密(例如: 100MB!)在取出块并将它们发送到服务器之前(CPU开销,因为我首先需要复制整个文件并对整个文件执行AES256 )。
我尝试了以下方法(以16MB文件为例=2块= 1*10MB + 1*6MB)
第1个区块为~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(),因为加密还没有完成(也许这就是问题所在?)。
第2个区块大约为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_EncryptUpdate传递整个文件时,EVP_EncryptFinal_ex的行为是否有所不同
如何传输加密的部分文件块,并在服务器上加入它们,以获得适当的加密文件?
谢谢!
发布于 2012-09-05 03:55:08
您对第二个块使用了错误的初始化向量。对于CBC,后续加密的iv应该是前一个密文的最后16个字节。这样,只需连接加密的部分,就可以得到整体的加密。
发布于 2012-09-05 05:24:44
通常情况下,您会使用计数器模式加密,但这似乎不适用于OpenSSL。使用OpenSSL块密码,您不能只在文件中间开始加密/解密。对于CBC,你需要知道之前的加密块,并将其作为IV插入。如果你在客户端连续加密它们,那么你就可以在服务器端相对容易地解密它们。
当然,您也可以单独加密每个块,然后将解密的块连接在一起。
https://stackoverflow.com/questions/12270141
复制相似问题