2

Crypto API 関数を使用する Windows プラットフォームで使用される暗号化コードがあり、これを OS X で Common Crypto を使用するように変換する必要があります。

基本的に元のコードは次のとおりですが、簡潔にするためにエラー チェックは削除されています。

CryptAcquireContext(&m_hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT));
CryptCreateHash(m_hProv, CALG_MD5 ,0, 0, &hHash);
CryptHashData(hHash,(LPBYTE)pszInputData, lstrlen(pszInputData)*sizeof(TCHAR), 0);

CryptDeriveKey(m_hProv, CALG_RC4, hHash, CRYPT_EXPORTABLE | 0x00280000, &m_hKey);
CryptDecrypt(m_hKey, 0, bFinal, 0, pData, pdwDataSize);

私が理解している限り、これが起こっていることです: -

CryptAcquireContext - 暗号化を処理するオブジェクトを取得する

CryptCreateHash - MD5 ハッシュ オブジェクトを作成する

CryptHashData - MD5 で入力データをハッシュする

CryptDeriveKey、CryptDecrypt - キー m_hKey を使用して、RC4 で pData をデコードします。

pszInputData のサイズは 12 バイトで、MD5 ハッシュ オブジェクトの出力配列は両方のプラットフォームで同じです。

RC4 でデコードするために、Common Crypto で次のことを行っています。

CCCryptorRef cryptor = NULL;
CCCryptorCreate(kCCDecrypt, kCCAlgorithmRC4, 0,
                      (void*)m_hKey.data(), m_hKey.length(), NULL, &cryptor);

char outBuffer[12];
size_t outBytes;
CCCryptorUpdate(cryptor, (void*)pData, *pdwDataSize, outBuffer, 12, &outBytes);

Common Crypto からの出力 (outBuffer 配列) をオンライン RC4 デコーダーでテストすると一致するため、正しくデコードされています。

ただし、pData の Windows コードからの最終的な出力は、Common Crypto でデコードされた RC4 と一致しません。

ここで、Windows Crypto API 呼び出しに関して、不足している、または理解していない手順がいくつかあります。なぜ出力が異なるのですか?

(注意してください、RC4 を使用する際のセキュリティや欠陥についてのコメントは求めていません)

4

2 に答える 2

0

Open SSL (EVP_BytesToKey - パスワードベースの暗号化ルーチン) で説明されている API を使用してみてください。

于 2015-06-18T16:21:16.690 に答える