🎲 난수 (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가지 핵심 성질

  1. One-way operation (일방향성): 해시 결과(digest)를 가지고 원본 값을 역으로 계산하기 어려워야 함.
  2. Collision Resistance (충돌 저항성): 서로 다른 입력값에 대해 동일한 해시 값이 나오지 않아야 함.
  • 성질이 지켜지지 않을 경우:
    • 일방향성 위배: 해시값을 통해 원문을 알아내어 기밀성이 깨짐.
    • 충돌 저항성 위배: 해시 값이 충돌하면 문서 위조가 가능하고, 데이터베이스에서 잘못된 데이터를 검색할 위험이 있음.

Hash 함수의 다른 용도

  1. 단방향 패스워드 파일
    • 패스워드의 해시를 저장해두고, 로그인 시 입력받은 패스워드를 해싱하여 기존 해시와 비교.
    • Dictionary attack: 자주 쓰는 패스워드를 미리 해싱한 목록과 비교하여 원본 패스워드를 찾는 공격.
  2. 침입과 바이러스 탐지
    • 파일의 해시값을 안전하게 보관해두고, 현재 파일의 해시값과 비교하여 파일 변조 여부를 탐지.

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 주소 무결성과 패킷 기밀성을 보장하기 위해 사용됨. {\displaystyle {\begin{aligned}\operatorname {HMAC} (K,m)&=\operatorname {H} {\Bigl (}{\bigl (}K'\oplus opad{\bigr )}\parallel \operatorname {H} {\bigl (}\left(K'\oplus ipad\right)\parallel m{\bigr )}{\Bigr )}\K'&={\begin{cases}\operatorname {H} \left(K\right)&K{\text{ is larger than block size}}\K&{\text{otherwise}}\end{cases}}\end{aligned}}}

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 197

    • 185 ≡ -12 (mod 197)
    • 199 = 128 + 64 + 4 + 2 + 1
    • 185^1 ≡ -12
    • 185^2 ≡ (-12)^2 = 144 ≡ -53
    • 185^4 ≡ (-53)^2 = 2809 = 14*197 + 51 ≡ 51
    • ...
    • 185^128 ≡ 37
    • 185^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