상세 컨텐츠

본문 제목

개인키와 공개키의 역할과 차이는? (Python, Java 예시)

IT

by JR 2025. 4. 22. 06:06

본문

300x250
반응형

 

 

 

 

 

**개인키(Private Key)**와 **공개키(Public Key)**는 **비대칭 암호화(Asymmetric Encryption)**의 핵심 개념이에요.

 

이 둘은 쌍으로 작동하며, 보안 통신, 디지털 서명, 인증 등에 사용돼요.

 

 


✅ 1. 공개키(Public Key) 🔓

  • 공개되어도 안전한 키 (누구나 볼 수 있음)
  • 역할:
    • 암호화에 사용: 누군가에게 안전하게 메시지를 보낼 때 사용
    • 서명 검증에 사용: 개인키로 서명한 것을 검증할 때 사용
  • 예: 누군가가 내 공개키로 메시지를 암호화하면, 나만이 그걸 복호화할 수 있음 (내 개인키로)

✅ 2. 개인키(Private Key) 🔐

  • 절대 공개되어선 안 되는 키 (오직 본인만 소유)
  • 역할:
    • 복호화에 사용: 내 공개키로 암호화된 메시지를 해독
    • 디지털 서명에 사용: 내가 보냈음을 증명하는 서명을 생성할 때 사용
  • 예: 내가 내 개인키로 서명한 메시지는, 누구나 내 공개키로 내가 보낸 게 맞는지 검증 가능

🔄 관계 및 동작 방식

동작 사용하는 키 설명
🔐 암호화 공개키 누구나 메시지를 암호화할 수 있음
🔓 복호화 개인키 오직 키 쌍의 주인만 해독 가능
✍️ 서명 개인키 보낸 사람이 진짜 본인인지 증명
✅ 서명 검증 공개키 서명의 진위 여부 확인 가능

📦 예시 시나리오

▶️ 암호화 통신 (예: 메일)

  1. A가 B에게 메시지를 보냄
  2. A는 B의 공개키로 메시지를 암호화
  3. B는 자신의 개인키로 메시지를 복호화

▶️ 디지털 서명 (예: 거래 인증)

  1. B가 A에게 문서를 보냄
  2. B는 문서에 개인키로 서명
  3. A는 B의 공개키로 서명을 검증

🔍 요약 비교

항목 공개키 개인키
누구에게 알려짐? 모두에게 공개 본인만 보유
용도 암호화, 서명 검증 복호화, 서명 생성
보안 중요성 상대적으로 낮음 매우 중요함
짝으로 동작 개인키와 짝 공개키와 짝

 

 

💻 2. Python 코드 예시: 공개키 암호화 / 개인키 복호화

우리는 cryptography 라이브러리를 사용할 거예요.

▶️ 설치가 안되어 있다면:

bash
 
pip install cryptography

▶️ 전체 코드

from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes

# 1. B 시스템: 키쌍 생성
private_key_b = rsa.generate_private_key(public_exponent=65537, key_size=2048)
public_key_b = private_key_b.public_key()

# 2. A 시스템: 메시지를 B의 공개키로 암호화
message = b"Hello B!"
ciphertext = public_key_b.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print("🔐 암호화된 메시지:", ciphertext)

# 3. B 시스템: 자신의 개인키로 복호화
plaintext = private_key_b.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print("🔓 복호화된 메시지:", plaintext.decode())

 


▶️ 출력 예시:

plaintext
 
🔐 암호화된 메시지: b'\xa3\x1f... (이하 생략)'
🔓 복호화된 메시지: Hello B!

 

 

Java에서는 java.security와 javax.crypto 패키지를 주로 사용합니다. 이 예제는 JDK만으로 구현할 수 있어요.


💡 목표

  • B 시스템: RSA 키쌍(공개키/개인키) 생성
  • A 시스템: B의 공개키로 메시지를 암호화
  • B 시스템: 자신의 개인키로 복호화

✅ Java 코드 전체 예시 (RSA)

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

public class RSADemo {

    public static void main(String[] args) throws Exception {
        // 1. B 시스템: 키쌍 생성
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(2048); // 키 길이
        KeyPair keyPair = keyGen.generateKeyPair();
        PublicKey publicKeyB = keyPair.getPublic();     // 공개키
        PrivateKey privateKeyB = keyPair.getPrivate();  // 개인키

        // 2. A 시스템: B의 공개키로 메시지 암호화
        String originalMessage = "Hello B!";
        Cipher encryptCipher = Cipher.getInstance("RSA");
        encryptCipher.init(Cipher.ENCRYPT_MODE, publicKeyB);
        byte[] encryptedBytes = encryptCipher.doFinal(originalMessage.getBytes("UTF-8"));
        String encryptedBase64 = Base64.getEncoder().encodeToString(encryptedBytes);

        System.out.println("🔐 암호화된 메시지: " + encryptedBase64);

        // 3. B 시스템: 개인키로 복호화
        Cipher decryptCipher = Cipher.getInstance("RSA");
        decryptCipher.init(Cipher.DECRYPT_MODE, privateKeyB);
        byte[] decryptedBytes = decryptCipher.doFinal(Base64.getDecoder().decode(encryptedBase64));
        String decryptedMessage = new String(decryptedBytes, "UTF-8");

        System.out.println("🔓 복호화된 메시지: " + decryptedMessage);
    }
}
 
 

🔍 결과 예시

 
 
🔐 암호화된 메시지: MIIByDIBAAKBgQDc...
🔓 복호화된 메시지: Hello B!

 

 

 

 

300x250
반응형

'IT' 카테고리의 다른 글

adid, gaid, idfa 개념과 각각 역할은?  (0) 2025.06.01
qr코드 생성 원리와 인식하는 원리는?  (0) 2025.05.14
udid와 uuid의 차이점은?  (0) 2025.04.21
클라우드에서 VPC란?  (0) 2025.04.15
MGMT VPC 란?  (0) 2025.04.14

관련글 더보기