Derives a key of any length from a password using the PBKDF2 algorithm from PKCS#5 v2.1 with the salt and derived key encoded in hexadecimal.
Public Declare Function PBE_Kdf2Hex Lib "diCryptoSys.dll"
(ByVal strOutput As String, ByVal nMaxChars As Long, ByVal nKeyBytes As Long,
ByVal strPwd As String, ByVal strSaltHex As String,
ByVal nCount As Long, ByVal nOptions As Long) As Long
nRet = PBE_Kdf2Hex(strDerivedKey, nMaxChars, nKeyLen, strPassword, strSaltHex, nCount, nOptions)
long __stdcall PBE_Kdf2Hex(char *szOutput, long nMaxChars, long dkBytes, const char *szPwd, const char *szSaltHex, long nCount, long nOptions);
If successful, the return value is 0; otherwise it returns a non-zero error code.
Public Function pbeKdf2Hex
(dkBytes As Long, strPwd As String, strSaltHex As String, nCount As Long, nOptions As Long) As String
Pbe.Kdf2 Method (Int32, String, String, Int32)
pbe.DKF2FromString
Public Function DKF2FromString(ByVal nBytes As Long, ByVal strPassword As String, ByVal strSaltHex As String, nCount As Long) As String
See pbe.DKF2FromString
.
The output string szOutput should be pre-dimensioned to be at least double the
required key length in bytes. (Hint: specify nMaxChars as Len(strOutput)
).
The seed szSaltHex is specified in hex format and can be any even number of hex digits in length.
The password szPassword is normal text, not hexadecimal.
Dim strDerivedKey As String Dim nKeyLen As Long Dim strPassword As String Dim strSaltHex As String Dim nCount As Long Dim nRet As Long strPassword = "password" ' NB normal text, not hex ' Set 8-byte salt = 78 57 8E 5A 5D 63 CB 06 strSaltHex = "78578E5A5D63CB06" ' Iteration count is 2048 nCount = 2048 ' Pre-dimension output string for derived key to ' required length of 24 bytes i.e. 48 hex chars ' (Don't forget to do this) nKeyLen = 24 strDerivedKey = String(2 * nKeyLen, " ") ' Derive PBKDF2 key using function from CryptoSys API nRet = PBE_Kdf2Hex(strDerivedKey, Len(strDerivedKey), nKeyLen, _ strPassword, strSaltHex, nCount, 0) ' Check against test vector Debug.Print "Derived key = " & strDerivedKey Debug.Print "Correct key = BFDE6BE94DF7E11DD409BCE20A0255EC327CB936FFE93643"
This should result in output as follows:
Derived key = BFDE6BE94DF7E11DD409BCE20A0255EC327CB936FFE93643 Correct key = BFDE6BE94DF7E11DD409BCE20A0255EC327CB936FFE93643
Dim strDerivedKey As String
strDerivedKey = pbeKdf2Hex(24, "password", "78578E5A5D63CB06", 2048, 0)
Debug.Print "Derived key = " & strDerivedKey
Debug.Print "OK = " & "BFDE6BE94DF7E11DD409BCE20A0255EC327CB936FFE93643"