using System.IO; using System.Security.Cryptography; using System.Text; namespace AxCopilot.Services; /// /// 가이드 HTML 파일 암호화/복호화 유틸리티. /// 고정 AES-256-CBC 키를 사용하여 모든 PC에서 동일하게 작동합니다. /// public static class GuideEncryptor { // 고정 키 (32바이트 = AES-256) — 앱 내장 가이드 보호용 private static readonly byte[] Key = { 0x41, 0x58, 0x43, 0x6F, 0x70, 0x69, 0x6C, 0x6F, 0x74, 0x47, 0x75, 0x69, 0x64, 0x65, 0x4B, 0x65, 0x79, 0x32, 0x30, 0x32, 0x36, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x46, 0x69, 0x78, 0x65, 0x64 }; // 고정 IV (16바이트) — 동일 출력 보장 private static readonly byte[] Iv = { 0x47, 0x75, 0x69, 0x64, 0x65, 0x49, 0x56, 0x46, 0x69, 0x78, 0x65, 0x64, 0x32, 0x30, 0x32, 0x36 }; /// 평문 HTML 파일을 암호화하여 .enc 파일로 저장합니다. public static void EncryptFile(string inputHtmlPath, string outputEncPath) { var plaintext = File.ReadAllBytes(inputHtmlPath); using var aes = Aes.Create(); aes.Key = Key; aes.IV = Iv; aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; using var encryptor = aes.CreateEncryptor(); var encrypted = encryptor.TransformFinalBlock(plaintext, 0, plaintext.Length); File.WriteAllBytes(outputEncPath, encrypted); } /// 암호화된 .enc 파일을 복호화하여 HTML 문자열로 반환합니다. public static string DecryptToString(string encFilePath) { var encrypted = File.ReadAllBytes(encFilePath); using var aes = Aes.Create(); aes.Key = Key; aes.IV = Iv; aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; using var decryptor = aes.CreateDecryptor(); var decrypted = decryptor.TransformFinalBlock(encrypted, 0, encrypted.Length); return Encoding.UTF8.GetString(decrypted); } /// 암호화된 바이트 배열을 복호화하여 HTML 문자열로 반환합니다. public static string DecryptToString(byte[] encrypted) { using var aes = Aes.Create(); aes.Key = Key; aes.IV = Iv; aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; using var decryptor = aes.CreateDecryptor(); var decrypted = decryptor.TransformFinalBlock(encrypted, 0, encrypted.Length); return Encoding.UTF8.GetString(decrypted); } /// Assets 폴더의 가이드 파일을 암호화합니다. 빌드 전 수동 실행용. public static void EncryptGuides(string assetsFolder) { var userGuide = Path.Combine(assetsFolder, "AX Copilot 사용가이드.htm"); var devGuide = Path.Combine(assetsFolder, "AX Copilot 개발자가이드.htm"); if (File.Exists(userGuide)) EncryptFile(userGuide, Path.Combine(assetsFolder, "guide_user.enc")); if (File.Exists(devGuide)) EncryptFile(devGuide, Path.Combine(assetsFolder, "guide_dev.enc")); } }