diff --git a/anbs_cp/Classes/Encrypt/StringEncryptor.cs b/anbs_cp/Classes/Encrypt/StringEncryptor.cs
index 4f6cce8..53cac1b 100644
--- a/anbs_cp/Classes/Encrypt/StringEncryptor.cs
+++ b/anbs_cp/Classes/Encrypt/StringEncryptor.cs
@@ -30,28 +30,37 @@ public sealed class StringEncryptor: IEncryptor
///
/// Строка, которая должна быть зашифрована
/// Ключ
+ /// Значение, если неудача
/// Этот метод возвращает зашифрованную строку
- public string Encrypt (string value, string salt)
+ /// Ошибка неверного формата
+ 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;
+ }
}
///
@@ -59,69 +68,90 @@ public sealed class StringEncryptor: IEncryptor
///
/// Строка, которая должна быть дешифрована
/// Ключ
+ /// Значение, если неудача
/// Этот метод возвращает дешифрованную строку
- public string Decrypt (string encryptedValue, string salt)
+ /// Ошибка неверного формата
+ 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;
+ }
}
///
/// Декодирует зашифрованную строку в HTML-пригодный формат
///
/// Зашифрованная строка
+ /// Значение, если неудача
/// Этот метод возвращает дешифрованную строку
- public string Base64UrlEncode (string text) => text.TrimEnd('=').Replace('+', '-').Replace('/', '_');
+ /// Ошибка неверного формата
+ public string Base64UrlEncode(string text, string valueIfFail = "") =>
+ text.TrimEnd('=').Replace('+', '-').Replace('/', '_');
///
/// Раскодирует из декодированной строки в HTML-пригодный формат
///
/// Декодированная строка
+ /// Значение, если неудача
/// Этот метод возвращает шифрованную строку
- public string Base64UrlDecode (string text)
+ /// Ошибка неверного формата
+ 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;
+ }
}
}
\ No newline at end of file
diff --git a/anbs_cp/Interfaces/IEncryptor.cs b/anbs_cp/Interfaces/IEncryptor.cs
index 4fb84ea..9b5202a 100644
--- a/anbs_cp/Interfaces/IEncryptor.cs
+++ b/anbs_cp/Interfaces/IEncryptor.cs
@@ -10,28 +10,32 @@ public interface IEncryptor
///
/// Строка, которая должна быть зашифрована
/// Ключ шифрования
+ /// Значение, если неудача
/// Этот метод возвращает зашифрованную строку
- string Encrypt (string value, string salt);
+ string Encrypt (string value, string salt, string valueIfFail);
///
/// Метод для дешифрования строки
///
/// Строка, которая должна быть дешифрована
/// Ключ шифрования
+ /// Значение, если неудача
/// Этот метод возвращает дешифрованную строку
- string Decrypt (string encryptedValue, string salt);
+ string Decrypt (string encryptedValue, string salt, string valueIfFail);
///
/// Декодирует зашифрованную строку в HTML-пригодный формат
///
/// Зашифрованная строка
+ /// Значение, если неудача
/// Этот метод возвращает дешифрованную строку
- string Base64UrlEncode (string text);
+ string Base64UrlEncode (string text, string valueIfFail);
///
/// Раскодирует из декодированной строки в HTML-пригодный формат
///
/// Декодированная строка
+ /// Значение, если неудача
/// Этот метод возвращает шифрованную строку
- string Base64UrlDecode (string text);
+ string Base64UrlDecode (string text, string valueIfFail);
}
\ No newline at end of file
diff --git a/anbs_cp/anbs_cp.csproj b/anbs_cp/anbs_cp.csproj
index a6a5e8f..adf789a 100644
--- a/anbs_cp/anbs_cp.csproj
+++ b/anbs_cp/anbs_cp.csproj
@@ -2,7 +2,7 @@
net8.0
- 2023.1114.0
+ 2023.1115.0
Александр Бабаев
Набор компонентов ANB Software
Библиотека полезных методов языка C#
diff --git a/anbs_cpfn/Classes/PasswordEncrypt.cs b/anbs_cpfn/Classes/PasswordEncrypt.cs
index a338eb2..7e7a3dc 100644
--- a/anbs_cpfn/Classes/PasswordEncrypt.cs
+++ b/anbs_cpfn/Classes/PasswordEncrypt.cs
@@ -16,17 +16,25 @@ public sealed class PasswordEncrypt: IEncryptor
///
/// Пароль
/// Хэш-код пароля
+ /// Значение, если неудача
/// Зашифрованный пароль
- public string Encrypt (string password, string salt)
+ public string Encrypt (string password, string salt, string valueIfFail)
{
- // Получаю byte-массив из хэш-кода пароля
- byte[] saltBytes = Encoding.UTF8.GetBytes(salt);
+ try
+ {
+ // Получаю 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;
+ }
}
///
@@ -35,22 +43,28 @@ public sealed class PasswordEncrypt: IEncryptor
/// НЕ РАБОТАЕТ
/// НЕ РАБОТАЕТ
/// НЕ РАБОТАЕТ
+ /// Значение, если неудача
/// Этот метод не требует реализации в этом классе!
- public string Decrypt (string encryptedValue, string salt) => throw new NotImplementedException("Этот метод не требует реализации в этом классе!");
+ public string Decrypt (string encryptedValue, string salt, string valueIfFail) =>
+ throw new NotImplementedException("Этот метод не требует реализации в этом классе!");
+
+ ///
+ /// Этот метод не требует реализации в этом классе!
+ ///
+ /// НЕ РАБОТАЕТ
+ /// Значение, если неудача
+ /// НЕ РАБОТАЕТ
+ /// Этот метод не требует реализации в этом классе!
+ public string Base64UrlEncode (string text, string valueIfFail) =>
+ throw new NotImplementedException("Этот метод не требует реализации в этом классе!");
///
/// Этот метод не требует реализации в этом классе!
///
/// НЕ РАБОТАЕТ
/// НЕ РАБОТАЕТ
+ /// Значение, если неудача
/// Этот метод не требует реализации в этом классе!
- public string Base64UrlEncode (string text) => throw new NotImplementedException("Этот метод не требует реализации в этом классе!");
-
- ///
- /// Этот метод не требует реализации в этом классе!
- ///
- /// НЕ РАБОТАЕТ
- /// НЕ РАБОТАЕТ
- /// Этот метод не требует реализации в этом классе!
- public string Base64UrlDecode (string text) => throw new NotImplementedException("Этот метод не требует реализации в этом классе!");
+ public string Base64UrlDecode (string text, string valueIfFail) =>
+ throw new NotImplementedException("Этот метод не требует реализации в этом классе!");
}
\ No newline at end of file
diff --git a/anbs_cpfn/anbs_cpfn.csproj b/anbs_cpfn/anbs_cpfn.csproj
index dda3682..9f0ac1e 100644
--- a/anbs_cpfn/anbs_cpfn.csproj
+++ b/anbs_cpfn/anbs_cpfn.csproj
@@ -6,7 +6,7 @@
enable
True
ANBSoftware.ComponentsPackForNet
- 2023.11.14.0
+ 2023.11.15.0
Александр Бабаев
Набор компонентов ANB Software для ASP.NET Core
Библиотека полезных методов языка C# для ASP.NET Core
diff --git a/anbsoftware.componentspack.sln b/anbsoftware.componentspack.sln
index 5e271ed..0760bba 100644
--- a/anbsoftware.componentspack.sln
+++ b/anbsoftware.componentspack.sln
@@ -37,6 +37,10 @@ Global
{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.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
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE