WinAbility Encryption Driver (Driver) implements the PBKDF2  (Password-Based Key Derivation Function) algorithm. The specific steps involved in deriving the encryption key from the user's password are as follows:

Calculating an intermediate hash value of the password

When the user enters a password, the application obtains its plain-text representation in the UNICODE format. Such binary representation of the user's password is then used as the input to two hash functions: SHA-512 and Whirlpool, each producing an independent 512-bit digest of the user's password. (The two independent hash functions are used to avoid dependence on one specific hash function.) The two outputs from these hash functions are than XORed together, byte for byte, to produce a combined 512-bit value. Finally, the SHA-256 hash function is used to produce a 256 value from the previous 512-value. This process is repeated again 2048 times with the output of the SHA256 algorithm used in place of the user's password. The process can be represented as the following pseudo-code function:

	function CalculateIntermediateHashValue( in unicode_password, out hash_value )
		var hash1 = SHA512( unicode_password );
		var hash2 = WHIRLPOOL( unicode_password );
		var hash_value = SHA256( hash1 XOR hash2 );

		for ( i = 0; i < 2048; ++i )
			hash1 = SHA512( hash_value );
			hash2 = WHIRLPOOL( hash_value );
			hash_value = SHA256( hash1 XOR hash2 );

		return hash_value;

Generating the encryption key from the intermediate hash value of the password

The 256-bit intermediate hash value obtained in the previous step is used together with the salt value from the volume descriptor key structure as the input to the PBKDF2 algorithm, that is executed repeatedly (2048 iterations for each portion of the key material) until the required quantity of the key material is generated. For example, for the AES-128 encryption in the CBC mode, the Driver generates 256 bits of the key material, of which the first 128 bits are used as the encryption key, and the remaining 128 bits are used as the initial initialization vector.

The Driver implements the PBKDF2 using the cascade cipher of AES-256 and Twofish-256 ciphers (with the combined key length of 512 bits) in the CBC mode.

Random data generation The format of the Virtual Encrypted Disks Copyright © 2017, WinAbility® Software Corporation. All rights reserved.