2011-01-25 28 views
4

私は、AES-128を使用して特定のデータを暗号化するためのCryptoAPIコードと、SHA-256を使用するパスワードから得られたキーを持っています。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バイトはキーになり、残りの16バイトはIVになります。 20バイトのSHA1はどうですか? – yelliver

関連する問題