using System;
using System.Text;
using System.Security.Cryptography;
public class CsharpHashAlgorithm
{
public static string ComputeHash(string plainText,
string hashAlgorithm,
byte[] saltBytes)
{
// Если соль не указана, генерируйте ее на лету.
if (saltBytes == null)
{
// Определите минимальный и максимальный размеры соли.
int minSaltSize = 4;
int maxSaltSize = 8;
// Создать случайное число для размера соли.
Random random = new Random();
int saltSize = random.Next(minSaltSize, maxSaltSize);
// Выделите массив байтов, который будет содержать соль.
saltBytes = new byte[saltSize];
// Инициализируйте генератор случайных чисел.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
// Заполните соль криптографически сильными значениями байт.
rng.GetNonZeroBytes(saltBytes);
}
// Преобразование обычного текста в массив байтов.
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
// Выделите массив, который будет содержать обычный текст и соль.
byte[] plainTextWithSaltBytes =
new byte[plainTextBytes.Length + saltBytes.Length];
// Копирование байтов обычного текста в результирующий массив.
for (int i = 0; i < plainTextBytes.Length; i++)
plainTextWithSaltBytes[i] = plainTextBytes[i];
// Добавление байтов соли к полученному массиву.
for (int i = 0; i < saltBytes.Length; i++)
plainTextWithSaltBytes[plainTextBytes.Length + i] = saltBytes[i];
HashAlgorithm hash;
// Убедитесь, что указано имя алгоритма хэширования.
if (hashAlgorithm == null)
hashAlgorithm = "";
// Инициализируйте соответствующий класс алгоритма хэширования.
switch (hashAlgorithm.ToUpper())
{
case "SHA1":
hash = new SHA1Managed();
break;
case "SHA256":
hash = new SHA256Managed();
break;
case "SHA384":
hash = new SHA384Managed();
break;
case "SHA512":
hash = new SHA512Managed();
break;
default:
hash = new MD5CryptoServiceProvider();
break;
}
// Вычислите хэш-значение нашего обычного текста с добавлением соли.
byte[] hashBytes = hash.ComputeHash(plainTextWithSaltBytes);
// Создайте массив, который будет содержать хэш и исходные байты соли.
byte[] hashWithSaltBytes = new byte[hashBytes.Length +
saltBytes.Length];
// Копирование хэш-байтов в результирующий массив.
for (int i = 0; i < hashBytes.Length; i++)
hashWithSaltBytes[i] = hashBytes[i];
// Добавление байтов соли к результату.
for (int i = 0; i < saltBytes.Length; i++)
hashWithSaltBytes[hashBytes.Length + i] = saltBytes[i];
// Преобразование результата в строку в кодировке base64.
string hashValue = Convert.ToBase64String(hashWithSaltBytes);
// Возвратите результат.
return hashValue;
}
public class CsharpHashAlgo
{
static void Main(string[] args)
{
Console.WriteLine("Введите строку для хеширования:");
string plaintext = Console.ReadLine();
string passwordHashMD5 =
CsharpHashAlgorithm.ComputeHash(plaintext, "MD5", null);
string passwordHashSha1 =
CsharpHashAlgorithm.ComputeHash(plaintext, "SHA1", null);
string passwordHashSha256 =
CsharpHashAlgorithm.ComputeHash(plaintext, "SHA256", null);
string passwordHashSha384 =
CsharpHashAlgorithm.ComputeHash(plaintext, "SHA384", null);
string passwordHashSha512 =
CsharpHashAlgorithm.ComputeHash(plaintext, "SHA512", null);
Console.WriteLine("Исходная строка : {0}", plaintext);
Console.WriteLine("Значение хэш-функций :\r\n");
Console.WriteLine("MD5 : {0}", passwordHashMD5);
Console.WriteLine("SHA1 : {0}", passwordHashSha1);
Console.WriteLine("SHA256: {0}", passwordHashSha256);
Console.WriteLine("SHA384: {0}", passwordHashSha384);
Console.WriteLine("SHA512: {0}", passwordHashSha512);
Console.WriteLine("");
Console.ReadKey();
}
}
}