2011-01-25 12 views
4

AES-128을 사용하여 주어진 데이터를 암호화하고 SHA-256을 사용하여 암호에서 파생 된 키를 암호화하는 CryptoAPI 코드가 있습니다.OpenSSL API를 사용하여 Windows CryptoAPI CryptDeriveKey 구현

OpenSSL 등가 구현을 작성하여 데이터를 암호화 한 다음 CryptoAPI로 해독 할 수 있고 그 반대의 경우도 마찬가지입니다.

EVP_aes_128_cbc() 및 EVP_sha256()을 사용하여 EVP_BytesToKey를 사용하려는 시도가 "있는 그대로"작동하지 않았습니다. ("작동하지 않음"은 CryptoAPI의 생성 된 암호화 된 데이터를 해독 할 수 없으며 그 반대의 경우도 있음) 이는 OpenSSL의 암호화 된 데이터를 해독하는 데 유용합니다.

어떤 아이디어 또는 좋은 참조?

미리 감사드립니다. 여기

는 Windows CryptoAPI를 코드 : 결국

// Get the handle to the default provider. 
     if(CryptAcquireContext(
        &hCryptProv, 
        NULL, 
        MS_ENH_RSA_AES_PROV, 
        PROV_RSA_AES, 
        CRYPT_VERIFYCONTEXT)) 
      { 
        _tprintf(
          TEXT("A cryptographic provider has been acquired. \n")); 
      } 
      else 
      { 
        goto Exit_PrepareCAPI; 
      } 
      // Create a hash object. 
      if(!CryptCreateHash(
        hCryptProv, 
        HASH_ALGORITHM, 
        0, 
        0, 
        &hHash)) 
      { 
        goto Exit_PrepareCAPI; 
      } 
      // Hash in the password data. 
      if(!CryptHashData(
        hHash, 
        (BYTE*) strPassword.c_str(), 
        strPassword.length(), 
        (DWORD)0)) 
      { 
        goto Exit_PrepareCAPI; 
      } 
      // Derive a session key from the hash object. 
      if(!CryptDeriveKey(
        hCryptProv, 
        ENCRYPT_ALGORITHM, 
        hHash, 
        0x00800000 /*128 bit*/, 
        &hKey)) 
      { 
        goto Exit_PrepareCAPI; 
      } 
      DWORD cryptMode = CRYPT_MODE_CBC; 

      if(!CryptSetKeyParam(
        hKey, 
        KP_MODE, 
        (BYTE*)&cryptMode, 
        0)) 
      { 
        goto Exit_PrepareCAPI; 
      } 

        if(!CryptGetHashParam(
        hHash, 
        HP_HASHSIZE, 
        (BYTE *)&dwHashLen, 
        &dwHashLenSize, 
        0)) 
      { 
        goto Exit_PrepareCAPI; 
      } 

      pbHash = new BYTE[dwHashLen]; 

      if(!CryptGetHashParam(
        hHash, 
        HP_HASHVAL, 
        pbHash, 
        &dwHashLen, 
        0)) 
      { 
        goto Exit_PrepareCAPI; 
      } 

      SecureZeroMemory(ivBuff, sizeof(ivBuff)); 

      for(DWORD i = 16, j = 0 ; i < dwHashLen ; i++, j++) 
      { 
        ivBuff[j] = pbHash[i]; 
      } 

      if(!CryptSetKeyParam(
        hKey, 
        KP_IV, 
        ivBuff, 
        0)) 
      { 
        goto Exit_PrepareCAPI; 
      } 
      // 
      // Read the data into pre-allocated pbBuffer 
      // 
// Encrypt data.   if(!CryptEncrypt(
        hKey, 
        NULL, 
        fEOF, 
        0, 
        pbBuffer, 
        &dwCount, 
        dwBufferLen)) 
{ 
        goto Exit_MyEncryptFile; 
      } 
Exit_MyEncryptFile: 
      // Cleanup allocated objects 

답변

3

,이 코드는 일이 사람을 도움이 될 것입니다

int generateKey(const string& strSecter) 
{  
SHA256_CTX sha256Ctx; 
unsigned char hash[SHA256_DIGEST_LENGTH]; 
SecureZeroMemory(hash, sizeof hash); 
SHA256_Init(&sha256Ctx); 
SHA256_Update(&sha256Ctx, strSecter.c_str(), strSecter.length()); 
SHA256_Final(hash, &sha256Ctx); 
memcpy(Key, hash, AES_BLOCK_SIZE); 
memcpy(IV, hash + AES_BLOCK_SIZE, AES_BLOCK_SIZE); 

return 0; 
} 

희망.

+0

32 바이트 SHA256의 결과와 함께 처음 16 바이트는 Key가되고 나머지 16 바이트는 IV가됩니다. 20 바이트의 SHA1은 어떻습니까? – yelliver

관련 문제