C++ 返回函数崩溃-C++;Openssl
从该函数返回主函数后,我的程序意外退出。 系统运行后(“暂停”),按enter键后,它将退出程序,不会返回到主功能。希望有人能提供一些见解C++ 返回函数崩溃-C++;Openssl,c++,function,openssl,C++,Function,Openssl,从该函数返回主函数后,我的程序意外退出。 系统运行后(“暂停”),按enter键后,它将退出程序,不会返回到主功能。希望有人能提供一些见解 bool DecryptKeyWithCheckSum(unsigned char *userKey,unsigned char *ivec,std::string cipherStr,unsigned char *genKey) { //split cipher std::string first16Cipher = cipherStr.substr(
bool DecryptKeyWithCheckSum(unsigned char *userKey,unsigned char *ivec,std::string cipherStr,unsigned char *genKey)
{
//split cipher
std::string first16Cipher = cipherStr.substr(0,AES_KEY_SIZE);
std::string last16Cipher = cipherStr.substr(AES_KEY_SIZE,cipherStr.length()-1);
//convert back to char
char cipherChar1[AES_KEY_SIZE];
strcpy(cipherChar1,first16Cipher.c_str());
//convert back to char
char cipherChar2[AES_KEY_SIZE];
strcpy(cipherChar2,last16Cipher.c_str());
//convert to unsigned char
unsigned char cipher1[AES_KEY_SIZE];
memcpy(cipher1,reinterpret_cast<unsigned char*>(cipherChar1),AES_KEY_SIZE);
unsigned char cipher2[AES_KEY_SIZE];
memcpy(cipher2,reinterpret_cast<unsigned char*>(cipherChar2),AES_KEY_SIZE);
//set key
AES_KEY key;
AES_set_encrypt_key(userKey, 128, &key);
unsigned char oriKey[AES_KEY_SIZE];
unsigned char checksum[AES_KEY_SIZE];
int num1 = 0;
//decrypt cipher
AES_cfb128_encrypt(cipher1, oriKey, AES_BLOCK_SIZE, &key, ivec, &num1,AES_DECRYPT);
AES_cfb128_encrypt(cipher2, checksum, AES_KEY_SIZE, &key, ivec, &num1,AES_DECRYPT);
//generate hash checksum
unsigned char hashChecksum[AES_KEY_SIZE];
this->hashData_MD5(oriKey,AES_KEY_SIZE,hashChecksum);
//convert checksum into string to compare
char checksum1[AES_KEY_SIZE];
strncpy(checksum1,reinterpret_cast<const char*>(hashChecksum),AES_KEY_SIZE);
checksum1[AES_KEY_SIZE] = '\0';
std::string checksum1Str = checksum1;
//convert checksum into string to compare
char checksum2[AES_KEY_SIZE];
strncpy(checksum2,reinterpret_cast<const char*>(checksum),AES_KEY_SIZE);
checksum2[AES_KEY_SIZE] = '\0';
std::string checksum2Str = checksum2;
//compare last 16 & checksum
if(checksum1Str==checksum2Str)
{
//PROGRAM ABLE TO PRINT OUT THIS
cout << "Decrypt Key Return true" << endl;
system("pause");
return true;
}
else
{
cout << "Decrypt Key Return false" << endl;
system("pause");
return false;
}
}//end of function
int main()
{
//get user to enter password to decrypt password
unsigned char pass[AES_KEY_SIZE] = "password";
unsigned char tempKey[AES_KEY_SIZE];
//generate random key
unsigned char ckey[AES_KEY_SIZE];
this->generateRandomNum(ckey,AES_KEY_SIZE);
this->generateRandomNum(ivec,AES_IV_SIZE);
std::string cipherStr;
EncryptKeyWithCheckSum(pass,IV2,ckey,cipherStr);
if(DecryptKeyWithCheckSum(pass,IV,cipherStr,tempKey)==true)
{
//BEFORE PRINTING OUT THIS, THE PROGRAM CRASHES UNEXPECTEDLY
cout << "TRUE" << endl;
system("pause");
}
else
{
cout << "False" << endl;
system("pause");
}
}
bool DecryptKeyWithCheckSum(无符号字符*用户密钥,无符号字符*ivec,std::string cipherStr,无符号字符*genKey)
{
//分裂密码
std::string first16Cipher=cipherStr.substr(0,AES密钥大小);
std::string last16Cipher=cipherStr.substr(AES_KEY_SIZE,cipherStr.length()-1);
//转换回字符
字符cipherChar1[AES_KEY_SIZE];
strcpy(cipherChar1,first16Cipher.c_str());
//转换回字符
字符cipherChar2[AES_KEY_SIZE];
strcpy(cipherChar2,last16Cipher.c_str());
//转换为无符号字符
无符号字符密码1[AES_KEY_SIZE];
memcpy(密码1,重新解释铸造(密码1),AES密钥大小);
无符号字符密码2[AES_KEY_SIZE];
memcpy(密码2,重新解释铸造(密码2),AES密钥大小);
//设定键
AES_密钥;
AES设置加密密钥(用户密钥、128和密钥);
无符号字符或密钥[AES_KEY_SIZE];
无符号字符校验和[AES_KEY_SIZE];
int num1=0;
//解密密码
AES_cfb128_加密(密码1、oriKey、AES_块大小、密钥、ivec和num1、AES_解密);
AES_cfb128_加密(密码2、校验和、AES_密钥大小、密钥、ivec和num1、AES_解密);
//生成哈希校验和
无符号字符哈希校验和[AES_KEY_SIZE];
这->hashData\u MD5(oriKey、AES\u KEY\u SIZE、hashChecksum);
//将校验和转换为字符串以进行比较
char checksum1[AES_KEY_SIZE];
strncpy(checksum1,reinterpret_cast(hashChecksum),AES_KEY_SIZE);
checksum1[AES_KEY_SIZE]='\0';
std::string checksum1Str=checksum1;
//将校验和转换为字符串以进行比较
char checksum2[AES_KEY_SIZE];
strncpy(校验集2、重新解释转换(校验和)、AES密钥大小);
checksum2[AES_KEY_SIZE]='\0';
std::string checksum2Str=checksum2;
//比较最后16个校验和
if(checksum1Str==checksum2Str)
{
//程序能够打印出这个
cout大多数数组都太小了一个元素
比如说,
std::string first16Cipher = cipherStr.substr(0,AES_KEY_SIZE);
因此,first16Cipher
具有AES\u KEY\u SIZE
字符
char cipherChar1[AES_KEY_SIZE];
strcpy(cipherChar1,first16Cipher.c_str());
但是,当包含终止零时,此行将复制AES\u KEY\u SIZE+1
字符,这将导致未定义的行为,从而使整个程序未定义。大多数数组都是一个太小的元素
比如说,
std::string first16Cipher = cipherStr.substr(0,AES_KEY_SIZE);
因此,first16Cipher
具有AES\u KEY\u SIZE
字符
char cipherChar1[AES_KEY_SIZE];
strcpy(cipherChar1,first16Cipher.c_str());
但是,当包含终止零时,此行将复制AES\u KEY\u SIZE+1
字符,这将导致未定义的行为,从而使整个程序未定义。因此,当我执行以下操作时..我应该声明char checksum1[AES\u KEY\u SIZE+1]。//将校验和转换为字符串以比较char checksum1[AES\u KEY\u SIZE];strncpy(checksum1,reinterpret_cast(hashChecksum),AES_KEY_SIZE);checksum1[AES_KEY_SIZE]='\0';std::string checksum1Str=checksum1;感谢您的指出!我想我犯了一个类似的错误。因此,当我执行以下操作时..我应该声明char checksum1[AES_KEY_SIZE+1]相反?//将校验和转换为字符串来比较char checksum1[AES_KEY_SIZE];strncpy(checksum1,reinterpret_cast(hashChecksum),AES_KEY_SIZE);checksum1[AES_KEY_SIZE]='\0';std::string checksum1Str=checksum1;谢谢你指出!我想我犯了一个类似的错误。