我刚刚编写了两个C应用程序,一个用于加密,另一个用于解密文件。
加密+解密期间的文件操作代码已从OpenSSL site复制/粘贴并更改为使用AES-GCM
它就像一个魅力!事情是
我应该几乎不变。如果500MB文件的速率大约为80MB / s,那就是我应该为10GB文件获得的速率(可能会少一点,但不是那么多!)。
随着文件大小的增加,密码率不断下降。
这可能是文件操作的问题吗?也许与内存使用有关的东西?我做错了吗?
以下是我实际使用的代码:
const EVP_CIPHER *cipher;
unsigned char inbuf[1024], outbuf[1024 + EVP_MAX_BLOCK_LENGTH];
int inlen, outlen;
/* Initialize cipher*/
cipher = EVP_aes_256_gcm (); // AES in Galois Counter Mode
EVP_CIPHER_CTX *encCTX = EVP_CIPHER_CTX_new();
EVP_CipherInit_ex(encCTX, cipher, NULL, key, iv, 1); // 1 for encrypt, 0 for decrypt
/* Loop loading file chunks and cipher it*/
for(;;) {
inlen = fread(inbuf, 1, 1024, sourceFilePointer);
if(inlen <= 0) break;
if(!EVP_CipherUpdate(encCTX, outbuf, &outlen, inbuf, inlen)) {
/* Error */
EVP_CIPHER_CTX_free(encCTX);
printf("Error while updating ciphered file \n");
free(key);
free(targetFilename);
return 0;
}
fwrite(outbuf, 1, outlen, outputFilePointer);
}
/* Finish the cipher*/
if(!EVP_CipherFinal_ex(encCTX, outbuf, &outlen)) {
/* Error */
EVP_CIPHER_CTX_free(encCTX);
printf("Error while finalizing cipher \n");
free(key);
free(targetFilename);
return 0;
}
fwrite(outbuf, 1, outlen, outputFilePointer);
EVP_CIPHER_CTX_ctrl (encCTX, EVP_CTRL_GCM_GET_TAG, TAG_SIZE, tag);
EVP_CIPHER_CTX_free(encCTX);
fclose(outputFilePointer);
更新:我注释掉了整个密码更新部分EVP_CipherUpdate(encCTX, outbuf, &outlen, inbuf, inlen)
,并根据评论中的建议将fwrite(outbuf, 1, outlen, outputFilePointer)
替换为fwrite(inbuf, 1, inlen, outputFilePointer)
,以测试文件复制速率是否对于不同的文件大小是不变的。在使用不同文件大小测试几次后,IO速率被证明是恒定的。