C 加密+;使用更大的文件进行测试时,使用OpenSSL进行解密的速度较慢
我刚刚编写了两个C应用程序,一个用于加密,另一个用于解密文件 加密+解密期间用于文件操作的代码已从中复制/粘贴,并更改为使用AES-GCM 它就像一个符咒!问题是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(可能会稍微低一点,但不会太高!) 随着文件大小的增加,密码率不断降低 这可能是文件操作的问题吗?可能与内存使用有关?我做错什么了吗
- 对于500MB文件,密码速率为80MB/s
- 对于10000MB的文件,密码速率下降到22MB/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)
withfwrite(inbuf,1,inlen,outputFilePointer)
因此,您的代码所做的只是制作文件的未加密副本。如果较大文件的复制速度较慢,则问题在于复制,如果较大文件的复制速度较慢,则问题在于加密。好主意!谢谢!我会这样做,并检查会发生什么。我现在在家,但我一回到工作岗位,我会尽快完成在测试中。较大文件的较低结果可能与缓存有关。这只是一个猜测。在不加密的情况下重写文件需要多快?抱歉,我不明白…不加密重写文件是什么意思?@vianna77将您的呼叫注释到EVP\u CipherUpdate
,然后替换FWWrite(exputf,1,outlen,outputFilePointer)
withfwrite(inbuf,1,inlen,outputFilePointer)
因此,您的代码所做的只是制作文件的未加密副本。如果较大文件的复制速度较慢,则问题在于复制,如果较大文件的复制速度较慢,则问题在于加密。好主意!谢谢!我会这样做,并检查会发生什么。我现在在家,但我一回到工作岗位,我会尽快完成在测试中。