using Microsoft.AspNetCore.DataProtection.KeyManagement; using System.Security.Cryptography; using System.Text; namespace FrontOffice.Main.Utilities; public class MobileNumberEncryptor { private readonly string _key; private readonly string _iv; public MobileNumberEncryptor(IConfiguration configuration) { var encryptionSettings = configuration.GetSection("EncryptionSettings").Get(); _key = encryptionSettings?.Key ?? throw new ArgumentNullException("Encryption Key not found in configuration"); _iv = encryptionSettings?.IV ?? throw new ArgumentNullException("Encryption IV not found in configuration"); // اعتبارسنجی سایز ValidateKeyAndIV(); } public MobileNumberEncryptor(string key, string iv) { _key = key; _iv = iv; ValidateKeyAndIV(); } private void ValidateKeyAndIV() { try { byte[] keyBytes = Convert.FromBase64String(_key); byte[] ivBytes = Convert.FromBase64String(_iv); if (keyBytes.Length != 32) throw new ArgumentException("Key must be 32 bytes in Base64 format"); if (ivBytes.Length != 16) throw new ArgumentException("IV must be 16 bytes in Base64 format"); } catch (FormatException) { throw new ArgumentException("Key or IV is not valid Base64 string"); } } public string EncryptMobileNumber(string mobileNumber) { if (string.IsNullOrEmpty(mobileNumber)) throw new ArgumentException("Mobile number cannot be null or empty"); try { byte[] key = Convert.FromBase64String(_key); byte[] iv = Convert.FromBase64String(_iv); byte[] plainTextBytes = Encoding.UTF8.GetBytes(mobileNumber); using (Aes aesAlg = Aes.Create()) { aesAlg.Key = key; aesAlg.IV = iv; aesAlg.Mode = CipherMode.ECB; aesAlg.Padding = PaddingMode.PKCS7; ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); using (MemoryStream msEncrypt = new MemoryStream()) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { csEncrypt.Write(plainTextBytes, 0, plainTextBytes.Length); csEncrypt.FlushFinalBlock(); byte[] encryptedBytes = msEncrypt.ToArray(); return Convert.ToBase64String(encryptedBytes); } } } } catch (Exception ex) { throw new Exception($"Encryption failed: {ex.Message}", ex); } } public string DecryptMobileNumber(string encryptedMobileNumber) { if (string.IsNullOrEmpty(encryptedMobileNumber)) throw new ArgumentException("Encrypted mobile number cannot be null or empty"); try { byte[] key = Convert.FromBase64String(_key); byte[] iv = Convert.FromBase64String(_iv); byte[] cipherTextBytes = Convert.FromBase64String(encryptedMobileNumber); using (Aes aesAlg = Aes.Create()) { aesAlg.Key = key; aesAlg.IV = iv; aesAlg.Mode = CipherMode.ECB; aesAlg.Padding = PaddingMode.PKCS7; ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); using (MemoryStream msDecrypt = new MemoryStream(cipherTextBytes)) { using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) { using (StreamReader srDecrypt = new StreamReader(csDecrypt)) { return srDecrypt.ReadToEnd(); } } } } } catch (Exception ex) { throw new Exception($"Decryption failed: {ex.Message}", ex); } } }