🎲 난수 (Random Numbers)
Randomness의 조건
- Uniform distribution (균등 분포): 0과 1의 출현 빈도가 비슷해야 함.
- Independence (독립성): 어떠한 부분 수열(subsequence)도 다른 부분 수열에 의해 유추될 수 없어야 함.
- True Random을 만들기는 비효율적이어서, 대신 랜덤처럼 보이는 숫자를 생성하는 알고리즘(PRNG)을 보편적으로 사용.
Pseudorandom Numbers (유사 난수)
- 랜덤하게 보이는 숫자를 만드는 알고리즘들은 결정론적(deterministic)이므로 통계적으로는 랜덤이 아님.
- 하지만 알고리즘이 충분히 좋고 여러 랜덤 테스트를 통과하면 Pseudorandom numbers로 취급함.
TRNG (True Random Number Generator)
- Entropy source: 키보드 입력 타이밍, 디스크 활동, 마우스 움직임 같은 예측 불가능한 물리적 현상.
- 아날로그 소스를 바이너리 출력으로 변환하며, 편향을 없애기 위한 추가 처리를 포함할 수 있음.
PRNG (Pseudorandom Number Generator)
- 결정론적 알고리즘을 사용하여 seed라 불리는 고정값으로부터 이진 출력을 변환.
- 출력 비트 스트림은 입력값에 의해 결정되므로 공격자가 seed와 알고리즘을 알면 출력을 재현(reproduce)할 수 있음.
Random Test (NIST SP 800-22)
- Frequency test: 0과 1이 비슷한 빈도로 출현하는지 확인.
- Runs test: 같은 숫자가 연달아 나오는 것(run)의 패턴이 무작위적인지 확인.
- Maurer’s universal statistical test: 비슷한 패턴의 압축률을 확인. 압축률이 낮을수록 랜덤에 가까움.
Stream Cipher Design Considerations
- 암호화 시퀀스의 주기가 길어야 예측이 어려움.
- 키의 길이는 적어도 128비트여야 함.
- 잘 설계된 PRNG로 만든 stream cipher는 같은 길이의 block cipher만큼 안전해야 함.
️⃣ Hash 함수 (Hash Functions)
Hash의 2가지 핵심 성질
- One-way operation (일방향성): 해시 결과(digest)를 가지고 원본 값을 역으로 계산하기 어려워야 함.
- Collision Resistance (충돌 저항성): 서로 다른 입력값에 대해 동일한 해시 값이 나오지 않아야 함.
- 성질이 지켜지지 않을 경우:
- 일방향성 위배: 해시값을 통해 원문을 알아내어 기밀성이 깨짐.
- 충돌 저항성 위배: 해시 값이 충돌하면 문서 위조가 가능하고, 데이터베이스에서 잘못된 데이터를 검색할 위험이 있음.
Hash 함수의 다른 용도
- 단방향 패스워드 파일
- 패스워드의 해시를 저장해두고, 로그인 시 입력받은 패스워드를 해싱하여 기존 해시와 비교.
- Dictionary attack: 자주 쓰는 패스워드를 미리 해싱한 목록과 비교하여 원본 패스워드를 찾는 공격.
- 침입과 바이러스 탐지
- 파일의 해시값을 안전하게 보관해두고, 현재 파일의 해시값과 비교하여 파일 변조 여부를 탐지.
Secure Hash Algorithm (SHA)
- SHA-1: 160비트. 충돌이 발견되어 현재는 안전하지 않음.
- SHA-2: SHA-256, SHA-384, SHA-512 등을 포함하는 해시 함수군.
- SHA-3: Sponge 구조의 알고리즘을 사용하는 차세대 표준.
✉️ 메시지 인증 코드 (Message Authentication Code - MAC)
HMAC (Hash-based MAC)
- MD5나 SHA 같은 해시 함수를 기반으로 메시지 인증 코드를 생성하는 방법.
- IPsec에서 IP 주소 무결성과 패킷 기밀성을 보장하기 위해 사용됨.
CMAC (Cipher-based MAC)
- AES 같은 블록 암호의 CBC 모드를 이용하여 MAC Tag를 생성하는 방법.
Authenticated Encryption (AE)
- 기밀성과 인증/무결성을 동시에 보장하는 암호화 방식.
- CCM (Counter with CBC-MAC)
- 인증: Nonce, Associated Data, 평문을 이어 붙여 CMAC으로 MAC tag 생성.
- 암호화: CTR 모드로 평문을 암호화하고, 암호화된 MAC tag를 이어 붙여 암호문을 생성.
🔑 공개키 암호화 (Public Key Cryptography)
공개키 암호 시스템의 개념
- 대칭 암호의 키 분배 문제를 해결하고 전자 서명을 가능하게 함.
- 각 사용자는 개인키(private key) 와 공개키(public key) 쌍을 가짐.
- 인증 (Authentication)
- 송신자가 자신의 개인키로 메시지를 암호화(서명)하고, 수신자는 송신자의 공개키로 이를 검증.
- 기밀성 (Confidentiality)
- 송신자가 수신자의 공개키로 메시지를 암호화하고, 수신자는 자신의 개인키로 복호화.
주요 공개키 알고리즘
- RSA: 암/복호화, 전자 서명, 키 교환용.
- Diffie-Hellman: 키 교환용.
- 두 사용자가 공개된 채널을 통해 비밀키를 안전하게 공유할 수 있게 함.
- Man-in-the-Middle Attack: 키 교환 과정에서 공격자가 중간에 끼어들어 양쪽을 속이는 공격. 통신 당사자를 확인할 방법이 없기 때문에 가능.
- 해결책: CA(Certificate Authority, 인증 기관) 가 발급한 디지털 인증서를 사용하여 상대방의 공개키가 진짜인지 검증.
- DSS (Digital Signature Standard): 전자 서명용.
- Elliptic Curve (타원 곡선): 암/복호화, 전자 서명, 키 교환용. 더 짧은 키 길이로도 높은 보안성 제공.
Hybrid Encryption
- 공개키 암호화(예: RSA)로 대칭키를 안전하게 캡슐화하여 교환하고, 실제 대용량 메시지는 빠른 대칭키 암호화(예: AES-CTR)로 암호화하는 방식.
🧮 계산 문제 및 코드 예제
Modular Exponentiation
-
문제:
185^199 mod 197185 ≡ -12 (mod 197)199 = 128 + 64 + 4 + 2 + 1185^1 ≡ -12185^2 ≡ (-12)^2 = 144 ≡ -53185^4 ≡ (-53)^2 = 2809 = 14*197 + 51 ≡ 51...185^128 ≡ 37185^199 ≡ 185^128 * 185^64 * 185^4 * 185^2 * 185^1 ≡ 37 * 49 * 51 * (-53) * (-12) ≡ 195 (mod 197)- 답:
195
-
Python Code
def exp(a, b, n):
c = 0
f = 1
bin_b = bin(b)[2:] # int_to_bin(b)
k = len(bin_b)
for i in range(k):
c = 2 * c
f = (f * f) % n
if bin_b[i] == '1':
c = c + 1
f = (f * a) % n
return f