오늘은 정보 보안에서 중요한 역할을 하는 대칭키(Symmetric Key)와 공개키(Public Key) / 비대칭키(Asymmetric Key) 암호화에 대해 알아보자. 각 방식의 특징과 장단점을 이해하고, 이를 통해 보안 문제를 어떻게 해결할 수 있는지 살펴보겠다.
대칭키 암호화는 암호화와 복호화에 같은 키를 사용하는 알고리즘이다. 이 방식은 동일한 키를 사용하므로 매우 빠르다는 장점이 있지만, 키를 전달하는 과정에서 해킹 위험에 노출될 수 있다.
공개키 암호화는 암호화와 복호화에 사용하는 키가 다른 알고리즘이다. 이는 대칭키의 키 분배 문제를 해결하기 위해 고안되었다. 송수신자 간의 키 분배가 복잡한 대칭키와 달리, 공개키 방식에서는 공개키를 대중에 공개하고 비밀키로만 복호화할 수 있다.
이 방식은 기밀성(Confidentiality)만 보장해줄 뿐, 무결성(Integrity)이나 인증(Authenticity)는 보장해주지 못한다. 이를 해결하기 위해 MAC(Message Authentication Code)나 전자 서명(Digital Signature)를 사용한다. (주의: MAC은 대칭키 방식이다)
대칭키와 공개키 암호화 방식을 혼합하여 장점을 극대화한 하이브리드 방식이 등장하게 되었고, 이는 SSL/TLS 프로토콜의 시초가 되었다.
즉, 대칭키를 주고받을 때만 공개키 암호화 방식을 사용하고, 이후에는 대칭키 암호화 방식으로 통신하는 것이다.
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class HybridEncryptionExample {
// 대칭키 생성
public static SecretKey generateSymmetricKey() throws NoSuchAlgorithmException {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128); // AES 키 크기 128비트
return keyGen.generateKey();
}
// 대칭키 암호화
public static String encryptSymmetric(String data, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encrypted = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
}
// 대칭키 복호화
public static String decryptSymmetric(String encryptedData, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
return new String(decrypted);
}
public static void main(String[] args) {
try {
SecretKey symmetricKey = generateSymmetricKey();
String originalData = "Hello, Secure World!";
// 데이터 암호화 및 복호화
String encryptedData = encryptSymmetric(originalData, symmetricKey);
String decryptedData = decryptSymmetric(encryptedData, symmetricKey);
System.out.println("Original Data: " + originalData);
System.out.println("Encrypted Data: " + encryptedData);
System.out.println("Decrypted Data: " + decryptedData);
} catch (Exception e) {
e.printStackTrace();
}
}
}
암호화 방식은 보안의 핵심 요소로, 상황에 따라 대칭키와 공개키를 적절히 사용해야 한다. 대칭키는 빠르지만 키 분배가 어렵고, 공개키는 안전하지만 속도가 느리다. 하이브리드 방식을 통해 두 가지 방식의 장점을 결합하여 보안을 강화할 수 있다.