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

Node.js crypto.generateKeyPair() 메서드로 비대칭 키 쌍 생성하기

Node.js의 crypto.generateKeyPair() 메서드는 지정된 유형의 새로운 비대칭 키 쌍(asymmetric key pair)을 생성하는 데 사용됩니다. 키 쌍 생성에 지원되는 유형은 RSA, DSA, EC, Ed25519, Ed448, X25519, X448, DH입니다.

이 함수는 publicKeyEncoding 또는 privateKeyEncoding 옵션이 지정된 경우 마치 결과 객체에 keyObject.export()가 호출된 것처럼 동작하며, 옵션이 지정되지 않으면 각각의 keyObject 부분이 그대로 반환됩니다.

문법(Syntax)

crypto.generateKeyPair(type, options, callback)

매개변수(Parameters)

  • type – 생성할 키의 유형을 나타내는 문자열입니다. 지원되는 유형은 RSA, DSA, EC, Ed25519, Ed448, X25519, X448, DH입니다.

  • options – 다음과 같은 하위 매개변수를 포함할 수 있습니다.

    • modulusLength – RSA 또는 DSA 유형의 키 크기를 비트 단위로 지정합니다.

    • publicExponent – RSA 알고리즘의 공개 지수(public exponent) 값을 지정합니다. 기본값은 0x10001입니다.

    • divisorLength – q의 크기를 비트 단위로 지정합니다.

    • namedCurve – 사용할 곡선(curve)의 이름을 지정합니다.

    • prime – DH와 같은 유형에서 소수(prime) 매개변수를 지정합니다.

    • primeLength – 소수 길이를 비트 단위로 지정합니다.

    • generator – 사용자 정의 제너레이터(generator) 값을 지정합니다. 기본값은 2입니다.

    • groupName – DH 알고리즘의 디피-헬만(Diffie-Hellman) 그룹 이름을 지정합니다.

    • publicKeyEncoding – 공개 키 인코딩 방식을 문자열 값으로 지정합니다.

    • privateKeyEncoding – 개인 키 인코딩 방식을 문자열 값으로 지정합니다.

  • callback – 콜백 함수는 다음 매개변수를 받습니다.

    • err – 발생한 오류 정보를 담습니다.

    • publicKey – 생성된 공개 키 값을 담습니다.

    • privateKey – 생성된 개인 키 값을 담습니다.

예제 1: RSA 키 쌍 생성

generateKeyPair.js라는 이름의 파일을 생성하고 아래 코드를 복사한 뒤, 다음 명령어로 실행해 보세요.

node generateKeyPair.js
// Node.js 프로그램: crypto.generateKeyPair() 메서드의 동작 시연

// crypto 모듈에서 generateKeyPair 가져오기
const { generateKeyPair } = require('crypto');

// 아래 매개변수와 함께 generateKeyPair() 메서드 호출
generateKeyPair('rsa', {
    modulusLength: 530, // 옵션
    publicExponent: 0x10101,
    publicKeyEncoding: {
        type: 'pkcs1',
        format: 'der'
    },
    privateKeyEncoding: {
        type: 'pkcs8',
        format: 'der',
        cipher: 'aes-192-cbc',
        passphrase: 'Welcome to TutorialsPoint!'
    }
}, (err, publicKey, privateKey) => { // 콜백 함수
    if(!err)
    {
        // 비대칭 키 쌍 출력
        console.log("Public Key is: ", publicKey);
        console.log();
        console.log("Private Key is: ", privateKey);
    }
    else
    {
        // 오류가 있으면 출력
        console.log("Errr is: ", err);
    }
});

출력 결과

C:\home\node>> node generateKeyPair.js
Public Key is: <Buffer 30 4a 02 43 03 43 66 5a e1 25 0d d8 c4 fe e3 a0 77 ea
e4 e7 20 78 8c eb a7 a4 f6 85 f0 45 fc 7b 46 d7 3e 5e e3 8b a1 16 e5 59 e8 79
69 65 54 00 6c 89 ... >

Private Key is: <Buffer 30 82 01 cd 30 57 06 09 2a 86 48 86 f7 0d 01 05 0d 30
4a 30 29 06 09 2a 86 48 86 f7 0d 01 05 0c 30 1c 04 08 1e a2 b4 ea ce 50 0e 80
02 02 08 00 30 0c ... >

예제 2: EC(타원 곡선) 키 쌍 생성

이번에는 secp256k1 곡선을 사용하는 EC 키 쌍을 생성하는 예제를 살펴보겠습니다.

// Node.js 프로그램: crypto.generateKeyPair() 메서드의 동작 시연

// crypto 모듈에서 generateKeyPair 가져오기
const { generateKeyPair } = require('crypto');

// 아래 매개변수와 함께 generateKeyPair() 메서드 호출
generateKeyPair('ec', {
    namedCurve: 'secp256k1', // 옵션
    publicKeyEncoding: {
        type: 'spki',
        format: 'der'
    },
    privateKeyEncoding: {
        type: 'pkcs8',
        format: 'der'
    }
},(err, publicKey, privateKey) => { // 콜백 함수
    if(!err)
    {
        // 비대칭 키 쌍 출력
        console.log("Public Key is: ", publicKey);
        console.log("Public Key in hex is: ", publicKey.toString('hex'));
        console.log();
        console.log("Private Key is: ", privateKey);
        console.log("Private Key in hex is: ",
        privateKey.toString('hex'));
    }else{
        // 오류가 있으면 출력
        console.log("Errr is: ", err);
    }
});

출력 결과

C:\home\node>> node generateKeyPair.js
Public Key is: <Buffer 30 56 30 10 06 07 2a 86 48 ce 3d 02 01 06 05 2b 81 04
00 0a 03 42 00 04 d1 d0 0b 7e f7 e3 3e cf d8 08 2a 20 a8 5e 52 be ca 56 29 42
c3 6b 9f d3 15 7c ... >
Public Key in hex is:
3056301006072a8648ce3d020106052b8104000a03420004d1d00b7ef7e33ecfd8082a20a85e52
beca562942c36b9fd3157cf98b03b41ecc4b4e13b4cd5cd35814383ee76afabaf794faf6f31bc8
c9f7007748f74767677c

Private Key is: <Buffer 30 81 84 02 01 00 30 10 06 07 2a 86 48 ce 3d 02 01 06
05 2b 81 04 00 0a 04 6d 30 6b 02 01 01 04 20 05 01 a1 d5 80 f7 65 56 6f a3 3a
05 d3 6d ec 82 ad ... >
Private Key in hex is:
308184020100301006072a8648ce3d020106052b8104000a046d306b02010104200501a1d580f7
65566fa33a05d36dec82ad590ff8697d182ddca6b881acfbadd1a14403420004d1d00b7ef7e33e
cfd8082a20a85e52beca562942c36b9fd3157cf98b03b41ecc4b4e13b4cd5cd35814383ee76afa
baf794faf6f31bc8c9f7007748f74767677c