This commit is contained in:
Alexander 2023-11-15 12:32:37 +03:00
parent f61d2c2dbc
commit fa7bb78ed4
6 changed files with 127 additions and 75 deletions

View File

@ -30,28 +30,37 @@ public sealed class StringEncryptor: IEncryptor
/// </summary> /// </summary>
/// <param name="value">Строка, которая должна быть зашифрована</param> /// <param name="value">Строка, которая должна быть зашифрована</param>
/// <param name="salt">Ключ</param> /// <param name="salt">Ключ</param>
/// <param name="valueIfFail">Значение, если неудача</param>
/// <returns>Этот метод возвращает зашифрованную строку <paramref name="value"/></returns> /// <returns>Этот метод возвращает зашифрованную строку <paramref name="value"/></returns>
public string Encrypt (string value, string salt) /// <exception cref="FormatException">Ошибка неверного формата</exception>
public string Encrypt (string value, string salt, string valueIfFail = "")
{ {
// Создаю криптограф try
using Aes aes = Aes.Create(); {
// Создаю криптограф
using Aes aes = Aes.Create();
// Получаю ключ // Получаю ключ
aes.Key = KeyFromString(salt, aes.IV); aes.Key = KeyFromString(salt, aes.IV);
// Открываю поток // Открываю поток
using MemoryStream ms = new(); using MemoryStream ms = new();
// Пишу данные в поток // Пишу данные в поток
ms.Write(aes.IV); ms.Write(aes.IV);
// Создаю шифрованный поток // Создаю шифрованный поток
using (CryptoStream cs = new(ms, aes.CreateEncryptor(), CryptoStreamMode.Write, true)) using (CryptoStream cs = new(ms, aes.CreateEncryptor(), CryptoStreamMode.Write, true))
// Пишу данные в него // Пишу данные в него
cs.Write(Encoding.UTF8.GetBytes(value)); cs.Write(Encoding.UTF8.GetBytes(value));
// Возвращаю зашифрованный текст // Возвращаю зашифрованный текст
return Convert.ToBase64String(ms.ToArray()); return Convert.ToBase64String(ms.ToArray());
}
catch (FormatException)
{
return valueIfFail;
}
} }
/// <summary> /// <summary>
@ -59,69 +68,90 @@ public sealed class StringEncryptor: IEncryptor
/// </summary> /// </summary>
/// <param name="encryptedValue">Строка, которая должна быть дешифрована</param> /// <param name="encryptedValue">Строка, которая должна быть дешифрована</param>
/// <param name="salt">Ключ</param> /// <param name="salt">Ключ</param>
/// <param name="valueIfFail">Значение, если неудача</param>
/// <returns>Этот метод возвращает дешифрованную строку <paramref name="encryptedValue"/></returns> /// <returns>Этот метод возвращает дешифрованную строку <paramref name="encryptedValue"/></returns>
public string Decrypt (string encryptedValue, string salt) /// <exception cref="FormatException">Ошибка неверного формата</exception>
public string Decrypt (string encryptedValue, string salt, string valueIfFail = "")
{ {
// Открываю поток в памяти try
using MemoryStream ms = new(Convert.FromBase64String(encryptedValue)); {
// Открываю поток в памяти
using MemoryStream ms = new(Convert.FromBase64String(encryptedValue));
// Задаю ключ // Задаю ключ
byte[] iv = new byte[16]; byte[] iv = new byte[16];
// Читаю его // Читаю его
_ = ms.Read(iv); _ = ms.Read(iv);
// Создаю криптограф // Создаю криптограф
using Aes aes = Aes.Create(); using Aes aes = Aes.Create();
// Получаю ключ // Получаю ключ
aes.Key = KeyFromString(salt, iv); aes.Key = KeyFromString(salt, iv);
// присваиваю ключ // присваиваю ключ
aes.IV = iv; aes.IV = iv;
// Создаю поток дешифратора // Создаю поток дешифратора
using CryptoStream cs = new(ms, aes.CreateDecryptor(), CryptoStreamMode.Read, true); using CryptoStream cs = new(ms, aes.CreateDecryptor(), CryptoStreamMode.Read, true);
// Задаю поток итогового текста // Задаю поток итогового текста
using MemoryStream output = new(); using MemoryStream output = new();
// Копирую данные в выходной поток // Копирую данные в выходной поток
cs.CopyTo(output); cs.CopyTo(output);
// Вывожу расшифрованный текст // Вывожу расшифрованный текст
return Encoding.UTF8.GetString(output.ToArray()); return Encoding.UTF8.GetString(output.ToArray());
}
catch (FormatException)
{
return valueIfFail;
}
} }
/// <summary> /// <summary>
/// Декодирует зашифрованную строку в HTML-пригодный формат /// Декодирует зашифрованную строку в HTML-пригодный формат
/// </summary> /// </summary>
/// <param name="text">Зашифрованная строка</param> /// <param name="text">Зашифрованная строка</param>
/// <param name="valueIfFail">Значение, если неудача</param>
/// <returns>Этот метод возвращает дешифрованную строку <paramref name="text"/></returns> /// <returns>Этот метод возвращает дешифрованную строку <paramref name="text"/></returns>
public string Base64UrlEncode (string text) => text.TrimEnd('=').Replace('+', '-').Replace('/', '_'); /// <exception cref="FormatException">Ошибка неверного формата</exception>
public string Base64UrlEncode(string text, string valueIfFail = "") =>
text.TrimEnd('=').Replace('+', '-').Replace('/', '_');
/// <summary> /// <summary>
/// Раскодирует из декодированной строки в HTML-пригодный формат /// Раскодирует из декодированной строки в HTML-пригодный формат
/// </summary> /// </summary>
/// <param name="text">Декодированная строка</param> /// <param name="text">Декодированная строка</param>
/// <param name="valueIfFail">Значение, если неудача</param>
/// <returns>Этот метод возвращает шифрованную строку <paramref name="text"/></returns> /// <returns>Этот метод возвращает шифрованную строку <paramref name="text"/></returns>
public string Base64UrlDecode (string text) /// <exception cref="FormatException">Ошибка неверного формата</exception>
public string Base64UrlDecode (string text, string valueIfFail = "")
{ {
// Первоначальная замена try
string result = text.Replace('_', '/').Replace('-', '+');
// Заменяю значения
switch (result.Length % 4)
{ {
case 2: // Первоначальная замена
result += "=="; string result = text.Replace('_', '/').Replace('-', '+');
break;
case 3:
result += "=";
break;
}
// Возвращаю результат // Заменяю значения
return result; switch (result.Length % 4)
{
case 2:
result += "==";
break;
case 3:
result += "=";
break;
}
// Возвращаю результат
return result;
}
catch (FormatException)
{
return valueIfFail;
}
} }
} }

View File

@ -10,28 +10,32 @@ public interface IEncryptor
/// </summary> /// </summary>
/// <param name="value">Строка, которая должна быть зашифрована</param> /// <param name="value">Строка, которая должна быть зашифрована</param>
/// <param name="salt">Ключ шифрования</param> /// <param name="salt">Ключ шифрования</param>
/// <param name="valueIfFail">Значение, если неудача</param>
/// <returns>Этот метод возвращает зашифрованную строку <paramref name="value"/></returns> /// <returns>Этот метод возвращает зашифрованную строку <paramref name="value"/></returns>
string Encrypt (string value, string salt); string Encrypt (string value, string salt, string valueIfFail);
/// <summary> /// <summary>
/// Метод для дешифрования строки <paramref name="encryptedValue"/> /// Метод для дешифрования строки <paramref name="encryptedValue"/>
/// </summary> /// </summary>
/// <param name="encryptedValue">Строка, которая должна быть дешифрована</param> /// <param name="encryptedValue">Строка, которая должна быть дешифрована</param>
/// <param name="salt">Ключ шифрования</param> /// <param name="salt">Ключ шифрования</param>
/// <param name="valueIfFail">Значение, если неудача</param>
/// <returns>Этот метод возвращает дешифрованную строку <paramref name="encryptedValue"/></returns> /// <returns>Этот метод возвращает дешифрованную строку <paramref name="encryptedValue"/></returns>
string Decrypt (string encryptedValue, string salt); string Decrypt (string encryptedValue, string salt, string valueIfFail);
/// <summary> /// <summary>
/// Декодирует зашифрованную строку в HTML-пригодный формат /// Декодирует зашифрованную строку в HTML-пригодный формат
/// </summary> /// </summary>
/// <param name="text">Зашифрованная строка</param> /// <param name="text">Зашифрованная строка</param>
/// <param name="valueIfFail">Значение, если неудача</param>
/// <returns>Этот метод возвращает дешифрованную строку <paramref name="text"/></returns> /// <returns>Этот метод возвращает дешифрованную строку <paramref name="text"/></returns>
string Base64UrlEncode (string text); string Base64UrlEncode (string text, string valueIfFail);
/// <summary> /// <summary>
/// Раскодирует из декодированной строки в HTML-пригодный формат /// Раскодирует из декодированной строки в HTML-пригодный формат
/// </summary> /// </summary>
/// <param name="text">Декодированная строка</param> /// <param name="text">Декодированная строка</param>
/// <param name="valueIfFail">Значение, если неудача</param>
/// <returns>Этот метод возвращает шифрованную строку <paramref name="text"/></returns> /// <returns>Этот метод возвращает шифрованную строку <paramref name="text"/></returns>
string Base64UrlDecode (string text); string Base64UrlDecode (string text, string valueIfFail);
} }

View File

@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<Version>2023.1114.0</Version> <Version>2023.1115.0</Version>
<Authors>Александр Бабаев</Authors> <Authors>Александр Бабаев</Authors>
<Product>Набор компонентов ANB Software</Product> <Product>Набор компонентов ANB Software</Product>
<Description>Библиотека полезных методов языка C#</Description> <Description>Библиотека полезных методов языка C#</Description>

View File

@ -16,17 +16,25 @@ public sealed class PasswordEncrypt: IEncryptor
/// </summary> /// </summary>
/// <param name="password">Пароль</param> /// <param name="password">Пароль</param>
/// <param name="salt">Хэш-код пароля</param> /// <param name="salt">Хэш-код пароля</param>
/// <param name="valueIfFail">Значение, если неудача</param>
/// <returns>Зашифрованный пароль</returns> /// <returns>Зашифрованный пароль</returns>
public string Encrypt (string password, string salt) public string Encrypt (string password, string salt, string valueIfFail)
{ {
// Получаю byte-массив из хэш-кода пароля try
byte[] saltBytes = Encoding.UTF8.GetBytes(salt); {
// Получаю byte-массив из хэш-кода пароля
byte[] saltBytes = Encoding.UTF8.GetBytes(salt);
// Шифрую пароль // Шифрую пароль
byte[] encryptedPassword = KeyDerivation.Pbkdf2(password, saltBytes, KeyDerivationPrf.HMACSHA512, 5000, 64); byte[] encryptedPassword = KeyDerivation.Pbkdf2(password, saltBytes, KeyDerivationPrf.HMACSHA512, 5000, 64);
// Возвращаю зашифрованный пароль // Возвращаю зашифрованный пароль
return Convert.ToBase64String(encryptedPassword); return Convert.ToBase64String(encryptedPassword);
}
catch (FormatException)
{
return valueIfFail;
}
} }
/// <summary> /// <summary>
@ -35,22 +43,28 @@ public sealed class PasswordEncrypt: IEncryptor
/// <param name="encryptedValue">НЕ РАБОТАЕТ</param> /// <param name="encryptedValue">НЕ РАБОТАЕТ</param>
/// <param name="salt">НЕ РАБОТАЕТ</param> /// <param name="salt">НЕ РАБОТАЕТ</param>
/// <returns>НЕ РАБОТАЕТ</returns> /// <returns>НЕ РАБОТАЕТ</returns>
/// <param name="valueIfFail">Значение, если неудача</param>
/// <exception cref="NotImplementedException">Этот метод не требует реализации в этом классе!</exception> /// <exception cref="NotImplementedException">Этот метод не требует реализации в этом классе!</exception>
public string Decrypt (string encryptedValue, string salt) => throw new NotImplementedException("Этот метод не требует реализации в этом классе!"); public string Decrypt (string encryptedValue, string salt, string valueIfFail) =>
throw new NotImplementedException("Этот метод не требует реализации в этом классе!");
/// <summary>
/// Этот метод не требует реализации в этом классе!
/// </summary>
/// <param name="text">НЕ РАБОТАЕТ</param>
/// <param name="valueIfFail">Значение, если неудача</param>
/// <returns>НЕ РАБОТАЕТ</returns>
/// <exception cref="NotImplementedException">Этот метод не требует реализации в этом классе!</exception>
public string Base64UrlEncode (string text, string valueIfFail) =>
throw new NotImplementedException("Этот метод не требует реализации в этом классе!");
/// <summary> /// <summary>
/// Этот метод не требует реализации в этом классе! /// Этот метод не требует реализации в этом классе!
/// </summary> /// </summary>
/// <param name="text">НЕ РАБОТАЕТ</param> /// <param name="text">НЕ РАБОТАЕТ</param>
/// <returns>НЕ РАБОТАЕТ</returns> /// <returns>НЕ РАБОТАЕТ</returns>
/// <param name="valueIfFail">Значение, если неудача</param>
/// <exception cref="NotImplementedException">Этот метод не требует реализации в этом классе!</exception> /// <exception cref="NotImplementedException">Этот метод не требует реализации в этом классе!</exception>
public string Base64UrlEncode (string text) => throw new NotImplementedException("Этот метод не требует реализации в этом классе!"); public string Base64UrlDecode (string text, string valueIfFail) =>
throw new NotImplementedException("Этот метод не требует реализации в этом классе!");
/// <summary>
/// Этот метод не требует реализации в этом классе!
/// </summary>
/// <param name="text">НЕ РАБОТАЕТ</param>
/// <returns>НЕ РАБОТАЕТ</returns>
/// <exception cref="NotImplementedException">Этот метод не требует реализации в этом классе!</exception>
public string Base64UrlDecode (string text) => throw new NotImplementedException("Этот метод не требует реализации в этом классе!");
} }

View File

@ -6,7 +6,7 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild> <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<PackageId>ANBSoftware.ComponentsPackForNet</PackageId> <PackageId>ANBSoftware.ComponentsPackForNet</PackageId>
<Version>2023.11.14.0</Version> <Version>2023.11.15.0</Version>
<Authors>Александр Бабаев</Authors> <Authors>Александр Бабаев</Authors>
<Product>Набор компонентов ANB Software для ASP.NET Core</Product> <Product>Набор компонентов ANB Software для ASP.NET Core</Product>
<Description>Библиотека полезных методов языка C# для ASP.NET Core</Description> <Description>Библиотека полезных методов языка C# для ASP.NET Core</Description>

View File

@ -37,6 +37,10 @@ Global
{80E1FEA9-EEDA-4411-8EBA-11991432E98E}.Debug|Any CPU.Build.0 = Debug|Any CPU {80E1FEA9-EEDA-4411-8EBA-11991432E98E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{80E1FEA9-EEDA-4411-8EBA-11991432E98E}.Release|Any CPU.ActiveCfg = Release|Any CPU {80E1FEA9-EEDA-4411-8EBA-11991432E98E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{80E1FEA9-EEDA-4411-8EBA-11991432E98E}.Release|Any CPU.Build.0 = Release|Any CPU {80E1FEA9-EEDA-4411-8EBA-11991432E98E}.Release|Any CPU.Build.0 = Release|Any CPU
{3796862F-F181-4A27-92D8-8BF13C4FD711}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3796862F-F181-4A27-92D8-8BF13C4FD711}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3796862F-F181-4A27-92D8-8BF13C4FD711}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3796862F-F181-4A27-92D8-8BF13C4FD711}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE