示例#1
0
        /// <summary>
        /// Computes a derived key.
        /// </summary>
        /// <param name="hmacAlgorithm">
        /// </param>
        /// <param name="salt">
        ///     The salt.
        ///     A unique salt means a unique derived key, even if the original key is identical.
        /// </param>
        /// <param name="iterations">The number of iterations to apply.</param>
        /// <param name="derivedKeyLength">The desired length of the derived key.</param>
        /// <returns>The derived key.</returns>
        public static byte[] ComputeDerivedKey(KeyedHashAlgorithm hmacAlgorithm, byte[] salt, int iterations,
                                               int derivedKeyLength)
        {
            NBitcoin.Crypto.Internal.Check.Range("derivedKeyLength", derivedKeyLength, 0, int.MaxValue);

            using (Pbkdf2 kdf = new Pbkdf2(hmacAlgorithm, salt, iterations))
            {
                return(kdf.Read(derivedKeyLength));
            }
        }
示例#2
0
        /// <summary>
        /// Computes a derived key.
        /// </summary>
        /// <param name="hmacAlgorithm">
        ///     The HMAC algorithm to use, for example <see cref="HMACSHA256"/>.
        ///     Make sure to set <see cref="KeyedHashAlgorithm.Key"/>.
        /// </param>
        /// <param name="salt">
        ///     The salt.
        ///     A unique salt means a unique derived key, even if the original key is identical.
        /// </param>
        /// <param name="iterations">The number of iterations to apply.</param>
        /// <param name="derivedKeyLength">The desired length of the derived key.</param>
        /// <returns>The derived key.</returns>
        public static byte[] ComputeDerivedKey(KeyedHashAlgorithm hmacAlgorithm, byte[] salt, int iterations,
                                               int derivedKeyLength)
        {
            Check.Range("derivedKeyLength", derivedKeyLength, 0, int.MaxValue);

            using (Pbkdf2 kdf = new Pbkdf2(hmacAlgorithm, salt, iterations))
            {
                return kdf.Read(derivedKeyLength);
            }
        }
示例#3
0
 /// <summary>
 /// Creates a derived key stream from which a derived key can be read.
 /// </summary>
 /// <param name="key">The key to derive from.</param>
 /// <param name="salt">
 ///     The salt.
 ///     A unique salt means a unique scrypt stream, even if the original key is identical.
 /// </param>
 /// <param name="cost">
 ///     The cost parameter, typically a fairly large number such as 262144.
 ///     Memory usage and CPU time scale approximately linearly with this parameter.
 /// </param>
 /// <param name="blockSize">
 ///     The mixing block size, typically 8.
 ///     Memory usage and CPU time scale approximately linearly with this parameter.
 /// </param>
 /// <param name="parallel">
 ///     The level of parallelism, typically 1.
 ///     CPU time scales approximately linearly with this parameter.
 /// </param>
 /// <param name="maxThreads">
 ///     The maximum number of threads to spawn to derive the key.
 ///     This is limited by the <paramref name="parallel"/> value.
 ///     <c>null</c> will use as many threads as possible.
 /// </param>
 /// <returns>The derived key stream.</returns>
 public static Pbkdf2 GetStream(byte[] key, byte[] salt,
                                int cost, int blockSize, int parallel, int? maxThreads)
 {
     byte[] B = GetEffectivePbkdf2Salt(key, salt, cost, blockSize, parallel, maxThreads);
     Pbkdf2 kdf = new Pbkdf2(new HMACSHA256(key), B, 1);
     Security.Clear(B); return kdf;
 }