gpt4 book ai didi

c++ - OpenSSL AES 加密似乎无法正常工作

转载 作者:太空狗 更新时间:2023-10-29 22:55:29 27 4
gpt4 key购买 nike

所以这是我第一次涉足 AES 加密和 OpenSSL。我设法得到了一些加密和解密的例子,但它们似乎不能正常工作。其一,在加密函数中:

void encryptAES(FILE *iF, FILE *oF)
{
fseek(iF, 0L, SEEK_END);
int fsize = ftell(iF);
fseek(iF, 0L, SEEK_SET);

int out = 0;
int out2 = 0;
unsigned char *inD = ( unsigned char * )malloc(fsize);
unsigned char *outD = ( unsigned char * )malloc(fsize*2);
unsigned char ckey[] = "thiskeyisverybad";
unsigned char ivec[] = "dontusethisinput";

fread(inD,sizeof(char),fsize, iF);

EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();

if(!EVP_EncryptInit(ctx,EVP_aes_128_cbc(),ckey,ivec))
{
std::cout<<"EVP_EncryptInit() error: "<<ERR_error_string(ERR_get_error(), NULL);
}

if(!EVP_EncryptUpdate(ctx,outD,&out,inD,fsize))
{
std::cout<<"EVP_EncryptUpdate() error: "<<ERR_error_string(ERR_get_error(), NULL);
}

if(!EVP_EncryptFinal(ctx,outD,&out2))
{
std::cout<<"EVP_EncryptFinal() error: "<<ERR_error_string(ERR_get_error(), NULL);
}

fwrite(outD,sizeof(char),fsize,oF);
}

这会生成一个实际的“加密”文件,该文件还不错,但并不完全是它应该的样子(或者我认为是这样)。如果我从 openssl 运行 cli 命令来加密同一个文件,我将返回一个文本文件,其中写入了加密的字符串。我的函数制作的是一个非文本文件(实际上它说它是未知格式)。

第二个,解密:

void decryptAES(FILE *iF, FILE *oF)
{
fseek(iF, 0L, SEEK_END);
int fsize = ftell(iF);
fseek(iF, 0L, SEEK_SET);

int out = 0;
int out2 = 0;
unsigned char *inD = ( unsigned char * )malloc(fsize);
unsigned char *outD = ( unsigned char * )malloc(fsize*2);
unsigned char ckey[] = "thiskeyisverybad";
unsigned char ivec[] = "djntusethisinput";

fread(inD,sizeof(char),fsize, iF);//Read Entire File

EVP_CIPHER_CTX * ctx = EVP_CIPHER_CTX_new();

if(!EVP_DecryptInit(ctx,EVP_aes_128_cbc(),ckey,ivec))
{
std::cout<<"EVP_DecryptInit() error: "<<ERR_error_string(ERR_get_error(), NULL);
}

if(!EVP_DecryptUpdate(ctx,outD,&out,inD,fsize))
{
std::cout<<"EVP_DecryptUpdate() error: "<<ERR_error_string(ERR_get_error(), NULL);
}

if(!EVP_DecryptFinal(ctx, outD, &out2))
{
std::cout<<"EVP_DecryptFinal() error: "<<ERR_error_string(ERR_get_error(), NULL);
}
fwrite(outD,sizeof(char),fsize,oF);
}

在这个函数中我实际上得到了一个错误:EVP_DecryptFinal() error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block lengthP

现在,不确定问题是出在解密上,还是加密上。

此外,我的主要内容:

// Encrypt

FILE *ifp = fopen("Test.zip", "rb");
FILE *ofp = fopen("Test.zip.enc", "wb");

encryptAES(ifp, ofp);

fclose(ifp);
fclose(ofp);

// Decrypt

FILE *iF = fopen("Test.zip.enc", "rb");
FILE *oF = fopen("TEST.zip", "wb");

decryptAES(ifP, ofP);

fclose(iF);
fclose(oF);

此外,奇怪的是,如果我的文件严格来说是一个文本文件,它就可以工作(即使它通常应该加密任何类型的文件)。

最佳答案

您对 EVP_EncryptFinalEVP_DecryptFinal 的调用未写入正确的位置。两者都写入 outD,这是缓冲区的开始。这些需要写入缓冲区的 end,即 out 字节之后:

if(!EVP_EncryptFinal(ctx,outD+out,&out2))
...
if(!EVP_DecryptFinal(ctx,outD+out,&out2))

在这两种情况下,您也没有将正确的字节数写入输出文件。由于填充,加密大小通常比输入大小长,但您正在编写 fsize 字节,这是输入文件的大小。您想要写入的字节数,即 out+out2:

fwrite(outD,sizeof(char),out+out2,oF);
...
fwrite(outD,sizeof(char),out+out2,oF);

还有 IV 不匹配。对于加密,您使用“dontusethisinput”,而对于解密,您使用“djntusethisinput”(注意每个中的第二个字母)。这些必须相同。

您还应该检查执行文件 I/O 的函数的返回值,以防它们无法按预期工作,并且释放任何动态分配的内存。

关于c++ - OpenSSL AES 加密似乎无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51922171/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com