Encryption Algorithm

RSA 비대칭키 암호화 알고리즘

임베디드 친구 2024. 11. 22. 09:29
반응형

비대칭키 암호화 알고리즘은 데이터를 안전하게 전달하기 위한 중요한 기술 중 하나입니다. 그 중에서도 가장 널리 알려진 알고리즘 중 하나가 바로 RSA (Rivest-Shamir-Adleman)입니다. 오늘은 RSA 알고리즘의 원리와 Java, Linux C 언어로 구현한 예제를 통해 RSA 암호화와 복호화를 알아보도록 하겠습니다.

RSA 알고리즘 개요

RSA 알고리즘은 공개키 암호화 방식의 대표적인 예입니다. RSA는 공개키와 비밀키 두 가지 키를 사용하여 데이터를 암호화하고 복호화합니다. 공개키는 누구나 알 수 있도록 공개되어 있으며, 비밀키는 수신자만 알고 있어야 합니다.

RSA의 핵심 개념은 소인수분해의 어려움에 기반을 두고 있습니다. 두 개의 매우 큰 소수를 곱하여 만든 수는 그 소인수를 매우 어렵게 찾을 수 있기 때문에, 이를 통해 안전성을 보장합니다.

RSA의 주요 절차

  1. 키 생성

    • 두 개의 큰 소수 (p, q)를 선택합니다.
    • 이 두 소수를 곱하여 (n = p \times q)를 계산하고, (n)은 공개키와 비밀키에 모두 사용됩니다.
    • 오일러의 함수 값을 계산합니다. ( \phi(n) = (p-1) \times (q-1) )
    • 1보다 크고 (\phi(n))보다 작은 (e)를 선택합니다. (e)는 공개키의 지수 역할을 하며, (e)와 (\phi(n))은 서로소여야 합니다.
    • (e)에 대해 (e \times d \equiv 1 \pmod{\phi(n)})을 만족하는 (d)를 계산합니다. 이 (d)가 비밀키의 일부가 됩니다.
  2. 암호화

    • 평문 (M)을 암호화하기 위해, 수학적으로 (C = M^e \mod n)을 계산합니다. 여기서 (C)는 암호문을 의미합니다.
  3. 복호화

    • 암호문 (C)를 복호화하기 위해서는, (M = C^d \mod n)을 계산하여 평문을 복구합니다.

RSA Java 구현 예제

자바에서 RSA 알고리즘을 구현하는 방법을 간단히 살펴보겠습니다. Java는 java.security 패키지를 통해 RSA와 같은 암호화 알고리즘을 쉽게 구현할 수 있도록 도와줍니다.

import java.security.*;
import javax.crypto.Cipher;

public class RSAExample {
    public static void main(String[] args) {
        try {
            // 키쌍 생성
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
            keyPairGen.initialize(2048);
            KeyPair pair = keyPairGen.generateKeyPair();
            PublicKey publicKey = pair.getPublic();
            PrivateKey privateKey = pair.getPrivate();

            // 암호화할 데이터
            String message = "Hello, RSA!";

            // 암호화
            Cipher encryptCipher = Cipher.getInstance("RSA");
            encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] encryptedMessage = encryptCipher.doFinal(message.getBytes());
            System.out.println("Encrypted Message: " + new String(encryptedMessage));

            // 복호화
            Cipher decryptCipher = Cipher.getInstance("RSA");
            decryptCipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] decryptedMessage = decryptCipher.doFinal(encryptedMessage);
            System.out.println("Decrypted Message: " + new String(decryptedMessage));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

위 코드에서 KeyPairGenerator를 사용하여 공개키와 비밀키 쌍을 생성하고, Cipher 클래스를 이용해 메시지를 암호화하고 복호화합니다. ENCRYPT_MODEDECRYPT_MODE를 사용하여 암호화와 복호화 작업을 수행할 수 있습니다.

Linux C 언어에서의 RSA 구현 예제

Linux 환경에서 C 언어로 RSA를 구현하려면, OpenSSL 라이브러리를 사용할 수 있습니다. OpenSSL은 RSA 키 생성, 암호화 및 복호화를 쉽게 할 수 있는 함수들을 제공합니다.

아래는 OpenSSL을 사용하여 RSA 암호화를 구현한 간단한 예제입니다.

#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <string.h>

int main() {
    int bits = 2048;
    unsigned long e = RSA_F4;
    RSA *rsa = RSA_generate_key(bits, e, NULL, NULL);

    if (rsa == NULL) {
        ERR_print_errors_fp(stderr);
        return 1;
    }

    // 공개키로 암호화
    char message[] = "Hello, RSA!";
    unsigned char encrypted[256];
    int encrypted_length = RSA_public_encrypt(strlen(message) + 1, (unsigned char*)message, encrypted, rsa, RSA_PKCS1_OAEP_PADDING);

    if (encrypted_length == -1) {
        ERR_print_errors_fp(stderr);
        return 1;
    }
    printf("Encrypted Message: %s\n", encrypted);

    // 비밀키로 복호화
    unsigned char decrypted[256];
    int decrypted_length = RSA_private_decrypt(encrypted_length, encrypted, decrypted, rsa, RSA_PKCS1_OAEP_PADDING);

    if (decrypted_length == -1) {
        ERR_print_errors_fp(stderr);
        return 1;
    }
    printf("Decrypted Message: %s\n", decrypted);

    RSA_free(rsa);
    return 0;
}

위 코드에서는 RSA_generate_key() 함수를 통해 RSA 키 쌍을 생성하고, RSA_public_encrypt()RSA_private_decrypt()를 사용하여 메시지를 암호화하고 복호화합니다. OpenSSL의 RSA_PKCS1_OAEP_PADDING을 사용하여 보안성을 강화한 패딩 방식을 적용했습니다.

결론

오늘은 RSA 알고리즘의 원리와 Java, Linux C 언어로의 구현 방법을 살펴보았습니다. RSA는 공개키 암호화 알고리즘의 대표적인 예이며, 중요한 데이터를 안전하게 보호하는 데 매우 유용합니다. Java와 Linux C 언어 모두 RSA 암호화를 구현할 수 있는 강력한 라이브러리를 제공하고 있어, 직접적인 구현을 통해 암호화의 동작 원리를 경험해볼 수 있습니다.

암호화는 현대 보안의 핵심 기술로, RSA를 이해하고 직접 구현하는 것은 보안 기술의 기초를 다지는 데 매우 큰 도움이 됩니다. 앞으로도 다양한 암호화 알고리즘을 다루며 보안에 대한 이해를 넓혀보세요!

반응형