gpt4 book ai didi

c++ openssl加密有时会失败

转载 作者:行者123 更新时间:2023-11-28 08:17:48 25 4
gpt4 key购买 nike

我想在我的 C++ 应用程序中加密和解密字符串,并为此使用 openssl。因为我不知 Prop 体怎么做,所以我使用了来自互联网的这段代码:

        LPCTSTR encrypt(LPCTSTR inString, LPCTSTR inKey, LPCTSTR outString)
{
const unsigned char* inStringC = (const unsigned char*)inString;
const unsigned char* outStringC = (const unsigned char*)outString;
const unsigned char* inKeyC = (const unsigned char*)inKey;

HINSTANCE libeay32 = LoadLibrary("libeay32.dll");

GET_FUNC_PTR(BF_set_key, void, void*, int, const unsigned char*);
GET_FUNC_PTR(BF_cfb64_encrypt, void, unsigned char*, unsigned char*, long, void*, unsigned char*, int*, int);

if (BF_set_key == NULL || BF_cfb64_encrypt == NULL) {
TRACE("ERROR: failed while loading functions from \"libeay32.dll\"\n");
return NULL;
}

BF_KEY key = {NULL, NULL};
BF_set_key(&key, strlen((const char*)inKeyC), inKeyC);

size_t length = strlen(inString);
unsigned char *cfb64_out = (unsigned char*)malloc((length+2)*sizeof(unsigned char*));
unsigned char iv[32];
memset(cfb64_out,0,length+1);
memset(iv,0,32);
int num = 0;
BF_cfb64_encrypt((unsigned char*)inStringC, cfb64_out, length, &key, iv, &num, BF_ENCRYPT);
FreeLibrary(libeay32);
std::string retString = base64_encode((const char *)cfb64_out);
strcpy((char*)outStringC, retString.c_str());
free(cfb64_out);
return outString;
}

LPCTSTR decrypt(LPCTSTR inString, LPCTSTR inKey, LPCTSTR outString)
{
const unsigned char* inStringC = (const unsigned char*)inString;
const unsigned char* outStringC = (const unsigned char*)outString;
const unsigned char* inKeyC = (const unsigned char*)inKey;

HINSTANCE libeay32 = LoadLibrary("libeay32.dll");
GET_FUNC_PTR(BF_set_key, void, void*, int, const unsigned char*);
GET_FUNC_PTR(BF_cfb64_encrypt, void, unsigned char*, unsigned char*, long, void*, unsigned char*, int*, int);

if (BF_set_key == NULL || BF_cfb64_encrypt == NULL) {
TRACE("ERROR: failed while loading functions from \"libeay32.dll\"\n");
return NULL;
}


BF_KEY key = {NULL, NULL};
BF_set_key(&key, strlen((const char*)inKeyC), inKeyC);
std::string retString = base64_decode((const char*)inStringC);

size_t length = retString.length();
unsigned char *cfb64_out = (unsigned char*)malloc((length+2)*sizeof(unsigned char));
unsigned char iv[32];
memset(cfb64_out,0,length+1);
memset(iv,0,32);
int num = 0;

BF_cfb64_encrypt((unsigned char * )retString.c_str(), cfb64_out, length, &key, iv, &num, BF_DECRYPT);

FreeLibrary(libeay32);

strcpy((char *)outStringC, (char *)cfb64_out);
free(cfb64_out);
return outString;
}

这在大多数情况下都有效。但有时不会。例如,输入“as”和键“hfsa”会失败。因为我确定 openssl 正在工作,所以我想我在调用 openssl 函数时做错了什么。有什么想法吗?

编辑:“失败”意味着加密字符串为空或解密字符串为空。大多数时候,当它失败时,解密的字符串只是预期的子字符串。

编辑2:
我将问题隔离为:
如果我用 key “dg”加密例如“sdg”,那么 openssl 函数

                BF_cfb64_encrypt((char * )inputStr, cfb64_out, length, &key, iv, &num, BF_ENCRYPT);

返回长度为 2 的“ƒx”。
当我解码时,我必须告诉 openssl 的解密函数(见上文)要解密的长度。这是 2。
但原始字符串的长度为 3。所以我只得到“sd”作为解密结果,而不是“sdg”。

最佳答案

char* 在面向字节的加密中与在字符串中的工作方式不同。通常它包含空终止字符串。在这种情况下,它没有,它包含一个确定长度的字节数组(在你的例子中是 3)。其中的字节可以有任何值包括 00h,空终止符,取决于键、数据和IV。因此,您只需要记住(使用 CFB)您的输入长度就是您的输出长度,并在解密时指定该特定长度(换句话说,您需要传达长度 在进行加密的部分和进行解密的部分之间)。

关于c++ openssl加密有时会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7064904/

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