diff options
Diffstat (limited to 'lib/dolce/crypto-utils-legacy.ts')
| -rw-r--r-- | lib/dolce/crypto-utils-legacy.ts | 88 |
1 files changed, 28 insertions, 60 deletions
diff --git a/lib/dolce/crypto-utils-legacy.ts b/lib/dolce/crypto-utils-legacy.ts index c5ee496f..6bec9bca 100644 --- a/lib/dolce/crypto-utils-legacy.ts +++ b/lib/dolce/crypto-utils-legacy.ts @@ -1,64 +1,35 @@ /** * DOLCE 파일 다운로드용 DES 암호화 유틸리티 - * Node.js crypto 모듈 사용 (OpenSSL 3.0 호환) + * crypto-js 사용 (OpenSSL 독립적, 순수 JavaScript 구현) */ -import crypto from "crypto"; +import CryptoJS from "crypto-js"; -// 암호화 키 (8바이트) -const DES_KEY = Buffer.from("4fkkdijg", "ascii"); - -/** - * DES ECB 수동 구현 (OpenSSL 3.0 호환) - * createCipher 대신 수동 블록 처리 - */ -function desEncryptBlock(block: Buffer, key: Buffer): Buffer { - // DES 블록 암호화 (8바이트 블록) - const cipher = crypto.createCipheriv("des-ecb", key, Buffer.alloc(0)); - cipher.setAutoPadding(false); // 수동 패딩 - return Buffer.concat([cipher.update(block), cipher.final()]); -} - -/** - * PKCS7 패딩 추가 - */ -function addPKCS7Padding(data: Buffer): Buffer { - const blockSize = 8; - const paddingLength = blockSize - (data.length % blockSize); - const padding = Buffer.alloc(paddingLength, paddingLength); - return Buffer.concat([data, padding]); -} - -/** - * PKCS7 패딩 제거 - */ -function removePKCS7Padding(data: Buffer): Buffer { - const paddingLength = data[data.length - 1]; - return data.slice(0, data.length - paddingLength); -} +// 암호화 키 (8바이트 ASCII) +const DES_KEY_STRING = "4fkkdijg"; /** * DES ECB 모드로 문자열 암호화 + * C# DESCryptoServiceProvider와 호환 */ export function encryptDES(plainText: string): string { try { - // UTF-8로 인코딩 - let data = Buffer.from(plainText, "utf8"); + // UTF-8 문자열을 WordArray로 변환 + const message = CryptoJS.enc.Utf8.parse(plainText); - // PKCS7 패딩 추가 - data = addPKCS7Padding(data); + // ASCII 키를 WordArray로 변환 (8바이트) + const key = CryptoJS.enc.Latin1.parse(DES_KEY_STRING); - // 8바이트 블록으로 분할하여 암호화 - const encrypted: Buffer[] = []; - for (let i = 0; i < data.length; i += 8) { - const block = data.slice(i, i + 8); - encrypted.push(desEncryptBlock(block, DES_KEY)); - } + // DES ECB 암호화 (PKCS7 패딩 자동) + const encrypted = CryptoJS.DES.encrypt(message, key, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7, + }); - // Base64 인코딩 - const base64 = Buffer.concat(encrypted).toString("base64"); + // Base64 인코딩된 결과 + const base64 = encrypted.toString(); - // + 문자를 ||| 로 변환 + // + 문자를 ||| 로 변환 (C# 호환) return base64.replace(/\+/g, "|||"); } catch (error) { console.error("DES 암호화 실패:", error); @@ -74,23 +45,20 @@ export function decryptDES(encryptedText: string): string { // ||| 를 + 로 복원 const restored = encryptedText.replace(/\|\|\|/g, "+"); - // Base64 디코딩 - const data = Buffer.from(restored, "base64"); + // ASCII 키를 WordArray로 변환 + const key = CryptoJS.enc.Latin1.parse(DES_KEY_STRING); - // 8바이트 블록으로 분할하여 복호화 - const decrypted: Buffer[] = []; - for (let i = 0; i < data.length; i += 8) { - const block = data.slice(i, i + 8); - const decipher = crypto.createDecipheriv("des-ecb", DES_KEY, Buffer.alloc(0)); - decipher.setAutoPadding(false); - decrypted.push(Buffer.concat([decipher.update(block), decipher.final()])); - } + // DES ECB 복호화 + const decrypted = CryptoJS.DES.decrypt(restored, key, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7, + }); - // PKCS7 패딩 제거 - const unpaddedData = removePKCS7Padding(Buffer.concat(decrypted)); + // UTF-8 문자열로 변환 + const plainText = decrypted.toString(CryptoJS.enc.Utf8); - // UTF-8 디코딩 - return unpaddedData.toString("utf8").replace(/\0+$/, ""); + // null 바이트 제거 (혹시 모를 패딩 잔여물) + return plainText.replace(/\0+$/, ""); } catch (error) { console.error("DES 복호화 실패:", error); throw new Error(`복호화 중 오류가 발생했습니다: ${error}`); |
