20230904
This commit is contained in:
parent
b09af0c79f
commit
2106429d0a
@ -1,6 +1,5 @@
|
|||||||
using System.Text;
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
using gfoidl.Base64;
|
|
||||||
|
|
||||||
namespace anbs_cp.Classes.Encrypt;
|
namespace anbs_cp.Classes.Encrypt;
|
||||||
|
|
||||||
@ -10,42 +9,112 @@ namespace anbs_cp.Classes.Encrypt;
|
|||||||
public static class StringEncrypt
|
public static class StringEncrypt
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Метод для шифрования строки <paramref name="text"/>
|
/// Получение ключа из строки
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="text">Строка, которая должна быть зашифрована</param>
|
/// <param name="s">Ключ-строка</param>
|
||||||
/// <returns>Этот статический метод возвращает зашифрованную строку <paramref name="text"/></returns>
|
/// <param name="salt">Хэш-ключ</param>
|
||||||
public static string Encrypt (string text)
|
/// <returns>Ключ</returns>
|
||||||
|
private static byte[] KeyFromString (string s, byte[] salt)
|
||||||
{
|
{
|
||||||
byte[] byteText = Encoding.UTF8.GetBytes(text);
|
// Создаю хэшер
|
||||||
return Base64.Url.Encode(byteText);
|
using Rfc2898DeriveBytes hasher = new(s, salt, 1000, HashAlgorithmName.SHA256);
|
||||||
|
|
||||||
|
// Получаю ключ
|
||||||
|
return hasher.GetBytes(32);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Метод для шифрования массива строк <paramref name="bytes"/>
|
/// Метод для шифрования строки <paramref name="text"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="bytes">Массив строк</param>
|
/// <param name="text">Строка, которая должна быть зашифрована</param>
|
||||||
/// <returns>Этот статический метод возвращает зашифрованную строку из массива <paramref name="bytes"/></returns>
|
/// <param name="key">Ключ</param>
|
||||||
public static string EncryptBytes (byte[] bytes) => Base64.Url.Encode(bytes);
|
/// <returns>Этот статический метод возвращает зашифрованную строку <paramref name="text"/></returns>
|
||||||
|
public static string Encrypt (string text, string key)
|
||||||
|
{
|
||||||
|
// Создаю криптограф
|
||||||
|
using Aes aes = Aes.Create();
|
||||||
|
|
||||||
|
// Получаю ключ
|
||||||
|
aes.Key = KeyFromString(key, aes.IV);
|
||||||
|
|
||||||
|
// Открываю поток
|
||||||
|
using MemoryStream ms = new();
|
||||||
|
|
||||||
|
// Пишу данные в поток
|
||||||
|
ms.Write(aes.IV);
|
||||||
|
|
||||||
|
// Создаю шифрованный поток
|
||||||
|
using (CryptoStream cs = new(ms, aes.CreateEncryptor(), CryptoStreamMode.Write, true))
|
||||||
|
// Пишу данные в него
|
||||||
|
cs.Write(Encoding.UTF8.GetBytes(text));
|
||||||
|
|
||||||
|
// Возвращаю зашифрованный текст
|
||||||
|
return Convert.ToBase64String(ms.ToArray());
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Метод для дешифрования строки <paramref name="text"/>
|
/// Метод для дешифрования строки <paramref name="text"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="text">Строка, которая должна быть дешифрована</param>
|
/// <param name="text">Строка, которая должна быть дешифрована</param>
|
||||||
|
/// <param name="key">Ключ</param>
|
||||||
/// <returns>Этот статический метод возвращает дешифрованную строку <paramref name="text"/></returns>
|
/// <returns>Этот статический метод возвращает дешифрованную строку <paramref name="text"/></returns>
|
||||||
public static string Decrypt (string text)
|
public static string Decrypt (string text, string key)
|
||||||
{
|
{
|
||||||
string guidBase64Url = text.Replace('+', '-').Replace('/', '_').TrimEnd('=');
|
// Открываю поток в памяти
|
||||||
return Encoding.UTF8.GetString(Base64.Url.Decode(guidBase64Url));
|
using MemoryStream ms = new(Convert.FromBase64String(text));
|
||||||
|
|
||||||
|
// Задаю ключ
|
||||||
|
byte[] iv = new byte[16];
|
||||||
|
|
||||||
|
// Читаю его
|
||||||
|
_ = ms.Read(iv);
|
||||||
|
|
||||||
|
// Создаю криптограф
|
||||||
|
using Aes aes = Aes.Create();
|
||||||
|
|
||||||
|
// Получаю ключ
|
||||||
|
aes.Key = KeyFromString(key, iv);
|
||||||
|
|
||||||
|
// присваиваю ключ
|
||||||
|
aes.IV = iv;
|
||||||
|
|
||||||
|
// Создаю поток дешифратора
|
||||||
|
using CryptoStream cs = new(ms, aes.CreateDecryptor(), CryptoStreamMode.Read, true);
|
||||||
|
|
||||||
|
// Задаю поток итогового текста
|
||||||
|
using MemoryStream output = new();
|
||||||
|
|
||||||
|
// Копирую данные в выходной поток
|
||||||
|
cs.CopyTo(output);
|
||||||
|
|
||||||
|
// Вывожу расшифрованный текст
|
||||||
|
return Encoding.UTF8.GetString(output.ToArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Метод для дешифрования в массив byte
|
/// Декодирует зашифрованную строку в HTML-пригодный формат
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="text">Строка, которая должна быть дешифрована</param>
|
/// <param name="text">Зашифрованная строка</param>
|
||||||
/// <returns>Этот статический метод возвращает дешифрованный массива byte[]</returns>
|
/// <returns>Этот статический метод возвращает дешифрованную строку <paramref name="text"/></returns>
|
||||||
public static byte[] DecryptBytes (string text)
|
public static string Base64UrlEncode(string text) => text.TrimEnd('=').Replace('+', '-').Replace('/', '_');
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Раскодирует из декодированной строки в HTML-пригодный формат
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="text">Декодированная строка</param>
|
||||||
|
/// <returns>Этот статический метод возвращает шифрованную строку <paramref name="text"/></returns>
|
||||||
|
public static string Base64UrlDecode(string text)
|
||||||
{
|
{
|
||||||
string guidBase64Url = text.Replace('+', '-').Replace('/', '_').TrimEnd('=');
|
string result = text.Replace('_', '/').Replace('-', '+');
|
||||||
return Base64.Url.Decode(guidBase64Url);
|
switch (result.Length % 4)
|
||||||
|
{
|
||||||
|
case 2:
|
||||||
|
result += "==";
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
result += "=";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,12 +0,0 @@
|
|||||||
namespace anbs_cp.Interfaces;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Интерфейс ключа
|
|
||||||
/// </summary>
|
|
||||||
public interface IEncryptKey
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Ключ
|
|
||||||
/// </summary>
|
|
||||||
public byte[] Key { get; set; }
|
|
||||||
}
|
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net7.0</TargetFramework>
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
<Version>2023.827.0</Version>
|
<Version>2023.902.0</Version>
|
||||||
<Authors>Александр Бабаев</Authors>
|
<Authors>Александр Бабаев</Authors>
|
||||||
<Product>Набор компонентов ANB Software</Product>
|
<Product>Набор компонентов ANB Software</Product>
|
||||||
<Description>Библиотека полезных методов языка C#</Description>
|
<Description>Библиотека полезных методов языка C#</Description>
|
||||||
|
@ -17,10 +17,13 @@
|
|||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0432_0438_0434_0435_043E_043A_0430_0440_0442_0435/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0432_0438_0434_0435_043E_043A_0430_0440_0442_0435/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0434_0435_0441_0435_0440_0438_0430_043B_0438_0437_0430_0446_0438_044F/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0434_0435_0441_0435_0440_0438_0430_043B_0438_0437_0430_0446_0438_044F/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0434_0435_0448_0438_0444_0440_043E_0432_0430_043D_0438_044F/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0434_0435_0448_0438_0444_0440_043E_0432_0430_043D_0438_044F/@EntryIndexedValue">True</s:Boolean>
|
||||||
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0434_0435_0448_0438_0444_0440_043E_0432_0447_0438_043A/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0438_043C_0451_043D/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0438_043C_0451_043D/@EntryIndexedValue">True</s:Boolean>
|
||||||
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=_043A_0440_0438_043F_0442_043E_0433_0440_0430_0444/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=_043F_0443_0442_0451_043C/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=_043F_0443_0442_0451_043C/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_0435_0440_0438_0430_043B_0438_0437_0430_0446_0438_044F/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_0435_0440_0438_0430_043B_0438_0437_0430_0446_0438_044F/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_0447_0451_0442/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_0447_0451_0442/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_0447_0451_0442_0447_0438_043A/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_0447_0451_0442_0447_0438_043A/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0445_044D_0448_0430/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0445_044D_0448_0430/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0445_044D_0448_0435_043C/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0445_044D_0448_0435_043C/@EntryIndexedValue">True</s:Boolean>
|
||||||
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0445_044D_0448_0435_0440/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
Loading…
x
Reference in New Issue
Block a user