Toolypet
Back to Blog
Security

암호화 기초: AES와 RSA의 차이점

대칭키 암호화와 비대칭키 암호화의 원리와 실제 활용 사례를 알아봅니다.

Toolypet Team5 min read
암호화 기초: AES와 RSA의 차이점

디지털 세상의 비밀 지키기

인터넷 뱅킹으로 돈을 보내고, 메신저로 친구와 대화하고, 쇼핑몰에서 카드 결제를 합니다. 이 모든 순간에 우리의 민감한 정보는 전 세계 어딘가의 서버로 전송됩니다. 그런데 어떻게 해커들이 중간에서 이 정보를 가로채지 못하는 걸까요? 답은 암호화에 있습니다.

암호화는 읽을 수 있는 데이터(평문)를 읽을 수 없는 형태(암호문)로 변환하는 과정입니다. 마치 어린 시절 친구와 비밀 편지를 주고받을 때 약속한 규칙대로 글자를 바꿔 쓰던 것처럼요. 다만 현대의 암호화는 수학적으로 훨씬 복잡해서, 현존하는 모든 컴퓨터를 동원해도 풀 수 없을 정도입니다.

오늘날 가장 널리 사용되는 두 가지 암호화 방식이 있습니다. AES(대칭키 암호화)와 RSA(비대칭키 암호화)입니다. 이름이 어렵게 느껴질 수 있지만, 개념을 이해하면 왜 두 가지 방식이 필요한지, 언제 어떤 것을 사용해야 하는지 명확해집니다.

대칭키와 비대칭키: 근본적인 차이

암호화의 세계에서 '키'는 자물쇠를 여는 열쇠와 같습니다. 대칭키 암호화에서는 하나의 키로 잠그고, 같은 키로 엽니다. 집 현관문을 떠올리면 됩니다. 열쇠 하나로 잠그고 열 수 있죠. 간단하고 빠르지만, 문제가 있습니다. 상대방에게 열쇠를 어떻게 안전하게 전달하느냐는 것입니다.

비대칭키 암호화는 이 문제를 우아하게 해결합니다. 두 개의 키를 사용하는데, 하나는 공개키(public key)로 누구에게나 공개할 수 있고, 다른 하나는 비밀키(private key)로 절대 공개하면 안 됩니다. 공개키로 잠근 것은 오직 비밀키로만 열 수 있습니다. 마치 우체통처럼요. 누구나 편지를 넣을 수 있지만, 열어서 꺼내는 건 열쇠를 가진 사람뿐입니다.

특성대칭키 (AES)비대칭키 (RSA)
키 개수1개2개 (공개키/비밀키)
속도빠름느림 (100-1000배)
키 분배안전한 채널 필요공개키는 공개 가능
주요 용도대용량 데이터 암호화키 교환, 디지털 서명

AES: 빠르고 강력한 대칭키 암호화

AES(Advanced Encryption Standard)는 2001년 미국 정부가 채택한 표준 암호화 알고리즘입니다. 이전에 사용하던 DES가 컴퓨터 성능 향상으로 더 이상 안전하지 않게 되자, 전 세계 암호학자들의 경쟁을 거쳐 선정되었습니다. 벨기에 암호학자들이 만든 Rijndael 알고리즘이 그 주인공입니다.

AES의 강점은 속도입니다. 현대 프로세서들은 AES 연산을 위한 전용 명령어(AES-NI)를 내장하고 있어, 기가바이트 단위의 데이터도 순식간에 암호화할 수 있습니다. 비밀번호로 파일을 암호화하거나, 데이터베이스의 민감한 정보를 보호하거나, 디스크 전체를 암호화할 때 AES가 사용됩니다.

키 길이에 따라 AES-128, AES-192, AES-256으로 나뉩니다. 숫자는 키의 비트 수를 의미합니다. AES-256은 2^256가지의 가능한 키 조합이 있는데, 이는 우주에 존재하는 원자 수보다 많습니다. 현재 기술로는 무차별 대입 공격(brute force)으로 뚫는 것이 불가능합니다.

하지만 AES를 사용할 때 한 가지 중요한 결정이 있습니다. 바로 운용 모드 선택입니다. ECB 모드는 같은 평문 블록이 항상 같은 암호문을 만들어내기 때문에 패턴이 노출될 수 있어 절대 사용하면 안 됩니다. 현재 권장되는 것은 GCM(Galois/Counter Mode)입니다. GCM은 암호화와 함께 데이터 무결성도 검증해주어, 암호문이 변조되었는지도 알 수 있습니다.

const crypto = require('crypto');

function encrypt(text, key) {
  const iv = crypto.randomBytes(12); // GCM은 12바이트 IV 권장
  const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);

  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');

  const authTag = cipher.getAuthTag();

  return {
    iv: iv.toString('hex'),
    encrypted,
    authTag: authTag.toString('hex')
  };
}

RSA: 공개키 암호화의 대명사

RSA는 1977년 MIT의 세 교수, Rivest, Shamir, Adleman의 이름 첫 글자를 딴 알고리즘입니다. 큰 수의 소인수분해가 어렵다는 수학적 원리를 기반으로 합니다. 두 개의 큰 소수를 곱하는 것은 쉽지만, 그 결과물에서 원래의 두 소수를 찾아내는 것은 천문학적으로 어렵습니다.

RSA의 가장 큰 장점은 키 분배 문제를 해결한다는 것입니다. 공개키는 말 그대로 공개해도 됩니다. 누군가 당신에게 암호화된 메시지를 보내고 싶다면, 당신의 공개키로 암호화해서 보내면 됩니다. 당신만 가지고 있는 비밀키로만 열 수 있으니까요.

RSA는 디지털 서명에도 사용됩니다. 이때는 반대로 비밀키로 서명하고, 공개키로 검증합니다. 비밀키는 본인만 가지고 있으므로, 유효한 서명이 있다는 것은 해당 메시지가 정말 그 사람에게서 왔다는 증거가 됩니다. 소프트웨어 업데이트 패키지나 법적 문서의 진위를 확인하는 데 쓰입니다.

다만 RSA는 느립니다. AES보다 수백에서 수천 배 느리기 때문에, 대용량 데이터를 직접 암호화하는 데는 적합하지 않습니다. 그래서 실제로는 하이브리드 방식을 사용합니다.

하이브리드 암호화: 두 세계의 장점을 하나로

현실 세계의 대부분의 암호화 시스템은 AES와 RSA를 함께 사용합니다. HTTPS로 웹사이트에 접속할 때 일어나는 일을 단순화하면 이렇습니다.

먼저 브라우저가 서버에 접속하면, 서버는 자신의 공개키가 담긴 인증서를 보냅니다. 브라우저는 임의의 AES 키(세션 키)를 생성하고, 이것을 서버의 RSA 공개키로 암호화해서 보냅니다. 서버는 자신의 비밀키로 이를 복호화해서 AES 키를 얻습니다. 이제 양쪽 모두 같은 AES 키를 가지게 되었고, 이후의 모든 통신은 이 빠른 AES로 암호화됩니다.

이 방식의 아름다움은 RSA의 키 분배 장점과 AES의 속도를 모두 취한다는 것입니다. RSA는 작은 데이터(AES 키)만 암호화하니 느림이 문제되지 않고, 실제 대용량 통신은 빠른 AES가 담당합니다.

암호화 구현 시 주의사항

암호화 알고리즘 자체는 강력하지만, 잘못 사용하면 무용지물이 됩니다. 몇 가지 흔한 실수를 피해야 합니다.

키를 소스 코드에 하드코딩하면 안 됩니다. GitHub에 올라간 코드에서 AWS 키가 노출되어 해킹당했다는 뉴스를 종종 볼 수 있습니다. 키는 환경 변수나 AWS KMS, HashiCorp Vault 같은 전문 키 관리 서비스를 사용해야 합니다.

AES의 IV(초기화 벡터)는 매번 새로운 랜덤 값을 사용해야 합니다. 같은 키로 같은 IV를 재사용하면 암호화가 깨질 수 있습니다. IV는 비밀이 아니므로 암호문과 함께 저장해도 됩니다. 중요한 건 재사용하지 않는 것입니다.

직접 암호화 알고리즘을 구현하려 하지 마세요. 검증된 라이브러리를 사용하는 것이 훨씬 안전합니다. 암호학은 미묘한 실수 하나가 전체 보안을 무너뜨릴 수 있는 분야입니다.

마무리하며

암호화는 현대 디지털 세상의 기반입니다. AES와 RSA, 이 두 알고리즘의 원리를 이해하면 HTTPS가 어떻게 작동하는지, 비밀번호는 왜 해시로 저장해야 하는지, 전자서명이 무엇인지 자연스럽게 이해할 수 있습니다.

Toolypet의 암호화 도구들을 사용해 직접 텍스트를 암호화하고 복호화해보세요. 추상적으로 느껴지던 개념들이 구체적인 경험으로 바뀌는 순간, 보안에 대한 이해가 한 단계 깊어질 것입니다.

EncryptionAESRSACryptographySecurity