crypto.publicDecrypt() 메서드는 공개 키(public key)를 사용하여 버퍼 형태의 암호화된 데이터를 복호화하는 데 사용됩니다. 이 데이터는 해당하는 개인 키(private key), 즉 crypto.privateEncrypt() 메서드로 사전에 암호화된 것입니다.
이 방식은 일반적인 암호화 흐름과 반대되는 개념으로, 주로 디지털 서명 검증 등에 활용됩니다. 개인 키로 암호화한 내용을 공개 키로 복호화함으로써 데이터가 신뢰할 수 있는 발신자로부터 왔음을 확인할 수 있습니다.
문법(Syntax)
crypto.publicDecrypt(key, buffer)
매개변수(Parameters)
각 매개변수에 대한 설명은 다음과 같습니다.
key – Object, String, Buffer 또는 KeyObject 타입의 데이터를 포함할 수 있으며, 다음과 같은 옵션을 가집니다.
passphrase - 개인 키를 위한 선택적(optional) 암호 문구입니다.
padding – crypto.constants에 정의된 선택적 패딩 값입니다.
encoding – buffer, key, oaepLabel 또는 passphrase 값이 문자열일 때 사용할 인코딩 유형입니다.
buffer – 복호화할 데이터 내용이 담긴 필드입니다. 사용 가능한 버퍼 타입은 String, TypedArray, Buffer, ArrayBuffer, DataView입니다.
예제 1
먼저 publicDecrypt.js라는 이름의 파일을 생성하고 아래 코드를 복사합니다. 파일 생성 후에는 다음 명령어로 코드를 실행할 수 있습니다.
node publicDecrypt.js
publicDecrypt.js
// crypto.publicDecrypt 데모 예제
// crypto, fs, path 모듈 불러오기
var crypto = require('crypto');
var fs = require('fs');
const path = require('path');
// 키 쌍 생성 함수
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);
fs.writeFileSync("private_key", keyPair.privateKey);
}
// 키 생성 함수 호출
generateKeyFiles();
// 개인 키와 공개 키 읽기
var private = fs.readFileSync('private_key');
var public = fs.readFileSync('public_key');
// 원본 데이터 정의
var data = 'Welcome to TutorialsPoint';
console.log("Original Data is: "+data);
// 개인 키로 데이터 암호화
encrypted = crypto.privateEncrypt(private, Buffer.from(data, 'utf8')).toString('base64');
// 공개 키로 데이터 복호화
originalData = crypto.publicDecrypt(public, Buffer.from(encrypted, 'base64'));
console.log();
// 암호화된 메시지 출력
console.log("Encrypted with private key: " + encrypted);
console.log();
// 복호화된 메시지 출력
console.log("Decrypted with public key: " + originalData.toString());실행 결과
C:\home\node>> node publicDecrypt.js Original Data is: Welcome to TutorialsPoint Encrypted with private key: EFBihrKebXb0gfCF7nTnw82yXpToH5eVBpLc8O5QL/ZgfZ/qJT5I/BejSMwV4NFCp+AIKnz2lrjmFh IhnpZWbF4= Decrypted with public key: Welcome to TutorialsPoint
위 실행 결과에서 확인할 수 있듯이, 개인 키로 암호화된 문자열이 공개 키를 통해 성공적으로 원본 데이터로 복원되었습니다.
예제 2
이번에는 버퍼 객체의 변화 과정을 직접 확인하는 또 다른 예제를 살펴보겠습니다.
// crypto.publicDecrypt 데모 예제
// crypto, fs 모듈 불러오기
var crypto = require('crypto');
var 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);
fs.writeFileSync("private_key", keyPair.privateKey);
}
// 키 생성 함수 호출
generateKeyFiles();
// 개인 키 읽기
privateKey = fs.readFileSync('private_key').toString();
var buffer = Buffer.from('Welcome to TutorialsPoint', 'utf8');
console.log("Data buffer before encryption")
console.log(buffer);
// 버퍼 텍스트 암호화
encrypted = crypto.privateEncrypt(privateKey, buffer);
// 암호화 후 데이터 출력
console.log("Data after encryption: ");
console.log(encrypted);
// 공개 키 읽기
publicKey = fs.readFileSync('public_key').toString();
// 공개 키로 암호화된 텍스트 복호화
decryptedData = crypto.publicDecrypt(publicKey, encrypted);
// 원본 내용 출력
console.log("Data after decryption: ");
console.log(decryptedData);실행 결과
C:\home\node>> node publicDecrypt.js Data buffer before encryption <Buffer 57 65 6c 63 6f 6d 65 20 74 6f 20 54 75 74 6f 72 69 61 6c 73 50 6f 69 6e 74> Data after encryption: <Buffer a6 9d e3 86 9f 3f 4b b9 3f f7 a6 9c 7c 16 0f 04 b9 c4 16 0b 08 f1 06 39 de 32 75 7c 26 88 fa 49 bd 31 6b 4b 4d 02 e6 87 56 ee 9c 95 53 10 8f 28 49 f5 ... > Data after decryption: <Buffer 57 65 6c 63 6f 6d 65 20 74 6f 20 54 75 74 6f 72 69 61 6c 73 50 6f 69 6e 74>
실행 결과를 보면 암호화 전 버퍼(57 65 6c...)와 복호화 후 버퍼가 동일한 값으로 돌아온 것을 확인할 수 있습니다. 이처럼 crypto.publicDecrypt()는 개인 키로 암호화된 데이터를 안전하게 원래 상태로 되돌리는 역할을 수행합니다.