summaryrefslogtreecommitdiff
path: root/lib/dolce/crypto-utils-legacy.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dolce/crypto-utils-legacy.ts')
-rw-r--r--lib/dolce/crypto-utils-legacy.ts88
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}`);