/// <summary> /// Decrypts encrypted private key file data. /// </summary> /// <param name="cipherInfo">The cipher info.</param> /// <param name="cipherData">Encrypted data.</param> /// <param name="passPhrase">Decryption pass phrase.</param> /// <param name="binarySalt">Decryption binary salt.</param> /// <param name="bytesOfSaltToPassword">The amount of bytes of the binary salt that are appended to the pass phrase before hashing it.</param> /// <returns></returns> /// <exception cref="ArgumentNullException"><paramref name="cipherInfo"/>, <paramref name="cipherData"/>, <paramref name="passPhrase"/> or <paramref name="binarySalt"/> is null.</exception> private static byte[] DecryptKey(CipherInfo cipherInfo, byte[] cipherData, string passPhrase, byte[] binarySalt, int bytesOfSaltToPassword) { if (cipherInfo == null) { throw new ArgumentNullException("cipherInfo"); } if (cipherData == null) { throw new ArgumentNullException("cipherData"); } if (binarySalt == null) { throw new ArgumentNullException("binarySalt"); } List <byte> cipherKey = new List <byte>(); var md5 = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Md5); { var passwordBytes = Encoding.UTF8.GetBytes(passPhrase); var initVector = passwordBytes.Concat(binarySalt.Take(bytesOfSaltToPassword)); byte[] buffer; CryptographicBuffer.CopyToByteArray(md5.HashData(CryptographicBuffer.CreateFromByteArray(initVector.ToArray())), out buffer); var hash = buffer.AsEnumerable(); cipherKey.AddRange(hash); while (cipherKey.Count < cipherInfo.KeySize / 8) { hash = hash.Concat(initVector); CryptographicBuffer.CopyToByteArray(md5.HashData(CryptographicBuffer.CreateFromByteArray(hash.ToArray())), out buffer); hash = buffer.AsEnumerable(); cipherKey.AddRange(hash); } } var cipher = cipherInfo.Cipher(cipherKey.ToArray(), binarySalt); return(cipher.Decrypt(cipherData)); }
/// <summary> /// Decrypts encrypted private key file data. /// </summary> /// <param name="cipherInfo">The cipher info.</param> /// <param name="cipherData">Encrypted data.</param> /// <param name="passPhrase">Decryption pass phrase.</param> /// <param name="binarySalt">Decryption binary salt.</param> /// <returns>Decrypted byte array.</returns> /// <exception cref="System.ArgumentNullException">cipherInfo</exception> /// <exception cref="ArgumentNullException"><paramref name="cipherInfo" />, <paramref name="cipherData" />, <paramref name="passPhrase" /> or <paramref name="binarySalt" /> is null.</exception> private static byte[] DecryptKey(CipherInfo cipherInfo, byte[] cipherData, string passPhrase, byte[] binarySalt) { if (cipherInfo == null) { throw new ArgumentNullException("cipherInfo"); } if (cipherData == null) { throw new ArgumentNullException("cipherData"); } if (binarySalt == null) { throw new ArgumentNullException("binarySalt"); } List <byte> cipherKey = new List <byte>(); using (var md5 = new MD5Hash()) { var passwordBytes = Encoding.UTF8.GetBytes(passPhrase); // Use 8 bytes binary salkt var initVector = passwordBytes.Concat(binarySalt.Take(8)); var hash = md5.ComputeHash(initVector.ToArray()).AsEnumerable(); cipherKey.AddRange(hash); while (cipherKey.Count < cipherInfo.KeySize / 8) { hash = hash.Concat(initVector); hash = md5.ComputeHash(hash.ToArray()); cipherKey.AddRange(hash); } } var cipher = cipherInfo.Cipher(cipherKey.ToArray(), binarySalt); return(cipher.Decrypt(cipherData)); }