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