암호화 및 복호화 모듈 - 비대칭 키 암호화

그러면 이번엔 비대칭 키 암호화의 종류에 대해 알아봅시다. (암호화 및 복호화 모듈 정의와 대칭키 암호화란?)

 


1. 비대칭 키 암호화(Asymmetric Key Encryption)

비대칭 키 암호화암호화와 복호화에 서로 다른 키(공개키개인키)를 사용하는 방식을 뜻해요.

데이터를 암호화할 때는 공용 키를 사용하고, 암호화된 데이터를 복호화할 때는 개인 키를 사용합니다.

이로 인해, 공용 키를 사용하암호화된 데이터는 해당 개인 키를 가진 사람만 복호화할 수 있어요.

주요 알고리즘으로는 다음과 같습니다.

 

1-1. RSA (Rivest–Shamir–Adleman)

RSA가장 널리 사용되는 비대칭 키 암호화 알고리즘으로, 주로 데이터의 안전한 전송과 디지털 서명에 사용됩니다.

RSA의 기본 원리는 두 개의 키, 즉 공용 키와 개인 키를 사용하는 것 입니다.

이 두 키는 수학적으로 연결되어 있지만, 하나의 키로 다른 키를 쉽게 유추할 수는 없어요.

 

사용 방법은 다음과 같습니다.

RSA.java

import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import java.util.Base64;

public class RSADemo {

    public static void main(String[] args) throws Exception {
        // 1. 키 쌍 생성
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PrivateKey privateKey = keyPair.getPrivate();
        PublicKey publicKey = keyPair.getPublic();

        // 2. 평문 준비
        String originalMessage = "RSA Test";
        System.out.println("Original Message: " + originalMessage);

        // 3. 데이터 암호화
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal(originalMessage.getBytes());
        String encryptedMessage = Base64.getEncoder().encodeToString(encryptedBytes);
        System.out.println("Encrypted Message: " + encryptedMessage);

        // 4. 데이터 복호화
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedMessage));
        String decryptedMessage = new String(decryptedBytes);
        System.out.println("Decrypted Message: " + decryptedMessage); // Decrypted Message: RES Test
    }
}

 

1-2. DSA(Digital Signature Algorithm)

DSA 즉, 디지털 서명 알고리즘은 주로 데이터의 무결성과 인증을 보장하기 위해 사용됩니다.

이는 주로 전자 서명, SW 배포, 금융 거래 인증 등 다양한 분야에서 사용되고 있습니다.

 

사용 방법은 다음과 같습니다. (java.security 패키지 사용)

DSA.java

import java.security.*;

public class DSAExample {
    public static void main(String[] args) {
        try {
            // 키 쌍 생성
            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
            keyGen.initialize(1024); // 키 크기 설정
            KeyPair keyPair = keyGen.generateKeyPair();
            PrivateKey privateKey = keyPair.getPrivate();
            PublicKey publicKey = keyPair.getPublic();

            // 서명할 메시지
            String message = "This is a test message.";

            // 서명 생성
            Signature dsa = Signature.getInstance("SHA1withDSA");
            dsa.initSign(privateKey);
            dsa.update(message.getBytes());

            byte[] signature = dsa.sign();
            System.out.println("Signature: " + bytesToHex(signature));

            // 서명 검증
            dsa.initVerify(publicKey);
            dsa.update(message.getBytes());
            boolean verifies = dsa.verify(signature);
            System.out.println("Signature verification: " + verifies);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 바이트 배열을 헥사 문자열로 변환하는 메서드
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
}

 

1-3. ECC(Elliptic Curve Cryptography)

ECC타원 곡선 수학을 기반으로 합니다.

RSA와 같은 전통적인 암호화 방식에 비해 더 작은 크기로 동일한 보안 수준을 제공할 수 있어, 효율성과 성능 면에서 장점이 많습니다.

이는 주로 모바일 기기 or 임베디드 시스템과 같이 리소스가 제한된 환경에서도 효과적으로 사용할 수 있어요.

 

사용 방법은 다음과 같습니다. (java.security 패키지 사용)

ECC.java

import java.security.*;

public class ECCExample {
    public static void main(String[] args) {
        try {
            // 키 쌍 생성
            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
            keyGen.initialize(256); // 키 크기 설정
            KeyPair keyPair = keyGen.generateKeyPair();
            PrivateKey privateKey = keyPair.getPrivate();
            PublicKey publicKey = keyPair.getPublic();

            // 서명할 메시지
            String message = "This is a test message.";

            // 서명 생성
            Signature ecdsa = Signature.getInstance("SHA256withECDSA");
            ecdsa.initSign(privateKey);
            ecdsa.update(message.getBytes());

            byte[] signature = ecdsa.sign();
            System.out.println("Signature: " + bytesToHex(signature));

            // 서명 검증
            ecdsa.initVerify(publicKey);
            ecdsa.update(message.getBytes());
            boolean verifies = ecdsa.verify(signature);
            System.out.println("Signature verification: " + verifies);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 바이트 배열을 헥사 문자열로 변환하는 메서드
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
}

 


2. 정리하며

지금까지 비대칭 키 암호화 방식에 대해 알아보았습니다.

이를 활용해 중요한 개인 정보를 보관 및 활용할 수 있을 것 같아요.

 

참고

VERITAS의 RSA 암호화란 무엇입니까?

00SNU3K 님의 대칭키 vs 공개키(비대칭키)

RAON CTF의 비대칭키(Asymmetric Key) 암호 알고리즘이란?