20231115
This commit is contained in:
@@ -30,28 +30,37 @@ public sealed class StringEncryptor: IEncryptor
|
||||
/// </summary>
|
||||
/// <param name="value">Строка, которая должна быть зашифрована</param>
|
||||
/// <param name="salt">Ключ</param>
|
||||
/// <param name="valueIfFail">Значение, если неудача</param>
|
||||
/// <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 = "")
|
||||
{
|
||||
// Создаю криптограф
|
||||
using Aes aes = Aes.Create();
|
||||
try
|
||||
{
|
||||
// Создаю криптограф
|
||||
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))
|
||||
// Пишу данные в него
|
||||
cs.Write(Encoding.UTF8.GetBytes(value));
|
||||
// Создаю шифрованный поток
|
||||
using (CryptoStream cs = new(ms, aes.CreateEncryptor(), CryptoStreamMode.Write, true))
|
||||
// Пишу данные в него
|
||||
cs.Write(Encoding.UTF8.GetBytes(value));
|
||||
|
||||
// Возвращаю зашифрованный текст
|
||||
return Convert.ToBase64String(ms.ToArray());
|
||||
// Возвращаю зашифрованный текст
|
||||
return Convert.ToBase64String(ms.ToArray());
|
||||
}
|
||||
catch (FormatException)
|
||||
{
|
||||
return valueIfFail;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -59,69 +68,90 @@ public sealed class StringEncryptor: IEncryptor
|
||||
/// </summary>
|
||||
/// <param name="encryptedValue">Строка, которая должна быть дешифрована</param>
|
||||
/// <param name="salt">Ключ</param>
|
||||
/// <param name="valueIfFail">Значение, если неудача</param>
|
||||
/// <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 = "")
|
||||
{
|
||||
// Открываю поток в памяти
|
||||
using MemoryStream ms = new(Convert.FromBase64String(encryptedValue));
|
||||
try
|
||||
{
|
||||
// Открываю поток в памяти
|
||||
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>
|
||||
/// Декодирует зашифрованную строку в HTML-пригодный формат
|
||||
/// </summary>
|
||||
/// <param name="text">Зашифрованная строка</param>
|
||||
/// <param name="valueIfFail">Значение, если неудача</param>
|
||||
/// <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>
|
||||
/// Раскодирует из декодированной строки в HTML-пригодный формат
|
||||
/// </summary>
|
||||
/// <param name="text">Декодированная строка</param>
|
||||
/// <param name="valueIfFail">Значение, если неудача</param>
|
||||
/// <returns>Этот метод возвращает шифрованную строку <paramref name="text"/></returns>
|
||||
public string Base64UrlDecode (string text)
|
||||
/// <exception cref="FormatException">Ошибка неверного формата</exception>
|
||||
public string Base64UrlDecode (string text, string valueIfFail = "")
|
||||
{
|
||||
// Первоначальная замена
|
||||
string result = text.Replace('_', '/').Replace('-', '+');
|
||||
|
||||
// Заменяю значения
|
||||
switch (result.Length % 4)
|
||||
try
|
||||
{
|
||||
case 2:
|
||||
result += "==";
|
||||
break;
|
||||
case 3:
|
||||
result += "=";
|
||||
break;
|
||||
}
|
||||
// Первоначальная замена
|
||||
string result = text.Replace('_', '/').Replace('-', '+');
|
||||
|
||||
// Возвращаю результат
|
||||
return result;
|
||||
// Заменяю значения
|
||||
switch (result.Length % 4)
|
||||
{
|
||||
case 2:
|
||||
result += "==";
|
||||
break;
|
||||
case 3:
|
||||
result += "=";
|
||||
break;
|
||||
}
|
||||
|
||||
// Возвращаю результат
|
||||
return result;
|
||||
}
|
||||
catch (FormatException)
|
||||
{
|
||||
return valueIfFail;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user