암호화 방식의 분류 블록암호
2024. 12. 12. 01:52ㆍLinux*security/보안
반응형
현대 암호통신 모델의 주요 개념
- Hash Function (해시 함수)
- 입력 데이터를 고정 길이의 해시 값으로 변환하는 함수.
- 데이터 무결성 검증 및 디지털 서명 등에 사용.
- 예: SHA-256, MD5.
- Random Number Generator (난수 생성기)
- 예측할 수 없는 난수를 생성하여 암호 키, 초기 벡터 등을 만듦.
- 보안의 핵심 요소로 사용.
- Public-Key Cryptographic Algorithm (공개키 암호화 알고리즘)
- 공개키와 비밀키를 사용하여 데이터를 암호화/복호화하는 알고리즘.
- 주요 용도: 키 교환, 디지털 서명.
- 예: RSA, ECC.
- Key Agreement Protocol (키 교환 프로토콜)
- 두 개체가 안전하게 공통 암호 키를 공유하기 위한 프로토콜.
- 예: Diffie-Hellman, ECDH.
- Symmetric-Key Cryptographic Algorithm (대칭키 암호화 알고리즘)
- 동일한 키를 사용하여 데이터를 암호화하고 복호화.
- 주요 용도: 데이터 암호화.
- 예: AES, DES.
- Plaintext (평문)과 Ciphertext (암호문)
- 평문 P: 암호화 전의 원본 데이터.
- 암호문 C: 암호화 후의 데이터.
- Encryption: 평문을 암호문으로 변환.
- Decryption: 암호문을 평문으로 복원.
- Authentication (인증)
- 데이터의 출처를 확인하고 무결성을 검증.
- 메시지 인증 코드 (MAC): 대칭키를 사용하여 생성된 인증 태그로 데이터 무결성 확인.
- Key Sharing (키 공유)
- 키 K: 데이터를 암호화/복호화하는 데 사용되는 비밀 값.
- 키 공유 프로토콜은 안전한 키 전송을 보장.
- Authentication Tag (인증 태그)
- 메시지 무결성 및 출처 확인을 위해 생성된 코드.
- 생성에 대칭키 암호화와 해시 함수가 결합될 수 있음.
암호통신 모델의 일반적 흐름
- 송신자는 난수 생성기로 키를 생성.
- 키 교환 프로토콜로 수신자와 키 공유.
- 평문 P를 대칭키 암호화 알고리즘으로 암호화하여 암호문 C 생성.
- 송신자는 MAC 또는 인증 태그로 메시지 무결성을 확인.
- 수신자는 암호문과 인증 태그를 복호화하여 평문과 메시지의 무결성을 검증.
블록 암호의 개념 및 원리
블록 암호는 데이터를 일정한 크기의 블록 단위로 나누어 암호화하는 대칭키 기반 암호화 방식이다.
블록 암호의 원리
블록 암호는 암호화 과정을 통해 원문(평문)의 내용을 숨기고, 복호화를 통해 다시 복원할 수 있도록 설계된다. 암호의 안전성을 보장하기 위해 두 가지 주요 원칙인 혼돈(Confusion)과 확산(Diffusion)을 기반으로 작동한다.
1. 혼돈(Confusion)
- 목적: 평문의 내용과 암호문의 관계를 복잡하게 만들어 암호 해독을 어렵게 함.
- 방법: 치환(Substitution)
- 평문 문자를 다른 문자로 대체.
- 단순히 치환하여 원문의 내용을 추론하기 어렵게 만듦.
- 예: 특정 키 값을 사용하여 문자나 비트를 매핑하는 방식.
2. 확산(Diffusion)
- 목적: 알고리즘의 패턴을 추론하기 어렵게 하고, 평문의 구조가 암호문에 반영되지 않도록 함.
- 방법: 전치(Transposition)
- 평문 문자의 순서를 재배열하여 암호화.
- 입력 데이터의 특정 비트 변화가 출력 전체에 영향을 미치도록 설계.
- 예: 블록의 비트 위치를 교환하거나 이동.
혼돈과 확산의 결합
- 블록 암호 알고리즘은 혼돈(치환)과 확산(전치)을 반복적으로 적용하여 높은 수준의 보안을 제공.
- 대표적인 블록 암호 알고리즘:
- DES (Data Encryption Standard)
- AES (Advanced Encryption Standard)
블록 암호의 암호화/복호화 과정
- 입력 데이터 블록화
- 데이터를 고정된 크기(예: 64비트 또는 128비트)의 블록으로 분할.
- 라운드 반복
- 혼돈(치환)과 확산(전치)을 여러 번 반복하여 보안 강화.
- 각 라운드에서 키와의 조합(라운드 키) 사용.
- 출력 생성
- 암호화된 블록 데이터를 연결하여 암호문 생성.
- 복호화는 암호화 과정을 역순으로 수행.
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import os
# 고정된 크기의 블록(예: 16바이트 = 128비트)
BLOCK_SIZE = 16 # AES의 블록 크기 (128비트)
# 암호화 함수
def encrypt_aes(plaintext, key):
"""
AES 암호화 함수
:param plaintext: 평문 (str)
:param key: 암호화 키 (bytes, 16/24/32 바이트)
:return: 암호문 (bytes)
"""
cipher = AES.new(key, AES.MODE_ECB) # AES ECB 모드 생성
padded_plaintext = pad(plaintext.encode(), BLOCK_SIZE) # 평문 패딩
ciphertext = cipher.encrypt(padded_plaintext) # 암호화 수행
return ciphertext
# 복호화 함수
def decrypt_aes(ciphertext, key):
"""
AES 복호화 함수
:param ciphertext: 암호문 (bytes)
:param key: 암호화 키 (bytes, 16/24/32 바이트)
:return: 평문 (str)
"""
cipher = AES.new(key, AES.MODE_ECB) # AES ECB 모드 생성
decrypted_data = cipher.decrypt(ciphertext) # 복호화 수행
plaintext = unpad(decrypted_data, BLOCK_SIZE) # 패딩 제거
return plaintext.decode()
# 테스트
if __name__ == "__main__":
# 키 생성 (16바이트 = 128비트)
key = os.urandom(16)
print(f"Key: {key.hex()}")
# 암호화할 데이터
plaintext = "This is a secret message."
print(f"Plaintext: {plaintext}")
# 암호화
encrypted = encrypt_aes(plaintext, key)
print(f"Ciphertext (hex): {encrypted.hex()}")
# 복호화
decrypted = decrypt_aes(encrypted, key)
print(f"Decrypted text: {decrypted}")
특징과 활용
- 특징:
- 고속 암호화/복호화 가능.
- 데이터 무결성과 보안을 동시에 보장.
- 활용:
- 네트워크 통신 보안 (HTTPS, VPN).
- 데이터 저장 보안 (디스크 암호화).
- 전자 서명 및 인증 시스템.
반응형
'Linux*security > 보안' 카테고리의 다른 글
Spoofing 01 - TCP Server 구현 (0) | 2024.11.30 |
---|