Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 加密+;使用更大的文件进行测试时,使用OpenSSL进行解密的速度较慢_C_File_Encryption_Openssl - Fatal编程技术网

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

C 加密+;使用更大的文件进行测试时,使用OpenSSL进行解密的速度较慢,c,file,encryption,openssl,C,File,Encryption,Openssl,我刚刚编写了两个C应用程序,一个用于加密,另一个用于解密文件 加密+解密期间用于文件操作的代码已从中复制/粘贴,并更改为使用AES-GCM 它就像一个符咒!问题是 对于500MB文件,密码速率为80MB/s 对于10000MB的文件,密码速率下降到22MB/s 我应该几乎保持不变。如果500MB文件的速率约为80MB/s,那么10GB文件的速率应该是80MB/s(可能会稍微低一点,但不会太高!) 随着文件大小的增加,密码率不断降低 这可能是文件操作的问题吗?可能与内存使用有关?我做错什么了吗

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

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

它就像一个符咒!问题是

  • 对于500MB文件,密码速率为80MB/s
  • 对于10000MB的文件,密码速率下降到22MB/s
我应该几乎保持不变。如果500MB文件的速率约为80MB/s,那么10GB文件的速率应该是80MB/s(可能会稍微低一点,但不会太高!)

随着文件大小的增加,密码率不断降低

这可能是文件操作的问题吗?可能与内存使用有关?我做错什么了吗

以下是我实际使用的代码:

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);
const EVP_CIPHER*密码;
无符号字符inbuf[1024],extuf[1024+EVP_MAX_BLOCK_LENGTH];
内联,外联;
/*初始化密码*/
cipher=EVP_aes_256_gcm();//伽罗瓦计数器模式下的AES
EVP_CIPHER_CTX*encCTX=EVP_CIPHER_CTX_new();
EVP_CipherInit_ex(encCTX,cipher,NULL,key,iv,1);//1表示加密,0表示解密
/*循环加载文件块并对其加密*/
对于(;;){
inlen=fread(inbuf,1,1024,sourceFilePointer);

if(inlen)对于较大的文件,较低的结果可能与缓存有关。这只是一个猜测。在不加密的情况下重写文件需要多快?对不起,我不明白…不加密重写文件是什么意思?@vianna77将您对
EVP_CipherUpdate
的呼叫注释掉,然后替换
FWWrite(exputf,1,outlen,outputFilePointer)
with
fwrite(inbuf,1,inlen,outputFilePointer)
因此,您的代码所做的只是制作文件的未加密副本。如果较大文件的复制速度较慢,则问题在于复制,如果较大文件的复制速度较慢,则问题在于加密。好主意!谢谢!我会这样做,并检查会发生什么。我现在在家,但我一回到工作岗位,我会尽快完成在测试中。较大文件的较低结果可能与缓存有关。这只是一个猜测。在不加密的情况下重写文件需要多快?抱歉,我不明白…不加密重写文件是什么意思?@vianna77将您的呼叫注释到
EVP\u CipherUpdate
,然后替换
FWWrite(exputf,1,outlen,outputFilePointer)
with
fwrite(inbuf,1,inlen,outputFilePointer)
因此,您的代码所做的只是制作文件的未加密副本。如果较大文件的复制速度较慢,则问题在于复制,如果较大文件的复制速度较慢,则问题在于加密。好主意!谢谢!我会这样做,并检查会发生什么。我现在在家,但我一回到工作岗位,我会尽快完成在测试中。