/** * DOLCE 파일 다운로드용 DES 암호화 유틸리티 * crypto-js 사용 (OpenSSL 독립적, 순수 JavaScript 구현) */ import CryptoJS from "crypto-js"; // 암호화 키 (8바이트 ASCII) const DES_KEY_STRING = "4fkkdijg"; /** * DES ECB 모드로 문자열 암호화 * C# DESCryptoServiceProvider와 호환 */ export function encryptDES(plainText: string): string { try { // UTF-8 문자열을 WordArray로 변환 const message = CryptoJS.enc.Utf8.parse(plainText); // ASCII 키를 WordArray로 변환 (8바이트) const key = CryptoJS.enc.Latin1.parse(DES_KEY_STRING); // DES ECB 암호화 (PKCS7 패딩 자동) const encrypted = CryptoJS.DES.encrypt(message, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, }); // Base64 인코딩된 결과 const base64 = encrypted.toString(); // + 문자를 ||| 로 변환 (C# 호환) return base64.replace(/\+/g, "|||"); } catch (error) { console.error("DES 암호화 실패:", error); throw new Error(`암호화 중 오류가 발생했습니다: ${error}`); } } /** * DES ECB 모드로 문자열 복호화 */ export function decryptDES(encryptedText: string): string { try { // ||| 를 + 로 복원 const restored = encryptedText.replace(/\|\|\|/g, "+"); // ASCII 키를 WordArray로 변환 const key = CryptoJS.enc.Latin1.parse(DES_KEY_STRING); // DES ECB 복호화 const decrypted = CryptoJS.DES.decrypt(restored, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, }); // UTF-8 문자열로 변환 const plainText = decrypted.toString(CryptoJS.enc.Utf8); // null 바이트 제거 (혹시 모를 패딩 잔여물) return plainText.replace(/\0+$/, ""); } catch (error) { console.error("DES 복호화 실패:", error); throw new Error(`복호화 중 오류가 발생했습니다: ${error}`); } } /** * DOLCE 파일 다운로드용 암호화 키 생성 */ export function createDolceDownloadKey( fileId: string, userId: string, fileName: string ): string { const plainText = `${fileId}↔${userId}↔${fileName}`; return encryptDES(plainText); } /** * 테스트용: 암호화/복호화 검증 */ export function testDESEncryption(testString: string): { original: string; encrypted: string; decrypted: string; match: boolean; } { const encrypted = encryptDES(testString); const decrypted = decryptDES(encrypted); return { original: testString, encrypted, decrypted, match: testString === decrypted, }; }