88 lines
3.1 KiB
C#
88 lines
3.1 KiB
C#
using System.IO;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
|
|
namespace AxCopilot.Services;
|
|
|
|
/// <summary>
|
|
/// 가이드 HTML 파일 암호화/복호화 유틸리티.
|
|
/// 고정 AES-256-CBC 키를 사용하여 모든 PC에서 동일하게 작동합니다.
|
|
/// </summary>
|
|
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
|
|
};
|
|
|
|
/// <summary>평문 HTML 파일을 암호화하여 .enc 파일로 저장합니다.</summary>
|
|
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);
|
|
}
|
|
|
|
/// <summary>암호화된 .enc 파일을 복호화하여 HTML 문자열로 반환합니다.</summary>
|
|
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);
|
|
}
|
|
|
|
/// <summary>암호화된 바이트 배열을 복호화하여 HTML 문자열로 반환합니다.</summary>
|
|
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);
|
|
}
|
|
|
|
/// <summary>Assets 폴더의 가이드 파일을 암호화합니다. 빌드 전 수동 실행용.</summary>
|
|
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"));
|
|
}
|
|
}
|