/// <summary> /// </summary> /// <param name="Password"></param> /// <param name="Salt"></param> /// <param name="Iterator"></param> /// <param name="Length"></param> /// <returns></returns> public static byte[] pbkdf2(byte[] Password, byte[] Salt, int Iterator, int Length) { int hashSize = SHA1HashFunction.HashSize; byte[] data = new byte[hashSize]; byte[] sourceArray = new byte[hashSize]; int num7 = Salt.Length + 4; byte[] destinationArray = new byte[Length]; if (Length > (0x1d * hashSize)) { throw new Exception("Derived key too long."); } if (Iterator <= 0) { throw new Exception("Invalid Iterator specified."); } if (Length <= 0) { throw new Exception("Invalid Length specified."); } int num3 = ((Length - 1) / hashSize) + 1; int num4 = Length - ((num3 - 1) * hashSize); byte[] buffer3 = new byte[num7]; Array.Copy(Salt, 0, buffer3, 0, Salt.Length); for (int i = 1; i <= num3; i++) { sourceArray = new byte[hashSize]; for (int j = 1; j <= Iterator; j++) { if (j == 1) { buffer3[Salt.Length] = (byte)((i >> 0x18) & 0xff); buffer3[Salt.Length + 1] = (byte)((i >> 0x10) & 0xff); buffer3[Salt.Length + 2] = (byte)((i >> 8) & 0xff); buffer3[Salt.Length + 3] = (byte)(i & 0xff); data = CryptoEngineHMACSHA1.process(Password, buffer3, hashSize); } else { data = CryptoEngineHMACSHA1.process(Password, data, hashSize); } for (int k = 0; k < hashSize; k++) { sourceArray[k] = (byte)(sourceArray[k] ^ data[k]); } } Array.Copy(sourceArray, 0, destinationArray, (i - 1) * hashSize, (i == num3) ? num4 : hashSize); } return(destinationArray); }
public static byte[] process(byte[] secretKey, byte[] data, int length) { SHA1HashFunction sha = new SHA1HashFunction(); SHA1HashFunction sha2 = new SHA1HashFunction(); byte[] buffer = new byte[SHA1HashFunction.HashSize]; byte[] buffer2 = new byte[SHA1HashFunction.HashSize]; int arg_28_0 = SHA1HashFunction.HashSize; byte[] buffer3 = new byte[SHA1HashFunction.BlockSize]; int hashSize = secretKey.Length; if (hashSize > SHA1HashFunction.BlockSize) { SHA1HashFunction sha3 = new SHA1HashFunction(); sha3.Reset(); sha3.Input(secretKey); secretKey = sha3.Result(); hashSize = SHA1HashFunction.HashSize; } sha.Reset(); for (int num = 0; num < hashSize; num++) { buffer3[num] = (byte)(secretKey[num] ^ 54); } for (int num = hashSize; num < SHA1HashFunction.BlockSize; num++) { buffer3[num] = 54; } sha.Input(buffer3); sha.Input(data); buffer = sha.Result(); sha2.Reset(); for (int num = 0; num < hashSize; num++) { buffer3[num] = (byte)(secretKey[num] ^ 92); } for (int num = hashSize; num < SHA1HashFunction.BlockSize; num++) { buffer3[num] = 92; } sha2.Input(buffer3); sha2.Input(buffer); buffer2 = sha2.Result(); length = ((length > SHA1HashFunction.HashSize) ? SHA1HashFunction.HashSize : length); byte[] buffer4 = new byte[length]; CryptoEngineHMACSHA1.truncate(buffer2, buffer4, length); return(buffer4); }