我有一个简单的程序来加密目录中的文件。我可以反复迭代,一切都很完美。这是使用pub/priv密钥对。一次解密一个文件时,它的工作原理是正确的。但是,如果一个目录中有多个文件,或者即使我将文件名放在一个向量中,并将它们分别用于读/写,它只会解密向量/目录中的最后一个文件。这怎么可能?它在OpenFinal()上对每个人都失败了。这是程序的功能和核心。其他一切都是坚实的。如前所述,如果我只是手动解密一个文件,或者如果目录或向量中只有一个文件,它作为一个独立的程序工作。
任何帮助都将不胜感激。这完全没有意义。这似乎是他们的一个实现问题。
void handleErrors(void)
{
// perror("Error: ");
ERR_print_errors_fp(stderr);
abort();
}
int envelope_open(EVP_PKEY *priv_key, unsigned char *ciphertext,
int ciphertext_len, unsigned char *encrypted_key,
int encrypted_key_len, unsigned char *iv,
unsigned char **plaintext, int *plaintext_len)
{
EVP_CIPHER_CTX *ctx;
int len = 0, ret = 0;
unsigned char *tmpptxt = NULL;
if((ctx = EVP_CIPHER_CTX_new()) == NULL)
return 0;
if ((tmpptxt = (unsigned char*)malloc(ciphertext_len)) == NULL)
{
printf("tmptxt error!\n");
handleErrors();
}
if(EVP_OpenInit(ctx, EVP_aes_256_cbc(), encrypted_key, encrypted_key_len,
iv, priv_key) != 1)
{
printf("OpenInit error\n");
handleErrors();
}
if(EVP_OpenUpdate(ctx, tmpptxt, &len, ciphertext, ciphertext_len) != 1)
{
printf("OpenUpdate error\n");
handleErrors();
}
*plaintext_len = len;
if(EVP_OpenFinal(ctx, tmpptxt + len, &len) != 1)
{
printf("OpenFinal error\n");
handleErrors();
}
*plaintext_len += len;
*plaintext = tmpptxt;
tmpptxt = NULL;
ret = 1;
err:
EVP_CIPHER_CTX_free(ctx);
free(tmpptxt);
return ret;
}发布于 2022-11-28 21:58:59
我正在覆盖密钥,iv从envelope_seal()返回。我看了一下它是独一无二的。每个文件都必须有这个密钥和iv以及密钥上的私钥和密码,才能解密一个文件。所以这绝对是安全的。当然,直到有人破解AES 256。
https://stackoverflow.com/questions/74585610
复制相似问题