我在Windows平臺上使用的加密代碼,它使用的加密API函數,需要將其轉換爲在OS X上使用公共的密碼的CryptoAPI到CommonCrypto
本質的原代碼是這樣的,有檢查刪除錯誤爲簡潔: -
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哈希輸入數據 - 解碼的pData與RC4,使用密鑰m_hKey
pszInputData的大小是12個字節,MD5散列對象的輸出數組在兩個平臺上都相同。
要使用RC4解碼,我在做與公共密碼如下: -
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);
測試從公共的密碼與網上RC4解碼器匹配輸出(outBuffer陣列),所以這是正確解碼。
但是,pData中Windows代碼的最終輸出與Common Crypto中解碼的RC4不匹配。
是否有一些步驟我失蹤或不理解Windows Crypto API調用在這裏;爲什麼產出不同?
(請注意,我不是在使用RC4尋找有關安全或意見瑕疵)
感謝斯里蘭卡,但從OS X 10.7開始不推薦使用EVP_BytesToKey,並且不再可用。 – TheDarkKnight