使用较大的文件进行测试时,使用OpenSSL加密+解密速度较慢

时间:2016-05-24 19:18:57

标签: c file encryption openssl

我刚刚编写了两个C应用程序,一个用于加密,另一个用于解密文件。

加密+解密期间的文件操作代码已从OpenSSL site复制/粘贴并更改为使用AES-GCM

它就像一个魅力!事情是

  • 对于500MB文件,密码率为80MB / s
  • 对于10000MB文件,密码率降至22MB / s

我应该几乎不变。如果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速率被证明是恒定的。

0 个答案:

没有答案