[javascript] RSA 암호화를 사용한 자바스크립트 데이터 암호화

RSA 암호화는 공개키 암호화의 일종으로, 데이터를 안전하게 암호화하고 해독하는 방법입니다. 이는 대칭키 암호화와는 달리 공개키와 개인키를 사용하여 데이터를 암호화하고 해독합니다.

이 문서에서는 자바스크립트를 사용하여 RSA 암호화를 구현하는 방법을 살펴보겠습니다.

RSA 암호화 과정

RSA 암호화의 주요 단계는 다음과 같습니다:

  1. 소수 p와 q를 생성합니다.
  2. n = p * q를 계산합니다. 이 값은 암호화 및 해독에 사용되는 모듈로입니다.
  3. φ(n) = (p-1) * (q-1)을 계산합니다. 이 값은 공개키와 개인키의 생성에 사용됩니다.
  4. e를 선택하여 다음을 만족하는 값을 찾습니다: 1 < e < φ(n)이며, e와 φ(n)은 서로소입니다. e는 공개키의 일부입니다.
  5. e의 역원인 d를 계산합니다. 즉, (e * d) mod φ(n) = 1을 만족하는 d를 찾습니다. d는 개인키의 일부입니다.
  6. 공개키 (e, n)과 개인키 (d, n)을 생성합니다. 공개키는 데이터를 암호화하는 데 사용되고, 개인키는 데이터를 해독하는 데 사용됩니다.
  7. 데이터를 암호화하려면, 데이터를 숫자로 변환하고, 암호화된 값을 계산합니다. 암호화된 값을 해독하려면 개인키를 사용합니다.

자바스크립트에서 RSA 암호화 구현하기

자바스크립트에서 RSA 암호화를 구현하려면 큰 정수 연산을 지원하는 라이브러리를 사용해야 합니다. 대표적인 라이브러리 중 하나인 jsbn을 사용해 보겠습니다.

먼저, jsbn 라이브러리를 다운로드하고 프로젝트에 포함시킵니다. 그런 다음, 다음과 같은 코드를 사용하여 RSA 암호화를 구현할 수 있습니다:

// jsbn 라이브러리 가져오기
const BigInteger = require('jsbn').BigInteger;

// 공개키 및 개인키 생성 (p, q, e, d, n 등을 이용하여 계산)
function generateKeys() {
    const p = new BigInteger('12345678901234567890'); // p 값 설정
    const q = new BigInteger('9876543210987654321'); // q 값 설정
    const n = p.multiply(q); // n 값 계산
    const phi = p.subtract(1).multiply(q.subtract(1)); // φ(n) 값 계산
    const e = new BigInteger('65537'); // e 값 설정 (보통 65537 사용)
    const d = e.modInverse(phi); // d 값 계산

    const publicKey = { e, n }; // 공개키 생성
    const privateKey = { d, n }; // 개인키 생성

    return { publicKey, privateKey };
}

// 데이터 암호화
function encrypt(data, publicKey) {
    const num = new BigInteger(data); // 데이터를 숫자로 변환
    const encrypted = num.modPow(publicKey.e, publicKey.n); // 암호화된 값을 계산

    return encrypted.toString();
}

// 데이터 해독
function decrypt(encrypted, privateKey) {
    const num = new BigInteger(encrypted); // 암호화된 값을 숫자로 변환
    const decrypted = num.modPow(privateKey.d, privateKey.n); // 해독된 값을 계산

    return decrypted.toString();
}

// 사용 예시
const { publicKey, privateKey } = generateKeys();
console.log('공개키:', publicKey);
console.log('개인키:', privateKey);

const originalData = 'Hello, world!';
const encryptedData = encrypt(originalData, publicKey);
console.log('암호화된 데이터:', encryptedData);

const decryptedData = decrypt(encryptedData, privateKey);
console.log('해독된 데이터:', decryptedData);

이것은 간단한 예제로, 더 강력한 암호화 및 보안 기능을 위해서는 더 많은 작업이 필요합니다. 암호화 표준 및 보안 베스트 프랙티스를 따르는 것이 좋습니다.

참고 자료