**개인키(Private Key)**와 **공개키(Public Key)**는 **비대칭 암호화(Asymmetric Encryption)**의 핵심 개념이에요.
이 둘은 쌍으로 작동하며, 보안 통신, 디지털 서명, 인증 등에 사용돼요.
| 동작 | 사용하는 키 | 설명 |
| 🔐 암호화 | 공개키 | 누구나 메시지를 암호화할 수 있음 |
| 🔓 복호화 | 개인키 | 오직 키 쌍의 주인만 해독 가능 |
| ✍️ 서명 | 개인키 | 보낸 사람이 진짜 본인인지 증명 |
| ✅ 서명 검증 | 공개키 | 서명의 진위 여부 확인 가능 |
| 항목 | 공개키 | 개인키 |
| 누구에게 알려짐? | 모두에게 공개 | 본인만 보유 |
| 용도 | 암호화, 서명 검증 | 복호화, 서명 생성 |
| 보안 중요성 | 상대적으로 낮음 | 매우 중요함 |
| 짝으로 동작 | 개인키와 짝 | 공개키와 짝 |
우리는 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())
Java에서는 java.security와 javax.crypto 패키지를 주로 사용합니다. 이 예제는 JDK만으로 구현할 수 있어요.
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);
}
}
| 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 |