C++ 返回函数崩溃-C++;Openssl

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(

从该函数返回主函数后,我的程序意外退出。 系统运行后(“暂停”),按enter键后,它将退出程序,不会返回到主功能。希望有人能提供一些见解

 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;谢谢你指出!我想我犯了一个类似的错误。