암호 - 난수, 비밀키, 공개키, 블록, 스트림
고대 암호
- 노예 머리에 문신, 스키테일 암호, 시저 암호
- 시저 암호는 가장 많이 나타나는 문자를 모음에 대조시키면 깨지고, 치환 암호라고도 함
현대 암호
Kerckhoffs 원리
- 암호의 안전성은 알고리즘이 아니라 키의 안정성에만 의존
- 키를 제외한 시스템의 모든 내용이 노출되어도 암호 체계는 안전해야 함
현대 암호 시스템 주요 기능
기밀성(Confidentiality)
- 비밀키, 공개키 암호
무결성(Confidentiality)
- 암호학적 해시 함수
- MAC (Message Authentication Code)
- 전자 서명
인증(Authentication)
- 개체 인증
- 메시지 인증
부인 방지(Non-Repudiation)
- 전자 서명
- 공인인증 시스템
기타
- 난수
난수(Random number)
- 예측 불가능성: 생성된 난수로 다음 난수 예측 불가
- 무작위성: 생성된 난수는 통계적으로 균일한 분포, 패턴을 가지지 않음
- 재현 불가능성: 동일 난수를 생성할 수 없어야 함
사용분야
- 암호화 키, 인증 토큰 생성
- 보안 파라미터 생성
종류
Pesudo Random Number Generator (PTNG)
- Seed 입력 값으로 알고리즘 생성
- 해시함수 기반(Hash DRBG/HMAC_DRBG), 블록암호 기반(CTR_DRBG)
True Random Number Generator (TRNG)
- 물리적 현상 기반, 전자회로 기반
- QRNG(Quantom Random Number Generator)
비밀키(대칭키) 암호 vs 공개키(비대칭키) 암호
- 대칭키 암호는 암복호화 사용키 동일 -> 참여자 간 안전하게 비밀키를 공유 및 관리
- 공개키 암호는 암호화와 복호화 키 상이 -> 개인키, 공개키를 생성하여 공개키를 참여자에게 공유
비밀키(대칭키) 암호
- 참여자 n명, 개인이 관리해야 할 키 개수 n-1
- 전체 키 개수 n(n-1) / 2 개
공개키(비대칭키) 암호
- 참여자가 n명일 때 개인이 관리해야 할 키는 자신의 개인키 1개
- 상대방의 공개키는 공개되어 있어서 관리할 필요가 없음
스트림(Stream) 암호화 블록(Block) 암호
스트림 암호
- Bit 또는 Byte 단위로 데이터를 순차적으로 처리
- 키와 평문에 대한 XOR 연산
- 1비트 오류 -> 해당 비트에만 영향
- 빠른 성능이 필요한 데이터에 대한 실시간 보호
- 블록 암호에 비해 사용 빈도가 떨어짐
- 표준화 부재
- 보안 취약점: 키 스트림 관리, 인증 매커니즘 부족
- 유연성 부재: 블록 암호는 다양한 모드 제공(스트림 암호와 유사하게 가능)
- 근데 요즘 ChaCha20 많이 쓰는듯? TLS 표준에도 들어갔음
블록 암호
- 정해진 크기의 블록 단위로 데이터를 처리
- 키와 평문을 이용한 치환과 순열 변환을 반복 수행
- 상대적으로 느린 연산 속도
- 1비트 오류는 해당 블록에 영향 (모드따라 다름)
- 대부분의 데이터 암호화에 사용