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

Node.js crypto.publicEncrypt() 메서드 완벽 가이드

crypto.publicEncrypt() 메서드는 매개변수로 전달된 공개 키(public key)를 사용하여 버퍼 형태로 주어진 데이터를 암호화하는 Node.js 내장 메서드입니다. 이 메서드를 통해 반환된 데이터는 짝을 이루는 개인 키(private key)로만 복호화할 수 있으며, 이는 안전한 데이터 전송에 널리 활용됩니다.

문법(Syntax)

crypto.publicEncrypt(key, buffer)

매개변수(Parameters)

이 메서드가 받는 매개변수는 다음과 같습니다.

  • key – 공개 키 정보를 담는 필드로, Object, String, Buffer 또는 KeyObject 타입 중 하나를 사용할 수 있습니다. 객체 형태일 경우 아래 속성들을 포함할 수 있습니다.

    • key – PEM으로 인코딩된 공개 키 또는 개인 키입니다. String, Buffer 또는 KeyObject 타입이 가능합니다.

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

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

    • passphrase – 개인 키를 위한 선택적(optional) 암호 문구입니다.

    • paddingcrypto.constants에 정의된 값을 사용하는 선택적 패딩 옵션입니다.

    • encoding – buffer, key, oaepLabel 또는 passphrase 값이 문자열일 때 사용할 인코딩 방식입니다.

  • buffer – 암호화할 실제 데이터 내용을 담는 필드입니다. String, TypedArray, Buffer, ArrayBuffer, DataView 타입을 사용할 수 있습니다.

예제 1: base64 문자열로 결과 출력하기

먼저 publicEncrypt.js라는 이름의 파일을 생성하고 아래 코드를 복사합니다. 그런 다음 다음 명령어로 코드를 실행할 수 있습니다.

node publicEncrypt.js

publicEncrypt.js

// crypto.publicEncrypt() 메서드 동작 예시 프로그램

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

// 키 쌍을 생성하는 함수
function generateKeyFiles() {

    const keyPair = crypto.generateKeyPairSync('rsa', {
      modulusLength: 520,
      publicKeyEncoding: {
          type: 'spki',
          format: 'pem'
      },
      privateKeyEncoding: {
          type: 'pkcs8',
          format: 'pem',
          cipher: 'aes-256-cbc',
          passphrase: ''
      }
    });

    // 공개 키 파일 생성
    fs.writeFileSync("public_key", keyPair.publicKey);
}
// 키 생성 실행
generateKeyFiles();

// 문자열을 암호화하는 함수
function encryptString (plaintext, publicKeyFile) {
    const publicKey = fs.readFileSync(publicKeyFile, "utf8");

    // publicEncrypt() 호출
    const encrypted = crypto.publicEncrypt(
      publicKey, Buffer.from(plaintext));
    return encrypted.toString("base64");
}

// 암호화할 평문
const plainText = "TutorialsPoint";

// 암호화 수행
const encrypted = encryptString(plainText, "./public_key");

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

// 암호문 출력
console.log("Encrypted: ", encrypted);

실행 결과

C:\home\node>> node publicEncrypt.js
Plaintext: TutorialsPoint
Encrypted:
kgnqPxy/n34z+/5wd7MZiMAL5LrQisTLfZiWoSChXSvxgtifMQaZ56cbF+twA55olM0rFfnuV6qqtc
a8SXIHQrk=

위 예제에서는 암호화된 결과를 toString("base64")로 변환하여 사람이 읽을 수 있는 base64 문자열 형태로 출력했습니다.

예제 2: Buffer 객체로 결과 출력하기

이번에는 암호화 결과를 base64 문자열이 아닌 원본 Buffer 객체 그대로 출력하는 예제를 살펴보겠습니다.

// crypto.publicEncrypt() 메서드 동작 예시 프로그램

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

// 키 쌍을 생성하는 함수
function generateKeyFiles() {

    const keyPair = crypto.generateKeyPairSync('rsa', {
      modulusLength: 520,
      publicKeyEncoding: {
          type: 'spki',
          format: 'pem'
      },
      privateKeyEncoding: {
          type: 'pkcs8',
          format: 'pem',
          cipher: 'aes-256-cbc',
          passphrase: ''
      }
    });

    // 공개 키 파일 생성
    fs.writeFileSync("public_key", keyPair.publicKey);
}

// 키 생성 실행
generateKeyFiles();

// 문자열을 암호화하는 함수
function encryptString (plaintext, publicKeyFile) {
    const publicKey = fs.readFileSync(publicKeyFile, "utf8");

    // publicEncrypt() 호출
    const encrypted = crypto.publicEncrypt(
      publicKey, Buffer.from(plaintext));
    return encrypted;
}

// 암호화할 평문
const plainText = "Hello TutorialsPoint!";

// 암호화 수행
const encrypted = encryptString(plainText, "./public_key");

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

// 암호화된 버퍼 출력
console.log("Buffer: ", encrypted);

실행 결과

C:\home\node>> node publicEncrypt.js
Plaintext: Hello TutorialsPoint!
Buffer: <Buffer 33 0b 54 96 0e 8f 34 6c b4 d5 7a cf d4 d5 ef 7b 7e c5 ec 97
cf 75 05 07 df 5a 9e d4 3d cc 3e bb 55 e7 50 1b 64 f0 c8 89 19 61 81 99 e5 88
10 4a 3b 5a ... >

정리

crypto.publicEncrypt()는 RSA 공개 키 기반 암호화의 핵심 메서드로, 민감한 데이터를 안전하게 보호하고자 할 때 유용합니다. 두 예제 모두 generateKeyPairSync()로 RSA 키 쌍을 먼저 생성한 후, 공개 키로 평문을 암호화하는 흐름을 보여줍니다. 암호화된 데이터는 해당 개인 키(crypto.privateDecrypt())를 통해서만 복호화할 수 있다는 점을 기억하시기 바랍니다.