2013-02-16 2 views
1

이 함수에서 main 함수를 반환하면 내 프로그램이 예기치 않게 종료됩니다. 시스템 ("일시 중지")이 끝나면 enter 키를 누르면 프로그램에서 빠져 나오고 주 기능으로 돌아 가지 않습니다. 바라건대 누군가가 약간의 통찰력을 줄 수 있기를 바랍니다.반환 함수 크래시 - C++ Openssl

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"); 
} 
} 

답변

1

대부분의 배열은 너무 작은 요소입니다. 예를 들어

,

std::string first16Cipher = cipherStr.substr(0,AES_KEY_SIZE); 

그렇게 first16CipherAES_KEY_SIZE 문자

char cipherChar1[AES_KEY_SIZE]; 
strcpy(cipherChar1,first16Cipher.c_str()); 

하지만 제로 종료 포함 할 때,이 줄 전체를하게 정의되지 않은 동작을 유발 AES_KEY_SIZE + 1 문자를 복사합니다있다 프로그램이 정의되지 않았습니다.

+0

그래서 내가 할 다음 .. 내가 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; – mister

+0

지적 해 주셔서 감사합니다! 나는 다소 비슷한 실수를했다는 생각이 들었다. – mister