암호화는 현대 정보 보안에서 불가결한 요소로, 민감한 정보를 안전하게 보호하는 핵심 기술입니다.
앞에서 Kerckhoffs Principle( 케르크호프스의 원칙 )에 의해 암호에서 키(복호화 키)는 알려지면 안 된다고 했습니다.
이를 위해 다양한 암호화 기술이 사용되며, 그중에서도 스트림 암호와 블록 암호는 가장 기본적이고 중요한 두 가지 암호화 방법입니다. 이 두 가지 암호화는 대칭키 암호에 속합니다.
스트림 암호(Stream cipher): 각 문자 하나하나를 암호화하는 방법
여기서 문자란 1-bit 단위가 될 수 있고 알파벳 하나라고 볼 수도 있습니다.
스트림 암호(Stream cipher)의 스트림(Stream)은 흐르는, 시냇물, 연속 이런 뜻을 가지고 있습니다. 즉, 스트림 암호란 마치 흘러가는 평문에 키를 이용하여 암호화/ 복호화하는 방식입니다.
스트림 암호 (Stream cipher)의 특징
- 실시간 통신에서 효과적으로 사용 가능하며, 연속적인 데이터 스트림에 적합합니다.
- 랜덤 한 비트 스트림을 생성하는 키스트림 생성기가 필요합니다. 이때 난수 생성기가 사용되며 난수 생성(랜덤 값 생성) 또한 암호에서 매우 중요한 부분이니 나중에 설명하겠습니다.
- 일반적으로 스트림 암호에서는 암호키의 길이와 평문의 길이가 동일해야 합니다.
스트림 암호란 데이터를 연속적인 비트 스트림으로 암호화하는 방식입니다. 이는 데이터를 비트 단위로 처리하며, 키 스트림과 평문 스트림 간의 XOR 연산을 통해 암호화를 수행합니다. 주로 실시간 통신이나 데이터 스트림 암호화에 사용됩니다.
아래는 몇 가지 대표적인 예시입니다.
무선 통신 (Wireless Communication): 무선 통신에서는 데이터를 실시간으로 전송해야 합니다. 예를 들어, 블루투스 통신에서 스트림 암호화 기술이 사용됩니다.
휴대폰 통신: GSM (Global System for Mobile Communications)에서는 휴대폰과 기지국 간의 통신을 보호하기 위해 A5/1과 A5/2라는 스트림 암호 알고리즘을 사용합니다.
데이터 스트리밍: 멀티미디어 스트리밍 서비스에서는 오디오나 비디오 데이터를 실시간으로 전송할 때 스트림 암호화가 사용됩니다.
스트림 암호는 데이터가 연속적으로 생성되고 전송될 때 유용하며, 블록 암호와 함께 정보 보안을 유지하는 데 중요한 역할을 합니다. 더 깊이 들어가려면 유한체 이론, LFSR 등 을 알아야 합니다. 이는 너무 복잡하니 넘어가겠습니다.
참고로 스트림 암호를 배우면 One-time pad라는 게 있습니다. 정보이론 관점에서 완벽한 안전성을 자랑합니다.
원 타임 패드( One-time pad )는 암호학에서 사용되는 고전적인 암호화 기술 중 하나입니다. 이는 매우 강력한 형태의 암호화 방법으로, 올바르게 사용될 경우 정보를 완벽하게 보호할 수 있습니다.
One-time pad는 다음과 같은 특징을 가지고 있습니다
1. 일회용 키를 사용합니다. 말 그대로 한 번만 사용하는 키입니다. 각각의 평문 메시지마다 독립적으로 무작위로 생성된 키가 사용됩니다.
2. 키의 길이는 평문 메시지의 길이와 동일해야 합니다.
3. 사용된 키는 완전히 무작위여야 하며, 누구도 예측할 수 없어야 합니다.
4. 키는 오직 한 번만 사용되기 때문에, 암호문만 얻었다고 해도 평문을 복원하기 어렵습니다.
그러나 원 타임 패드는 몇 가지 실제적인 문제가 있습니다:
1. 안전하게 무작위로 생성된 키를 전송하는 것(키교환) 이 어려울 수 있습니다.
2. 매번 다른 키를 사용해야 하기 때문에 키를 안전하게 보관하고 관리하는 것이 어렵습니다.
3. 충분히 긴 키가 필요하며, 각 키는 한 번만 사용되므로 많은 양의 키가 필요합니다.
또한, One-time pad를 실제로 사용하기 위해서는 물리적으로 안전한 방법으로 키를 전달하는 등의 추가적인 보안 절차가 필요합니다.
이러한 이유로 One-time pad는 현실 세계에서 많이 사용되지 않습니다. 대신, 고급 대칭 키 알고리즘과 공개 키 암호화 방식이 더 보편적으로 사용됩니다.
가끔 OTP (One Time Password)라는 단어를 접할 기회가 있으실 텐데 One-time pad 랑은 조금 다른 녀석이니 이 점 명심하셔야 합니다.
스트림 암호 Python code
def stream_cipher(message, key):
encrypted_message = ""
for i in range(len(message)):
# 메시지와 키의 각 문자에 대해 XOR 연산 수행
encrypted_char = chr(ord(message[i]) ^ ord(key[i % len(key)]))
encrypted_message += encrypted_char
return encrypted_message
def main():
message = "Hello, World!"
key = "secret"
# 메시지 암호화
encrypted_message = stream_cipher(message, key)
print("암호화된 메시지:", encrypted_message)
# 암호화된 메시지 복호화
decrypted_message = stream_cipher(encrypted_message, key)
print("복호화된 메시지:", decrypted_message)
if __name__ == "__main__":
main()
블록 암호(Block cipher): 한 번에 고정된 크기(블록)만큼 암호화시키는 방법
고정된 크기(블록)는 64-bit, 128-bit 등 여러 bit들을 묶은 단위이거나 알파벳으로 이루어진 단어 하나일 수도 있습니다.
블록 암호는 데이터를 고정된 크기의 블록으로 나누어 처리하는 방식입니다. 각 블록은 동일한 키(Key)를 사용하여 암호화됩니다. 블록 암호는 데이터를 블록 단위로 처리하며, 각 블록은 동일한 크기의 암호문으로 변환됩니다.

위 그림은 ECB mode encryption로 가장 기본적인 운용모드(또는 운영모드)입니다. 운용모드는 블록암호를 어떻게 다양한 메시지 길이에 대하여 효율적으로 사용할까라는 고민에 의해 탄생한 것으로 지금은 "블록 암호는 매우 긴 메시지도 블록 단위로 나눠서 암호화할 수 있구나" 하고 이해해 주시면 됩니다.
블록 암호(Block cipher)의 특징
- 고정된 블록 크기를 사용하며, 일반적으로 64비트 또는 128비트입니다.
- 블록 암호는 여러 가지 암호화 모드(예: ECB, CBC)를 사용하여 다양한 암호화 방식을 제공합니다. 암호화 모드(운용모드)는 뒤에서 다룰 예정입니다.
- 데이터 블록의 크기가 고정되어 있기 때문에, 마지막 블록의 크기가 부족할 경우 메시지의 끝에 데이터를 추가하는 패딩(Padding)이 필요합니다.
결론
스트림 암호와 블록 암호는 각각 실시간 통신과 블록 단위의 데이터 처리에 적합한 암호화 방식입니다. 또한 스트림 암호는 블록 암호에 비해 일반적으로 하드웨어에서 빠릅니다. 그래서 하드웨어 구현에서 이점이 있습니다.
올바른 상황에서 적절한 암호화 기술을 선택하는 것이 중요하며, 각각의 장단점을 고려하여 적절한 적용이 필요합니다. 이러한 기술들은 현대 정보 보안에서 필수적인 요소로, 암호화의 기본 개념을 이해하는 것은 매우 중요합니다.
'암호학 강의' 카테고리의 다른 글
[암호학] AES 블록암호 코드 with 설명 (1) | 2023.10.31 |
---|---|
[암호학] 블록암호 DES 특징과 구현 (0) | 2023.10.30 |
[암호학] 대칭키 암호와 비대칭키(공개키) 암호 (0) | 2023.10.25 |
[암호학] Kerckhoffs Principle(케르크호프스의 원칙)과 공격자 능력치 (1) | 2023.10.23 |
[암호학] 카이사르 암호와 빈도 분석 (1) | 2023.10.23 |