2014-04-08 2 views
0

이 코드를 사용하면 도움이 될 수 있습니까? 함수 AesDecrypt을 호출하면 멈 춥니 다.Wincrypt 함수 호출로 프로그램이 중단됨

#include <iostream> 
#include <Windows.h> 
#include <wincrypt.h> 


struct AesKey { 
    BLOBHEADER Header; 
    DWORD dwKeyLength; 
    BYTE cbKey[16]; 

     AesKey() { 
      ZeroMemory(this, sizeof(*this)); 
      Header.bType = PLAINTEXTKEYBLOB; 
      Header.bVersion = CUR_BLOB_VERSION; 
      Header.reserved = 0; 
      Header.aiKeyAlg = CALG_AES_128; 
      dwKeyLength = 16; 
     } 
}; 

void AesDecrypt(unsigned char *output, unsigned char *input, int inLen, unsigned char *key, unsigned char *iv, int &plainSize) { 
    HCRYPTPROV provider; 
    AesKey rawKey; 
    HCRYPTKEY cKey; 

    BOOL hr = CryptAcquireContext(&provider, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0); 
    if (hr == FALSE) 
     throw "Unable to acquire AES Context"; 

    for (int i = 0; i < 16; i++) 
     rawKey.cbKey[i] = key[i]; 

    hr = CryptImportKey(provider, (BYTE *) &rawKey, sizeof(AesKey), NULL, 0, &cKey); 
    if (hr == FALSE) 
     throw "Unable to import given key"; 

    hr = CryptSetKeyParam(cKey, KP_IV, (BYTE *) iv, 0); 
    if (hr == FALSE) 
     throw "Unable to set IV"; 

    DWORD dwMode = CRYPT_MODE_CBC; 
    hr = CryptSetKeyParam(cKey, KP_MODE, (BYTE*) &dwMode, 0); 
    if (hr == FALSE) 
     throw "Unable to set mode"; 

    memcpy(output, input, inLen); 

    DWORD d = (DWORD) inLen; 
    hr = CryptDecrypt(cKey, NULL, TRUE, 0, output, &d); 
    if (hr == FALSE) 
    { 
     int err = GetLastError(); 
     throw "Error during Decryption"; 
    } 

    plainSize = d; 
} 

// codigo generado por mi 

int main(int argc, char** argv) { 
     unsigned char input[] = "SE83loTjmMeaG9+xoIyjng=="; 
     unsigned char *pinput = input; 

     unsigned char output[] = "SE83loTjmMeaG9+xoIyjng=="; 
     unsigned char *poutput = output; 

     unsigned char iv[] = "1234567890ABCDEF"; 
     unsigned char *piv = iv; 

     unsigned char key[] = "1234567890ABCDEF"; 
     unsigned char *pkey = key; 
     int plaInt; 
     AesDecrypt(poutput, pinput, 24, pkey, piv, plaInt); 

     std::cout << output << std::endl; 

     return 0; 
} 

함수를 호출 할 때 코드가 충돌합니다. 포인터를 전달하여 뭔가 잘못하고 있다고 생각합니다.

이 응용 프로그램이 비정상적인 방식으로 종료 할 런타임을 요청했습니다 '문자의 CONST *'

의 인스턴스를 던지는 후에 호출 종료합니다. 정보는 지원 팀에 문의하십시오.

-------------------------------- 반환 값으로 프로세스 종료 255 아무 키나 눌러 계속 진행하십시오. . .

+3

를 사용하는 것을 의미했다. –

답변

1

나는이 줄이 범인이라고 생각한다.

hr = CryptImportKey(provider, (BYTE *) &rawKey, sizeof(AesKey), NULL, 0, &cKey); 

당신은 아마 여기에 요청하기 전에 먼저 프로그램을 디버깅하십시오

hr = CryptImportKey(provider, rawKey.cbKey, sizeof(AesKey), NULL, 0, &cKey); 
+0

에서 동일한 오류가 발생 함 – gdJCH

관련 문제