C # PasswordDeriveBytes: кажется, что соль не имеет значения - PullRequest
0 голосов
/ 09 ноября 2018

наверное я что-то не так понял. Следующий код создает два одинаковых ключа CryptDeriveKey с двумя разными солями.

То есть результат консоли:

соль1: 21 3e 18 a3 9a 8b 5f

-> Ключ да 89 ea 3d 91 08 20 98 20 e9 dc 45 d5 97 10 7f 8f 4f 52 15 26 68 ef 83

соль2: 9e дБ 4c 2b 49 b4 24

-> Ключ да 89 ea 3d 91 08 20 98 20 e9 dc 45 d5 97 10 7f 8f 4f 52 15 26 68 ef 83

В чем моя ошибка?

using System;
using System.Security.Cryptography;

namespace PasswordDeriveBytes_SaltDoesntMatter
{
    class Program
    {
        // for usage in CreateAndPrintKeyAndSalt
        private static readonly string password = "secret123";
        private static readonly TripleDESCryptoServiceProvider cryptoServiceProvider = new TripleDESCryptoServiceProvider();

        static void Main(string[] args)
        {
            byte[] salt1 = new byte[] { 33, 62, 24, 163, 154, 139, 95 };
            byte[] salt2 = new byte[] { 158, 219, 76, 43, 73, 180, 36 };

            // a TripleDESCryptoServiceProvider-instance for getting an IV

            CreateAndPrintKeyAndSalt("salt1", salt1);
            CreateAndPrintKeyAndSalt("salt2", salt2);
            Console.ReadKey();

        }

        /// <summary>
        /// print the salt and the CryptDeriveKey based on this salt
        /// !! uses the const password and cryptoServiceProvider
        /// </summary>
        /// <param name="saltName">name of the used salt</param>
        /// <param name="salt">the used salt</param>
        /// <param name="cryptoServiceProvider"></param>
        private static void CreateAndPrintKeyAndSalt(string saltName, byte[] salt)
        {
            PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, salt);
            byte[] aKey = pdb.CryptDeriveKey("TripleDES", "SHA1", 192, cryptoServiceProvider.IV);
            Console.WriteLine($"{saltName}: {ByteArrayInHexText(salt)} --> Key {ByteArrayInHexText(aKey)}");
        }    

        /// <summary>
        /// returns a Textstring of each byte in arr in hex-formatting separated by space
        /// </summary>
        /// <param name="arr">the array</param>
        /// <returns>the formatted string</returns>
        public static string ByteArrayInHexText(byte[] arr)
        {
            string s = "";
            foreach (var item in arr)
            {
                s += $" {item:x2}";
            }
            return s.Substring(1);
        }

    }
}

1 Ответ

0 голосов
/ 09 ноября 2018

Согласно этому блогу MSDN:

При вызове CryptDeriveKey, количество соли и итераций, которые установлены на объекте PasswordDeriveBytes не используются, поэтому даже имея различные соли и число итераций будут давать один и тот же ключ что остальные входы также одинаковы.

...