암호학 개요

암호학 개요입니다. 평문/암호문/키, 대칭키, 공개키, 전자서명, 해시, 블록/스트림 암호와 OpenSSL 실습을 정리했습니다.

암호학 개요

암호학은 통신 당사자만 이해할 수 있도록 정보를 변환하고, 그 과정에서 기밀성, 무결성, 인증, 부인 방지 같은 보안 속성을 제공하는 기술이다. 실무에서는 암호 알고리즘 자체를 숨기는 방식이 아니라, 공개적으로 검증된 알고리즘과 안전하게 관리되는 키를 조합해서 사용한다.

평문, 암호문, 키

암호화 전 데이터는 평문, 암호화된 결과는 암호문이다. 알고리즘은 공개되어도 괜찮아야 하고, 보호해야 할 대상은 키다. 키 관리가 무너지면 강한 알고리즘을 사용해도 전체 보안은 무너진다.

plaintext  + encryption algorithm + key -> ciphertext
ciphertext + decryption algorithm + key -> plaintext

대칭키 암호

대칭키 암호는 암호화와 복호화에 같은 키를 사용한다. 속도가 빠르기 때문에 파일 암호화, VPN, TLS 세션 데이터 보호처럼 대량 데이터를 처리하는 구간에 많이 쓰인다. 단점은 송신자와 수신자가 같은 비밀키를 안전하게 공유해야 한다는 점이다.

mkdir -p crypto-lab
cd crypto-lab

printf 'devmes crypto lab\n' > plain.txt
openssl rand -base64 32 > lab.pass

openssl enc -aes-256-cbc -pbkdf2 -salt \
  -in plain.txt \
  -out plain.txt.enc \
  -pass file:./lab.pass

openssl enc -d -aes-256-cbc -pbkdf2 \
  -in plain.txt.enc \
  -out plain.restore.txt \
  -pass file:./lab.pass

diff -u plain.txt plain.restore.txt

공개키 암호

공개키 암호는 공개키와 개인키가 한 쌍으로 동작한다. 공개키는 배포할 수 있고 개인키는 소유자만 보관한다. 공개키 방식은 키 교환, 인증, 전자서명에 적합하지만 대량 데이터를 직접 암호화하는 용도로는 대칭키보다 느리다. 그래서 실제 프로토콜에서는 공개키 방식으로 세션 키를 안전하게 만들고, 데이터 본문은 대칭키로 보호하는 혼합 구조를 쓴다.

전자서명과 해시

전자서명은 데이터를 숨기는 기능이 아니다. 데이터가 변경되지 않았는지, 특정 개인키 소유자가 서명했는지를 검증하는 기능이다. 보통 메시지 전체를 직접 서명하지 않고 해시를 계산한 뒤 그 해시에 서명한다.

printf 'message for signature\n' > message.txt

openssl genpkey -algorithm Ed25519 -out ed25519-private.pem
openssl pkey -in ed25519-private.pem -pubout -out ed25519-public.pem

openssl pkeyutl -sign \
  -inkey ed25519-private.pem \
  -rawin \
  -in message.txt \
  -out message.sig

openssl pkeyutl -verify \
  -pubin \
  -inkey ed25519-public.pem \
  -rawin \
  -in message.txt \
  -sigfile message.sig

치환, 전치, 혼돈, 확산

고전 암호에서는 평문 문자를 다른 문자로 바꾸는 치환과, 문자의 위치를 바꾸는 전치가 기본이다. 현대 블록 암호도 개념적으로는 입력의 작은 변화가 출력 전체에 넓게 퍼지도록 구성한다. 이를 통해 평문 패턴이 암호문에 남지 않게 만든다.

  • 치환: 값을 다른 값으로 바꾼다.
  • 전치: 값의 위치를 바꾼다.
  • 혼돈: 키와 암호문 사이의 관계를 분석하기 어렵게 만든다.
  • 확산: 평문의 작은 변화가 암호문 전체에 퍼지게 만든다.

블록 암호와 스트림 암호

블록 암호는 정해진 블록 단위로 데이터를 처리한다. AES가 대표적이다. 스트림 암호는 키 스트림을 생성해 평문과 결합하는 방식으로 연속 데이터를 처리한다. 어느 쪽이든 nonce, IV, mode, 인증 태그를 잘못 다루면 안전성이 크게 떨어진다.

실무 기준

  • 자체 암호 알고리즘을 만들지 않는다.
  • 검증된 라이브러리와 표준 프로토콜을 사용한다.
  • 키는 코드, 문서, Git 저장소에 넣지 않는다.
  • 비밀번호 저장에는 일반 해시가 아니라 Argon2, bcrypt, scrypt 같은 password hashing 방식을 사용한다.
  • 암호화만으로 인증이 자동 보장된다고 가정하지 않는다. 가능하면 AEAD 모드를 사용한다.

암호학을 공부할 때는 수식보다 운영 기준을 함께 익혀야 한다. 어떤 알고리즘이 강한지뿐 아니라 키가 어디에 저장되는지, 누가 접근할 수 있는지, 회전과 폐기는 어떻게 하는지가 실제 보안을 결정한다.

BGM EVER