비대칭키 암호화 알고리즘은 데이터를 안전하게 전달하기 위한 중요한 기술 중 하나입니다. 그 중에서도 가장 널리 알려진 알고리즘 중 하나가 바로 RSA (Rivest-Shamir-Adleman)입니다. 오늘은 RSA 알고리즘의 원리와 Java, Linux C 언어로 구현한 예제를 통해 RSA 암호화와 복호화를 알아보도록 하겠습니다.
RSA 알고리즘 개요
RSA 알고리즘은 공개키 암호화 방식의 대표적인 예입니다. RSA는 공개키와 비밀키 두 가지 키를 사용하여 데이터를 암호화하고 복호화합니다. 공개키는 누구나 알 수 있도록 공개되어 있으며, 비밀키는 수신자만 알고 있어야 합니다.
RSA의 핵심 개념은 소인수분해의 어려움에 기반을 두고 있습니다. 두 개의 매우 큰 소수를 곱하여 만든 수는 그 소인수를 매우 어렵게 찾을 수 있기 때문에, 이를 통해 안전성을 보장합니다.
RSA의 주요 절차
키 생성
- 두 개의 큰 소수 (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)가 비밀키의 일부가 됩니다.
암호화
- 평문 (M)을 암호화하기 위해, 수학적으로 (C = M^e \mod n)을 계산합니다. 여기서 (C)는 암호문을 의미합니다.
복호화
- 암호문 (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_MODE
와 DECRYPT_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를 이해하고 직접 구현하는 것은 보안 기술의 기초를 다지는 데 매우 큰 도움이 됩니다. 앞으로도 다양한 암호화 알고리즘을 다루며 보안에 대한 이해를 넓혀보세요!
'Encryption Algorithm' 카테고리의 다른 글
Diffie-Hellman (DH) 키 교환 비대칭키 알고리즘 이해하기 (0) | 2024.11.24 |
---|---|
ECC (Elliptic Curve Cryptography) 비대칭키 암호화 알고리즘 (0) | 2024.11.23 |
ChaCha20 대칭키 암호화 알고리즘 (0) | 2024.11.21 |
IDEA 대칭키 암호화 알고리즘 (0) | 2024.11.20 |
Twofish 대칭키 암호화 알고리즘 (0) | 2024.11.19 |