Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

Node.js crypto.privateDecrypt() 메서드 완벽 가이드 – 개인 키로 데이터 복호화하기

crypto.privateDecrypt() 메서드는 crypto.publicEncrypt()로 공개 키를 사용해 미리 암호화해 둔 데이터를, 매개변수로 전달된 개인 키(비공개 키)를 이용해 복호화하는 기능을 제공합니다. 즉, 공개 키로 암호화한 내용은 반드시 짝이 되는 개인 키로만 해독할 수 있습니다.

문법

crypto.privateDecrypt(privateKey, buffer)

매개변수

  • privateKey – Object, String, Buffer 또는 KeyObject 타입의 키 데이터를 받을 수 있으며, 객체 형태로 전달할 경우 아래 옵션들을 포함할 수 있습니다.

    • key – PEM 형식으로 인코딩된 개인 키입니다.

    • oaepHash – OAEP 패딩과 MGF1에 사용할 해시 함수를 지정합니다. 기본값은 'sha1'입니다.

    • oaepLabel – OAEP 패딩에 사용할 레이블 값입니다. 지정하지 않으면 레이블이 적용되지 않습니다.

    • padding – crypto.constants에 정의된 선택적 패딩 값입니다. 예를 들어 RSA_PKCS1_OAEP_PADDING 등을 지정할 수 있습니다.

    • passphrase – 개인 키 자체가 암호화되어 있는 경우 이를 해제하기 위한 암호 문구입니다.

  • buffer – 복호화할 데이터 내용입니다. String, TypedArray, Buffer, ArrayBuffer, DataView 타입을 사용할 수 있습니다.

예제 1

privateDecrypt.js라는 이름의 파일을 생성하고 아래 코드를 붙여넣습니다. 그다음 다음 명령어로 코드를 실행합니다.

node privateDecrypt.js

privateDecrypt.js

// crypto.privateDecrypt() 메서드의 동작을 보여주는 Node.js 프로그램

// crypto 모듈과 fs 모듈 불러오기
const crypto = require('crypto');
const fs = require("fs");

// 공개 키 읽기
// generateKeyPair()를 사용해 키 쌍을 생성할 수 있습니다.
publicKey = fs.readFileSync('public_key').toString();

// 암호화할 텍스트 준비
var buf = Buffer.from('Hello TutorialsPoint', 'utf8');

// 공개 키로 텍스트 암호화
secretData = crypto.publicEncrypt(publicKey, buf);

// 암호화된 텍스트 출력
console.log(secretData);

// 개인 키 읽기
privateKey = fs.readFileSync('private_key').toString();

// 개인 키로 암호문 복호화
origData = crypto.privateDecrypt(privateKey, secretData);
console.log();

// 복호화된 원본 텍스트를 버퍼 형태로 출력
console.log(origData);

실행 결과

C:\home\node>> node privateDecrypt.js
<Buffer 15 4b 51 02 e7 1c ec 11 20 55 ee 92 b2 18 7b ce f1 e1 97 bd b7 0d 54
21 18 ea 0c e7 cd 51 36 f5 13 df fb 41 c1 63 bb ac ee 94 12 df f6 d6 04 b1 9c
11 ... >
<Buffer 48 65 6c 6c 6f 20 54 75 74 6f 72 69 61 6c 73 50 6f 69 6e 74>

출력 결과에서 첫 번째 Buffer는 암호화된 데이터이며, 두 번째 Buffer는 복호화되어 원래 텍스트인 "Hello TutorialsPoint"가 그대로 되돌려진 것을 확인할 수 있습니다.

예제 2

이번에는 generateKeyPairSync() 메서드로 키 파일을 직접 생성하고, 문자열을 암호화한 뒤 다시 복호화하는 좀 더 실전적인 예제를 살펴보겠습니다.

// crypto.privateDecrypt() 메서드의 동작을 보여주는 Node.js 프로그램

// crypto 모듈과 fs 모듈 불러오기
const crypto = require('crypto');
const fs = require("fs");

// generateKeyPairSync() 메서드로 키 파일 생성하기
function generateKeyFiles() {
    const keyPair = crypto.generateKeyPairSync('rsa', {
        modulusLength: 530,
        publicKeyEncoding: {
            type: 'spki',
            format: 'pem'
        },
        privateKeyEncoding: {
            type: 'pkcs8',
            format: 'pem',
            cipher: 'aes-256-cbc',
            passphrase: ''
        }
    });
    // 생성된 키를 각각의 파일로 저장
    fs.writeFileSync("public_key", keyPair.publicKey);
    fs.writeFileSync("private_key", keyPair.privateKey);
}

// 키 생성 함수 호출
generateKeyFiles();

// 전달받은 문자열을 공개 키로 암호화하는 함수
function encryptString (plaintext, publicKeyFile) {
    const publicKey = fs.readFileSync(publicKeyFile, "utf8");

    // publicEncrypt() 메서드와 공개 키로 데이터 암호화
    const encrypted = crypto.publicEncrypt(
        publicKey, Buffer.from(plaintext));

    return encrypted.toString("base64");
}

// 전달받은 문자열을 개인 키로 복호화하는 함수
function decryptString (ciphertext, privateKeyFile) {
    const privateKey = fs.readFileSync(privateKeyFile, "utf8");

    // privateDecrypt() 메서드와 짝이 되는 개인 키로 데이터 복호화
    const decrypted = crypto.privateDecrypt(
        {
            key: privateKey,
            passphrase: '',
        },
        Buffer.from(ciphertext, "base64")
    );
    return decrypted.toString("utf8");
}

// 암호화 및 복호화할 대상 데이터
const plainText = "TutorialsPoint!";

// 문자열 암호화 실행
const encrypted = encryptString(plainText, "./public_key");

// 평문 출력
console.log("Plaintext:", plainText);
console.log();

// 암호화된 텍스트 출력
console.log("Encrypted Text: ", encrypted);
console.log();

// 복호화된 텍스트 출력
console.log("Decrypted Text: ",
    decryptString(encrypted, "private_key"));

실행 결과

C:\home\node>> node privateDecrypt.js
Plaintext: TutorialsPoint!

Encrypted Text:
AbSrqG4qFBG1q9KUBt8ddJxk9uNanOHXqY19N0mNHx0fm4M119dZVhcNrAvM8UaIRJvh7AsdWyjv1s
cPA25KpeJuJQ==

Decrypted Text: TutorialsPoint!

정리

crypto.privateDecrypt()는 RSA 기반 비대칭 암호화에서 필수적인 메서드입니다. 공개 키로 암호화한 데이터는 오직 짝이 되는 개인 키로만 복호화할 수 있으므로, 안전한 데이터 전송이나 API 통신 등에 널리 활용됩니다. 단, 실제 운영 환경에서는 충분히 긴 키 길이(2048비트 이상 권장)를 사용하고, 개인 키와 암호 문구를 안전하게 관리하는 것이 중요합니다.