2015-06-18 19 views
2

我在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尋找有關安全或意見瑕疵)

回答

0

嘗試使用開放SSL描述的API(EVP_BytesToKey - 基於密碼的加密例程)。

+0

感謝斯里蘭卡,但從OS X 10.7開始不推薦使用EVP_BytesToKey,並且不再可用。 – TheDarkKnight

0

問題原來是爲了解CryptDeriveKey如何在RC4解密中使用指定位的數量。

CryptDeriveKey(m_hProv, CALG_RC4, hHash, CRYPT_EXPORTABLE | 0x00280000, &m_hKey); 

這裏它表明我們想要一個40位密鑰(0x00280000 = 40 < < 16)。

但是,在調用CryptDecrypt時,Windows實際上使用16個字節作爲密鑰,取前40位,並將該數組的其餘部分設置爲零。

因此,向CCCryptorCreate函數傳遞一個16字節的密鑰(僅設置前40位)將生成匹配的Windows輸出。