CryptoApi à CommonCrypto

J'ai un code cryptographique utilisé dans la plate-forme Windows, qui utilise les fonctions de l'API Crypto et qui doit être converti en utilisant Common Crypto sur OS X.

Essentiellement le code original est ceci, avec la vérification d'erreur enlevée pour la brièveté: -

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);

Pour autant que je comprends, c'est ce qui se passe: -

CryptAcquireContext - Récupère un objet pour gérer la cryptographie

     

CryptCreateHash - Crée un objet de hachage MD5

     

CryptHashData - Hash les données d'entrée avec MD5

     

CryptDeriveKey, CryptDecrypt - Décode pData avec RC4, en utilisant la clé m_hKey

La taille de pszInputData est de 12 octets et le tableau de sortie de l'objet haché MD5 est le même sur les deux plates-formes.

Pour décoder avec RC4, je suis en train de faire ce qui suit avec 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);

Tester la sortie (array outBuffer) de Common Crypto avec un décodeur RC4 en ligne correspond donc à un décodage correct.

Cependant, la sortie finale du code Windows dans pData ne correspond pas au RC4 décodé dans Common Crypto.

Y a-t-il des étapes qui me manquent ou que je ne comprends pas avec les appels API Windows Crypto ici? pourquoi les sorties diffèrent-elles?

(S'il vous plaît noter, je ne cherche pas de commentaires sur la sécurité ou les failles dans l'utilisation de RC4)

0

2 Réponses

Le problème s'avère être de comprendre comment CryptDeriveKey utilise le nombre de bits spécifiés avec le décryptage RC4.

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

Here it's stating that we want a 40 bit key (0x00280000 = 40 << 16).

Cependant, lorsque vous appelez CryptDecrypt, Windows utilise 16 octets pour la clé, prenant les 40 premiers bits et définissant le reste du tableau sur zéro.

Ainsi, le passage d'une clé de 16 octets, avec juste le premier jeu de 40 bits, à la fonction CCCryptorCreate génère la sortie correspondante à Windows.

0
ajouté

Essayez d'utiliser l'API décrite dans Open SSL (EVP_BytesToKey - routine de chiffrement basée sur un mot de passe).

0
ajouté
Merci Sri, mais EVP_BytesToKey est obsolète depuis OS X 10.7 et n'est plus disponible.
ajouté l'auteur TheDarkKnight, source