Rfc2898DeriveBytes in plain C with Win32 Crypto API
Ich habe unlängst Fremdherstellercode gesehen, welcher leidergottes in .NET programmiert war und auch Cryptographiefunktionen verwendet hat.
Nun stellt sich für den Win32 Native-Programmierer natürlich die Frage, wie er mit den so erstellten Daten umgehen kann, um den Datenstrom ver/entschlüsseln zu können.
Zum Einsatz kam im .NET Code die Funktion Rfc2898DeriveBytes:
Rfc2898DeriveBytes bytes2 = new Rfc2898DeriveBytes(Password, keySalt);
Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(Password, IVSalt);
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
stream = new CryptoStream(stream2, provider.CreateDecryptor(bytes2.GetBytes(8), bytes.GetBytes(0x10)), CryptoStreamMode.Read);
Nach einiger Recherche stellte sich heraus, dass diese PBKDF2 implementiert, welche in der Win32 CryptoAPI wincrypt.h wohl noch nicht implementiert ist.
Was also tun?
Glücklicherweise fand ich die Funktion “SpcPBKDF2” im Secure programming cookbook for C and C++ in C implementiert.
Diese lässt sich dann leicht in eine kompatible Version Wrappen:
BOOL Rfc2898DeriveBytes (char *pszPassword, BYTE *pbSalt, DWORD cbSalt, BYTE *pbOut, DWORD cbOut)
{
return SpcPBKDF2 (pszPassword, lstrlen(pszPassword), pbSalt, cbSalt, 1000, pbOut, cbOut);
}
Der dort angegebene Democode hat allerdings einen kleinen Fehler:
In PKCS5FinalPRF steht
while (dwIteration < dwIterations)
wobei dwIteration nie inkrementiert wird, richtig ist also
while (dwIteration++ < dwIterations)
Sonst funktioniert der Code allerdings ausgezeichnet.
Ich habe das Ganze in ein C-Modul zum download online gestellt:
pbkdf2.c
Nun gilt es noch, den DESCryptoServiceProvider zu implementieren.
Dies geht im Prinzip recht einfach mit der Win32 Cryptoapi mit CryptImportKey und CryptDecrypt. Ich habe eine einfache Implementierung ohne Errorchecking hier ebenfalls mal Online gestellt:
des.c
Damit lässt sich das Ganze dann auch in einer vernünftigen Programmiersprache abbilden :)
Comments
In the complicated world we live in, it’s good to find simple slotuinos.
Trackbacks