Blowfish는 대칭키 암호화 알고리즘으로, 브루스 슈나이어(Bruce Schneier)가 설계했습니다. 이 알고리즘은 비밀키를 사용하여 데이터를 암호화하고 복호화하는 데 사용됩니다.
Blowfish는 블록 암호화 알고리즘으로, 64비트 블록 크기와 32비트 키 길이를 가집니다. 알고리즘은 16라운드의 Fiestel 암호화 함수를 사용하여 입력 데이터를 블록 단위로 암호화합니다.
Blowfish의 키 스케줄링 알고리즘은 입력된 키를 사용하여 내부적으로 4168비트의 서브키를 생성합니다. 이 서브키는 18개의 32비트 라운드 상수와 4개의 32비트 승수 배열을 사용하여 생성됩니다.
Blowfish의 장점은 다양한 키 길이를 지원하며, 매우 빠른 암호화 속도를 가지고 있다는 것입니다. 또한 공격자가 암호화된 데이터에서 원본 키를 추출하는 것이 매우 어렵다는 것이 장점입니다.
그러나 이 알고리즘은 현재 사용되는 고급 암호화 기술에 비해 상대적으로 보안성이 낮아서, 안전한 암호화를 위해서는 다른 알고리즘을 사용하는 것이 좋습니다.
DES 보다 빠르며 누구나 자유롭게 사용할 수 있는 비특허 블록 암호입니다.
64비트 블록을 사용하므로 Brithday 공격에 취약합니다.
블록 크기 : 64비트
keySize : 32비트 ~ 448비트 가변 크기
하위 키 수 : 18 [P-array]
라운드 수 : 16
대체 상자의 수 : 4 [각각 32비트의 512개 항목을 가짐]
복호화는 하위 키가 역으로 사용 됩니다.
Blowfish 알고리즘을 사용하여 문자열을 암호화 후 복호화하는 샘플 코드를 보여드리겠습니다.
이 예제에서는 Python 언어의 crypto 라이브러리를 사용합니다.
pip install crypto
from Crypto.Cipher import Blowfish
from Crypto import Random
def encrypt(key, plaintext):
"""
Blowfish 알고리즘을 사용하여 주어진 키와 평문을 암호화합니다.
"""
# IV 생성
iv = Random.new().read(Blowfish.block_size)
# 암호화 키 생성
cipher = Blowfish.new(key, Blowfish.MODE_CBC, iv)
# 평문을 블록 크기에 맞게 패딩합니다.
plaintext = plaintext + b"\0" * (Blowfish.block_size - len(plaintext) % Blowfish.block_size)
# 평문을 암호화합니다.
ciphertext = iv + cipher.encrypt(plaintext)
return ciphertext
def decrypt(key, ciphertext):
"""
Blowfish 알고리즘을 사용하여 주어진 키와 암호문을 복호화합니다.
"""
# 초기화 벡터와 암호문을 분리합니다.
iv = ciphertext[:Blowfish.block_size]
ciphertext = ciphertext[Blowfish.block_size:]
# 복호화 키 생성
cipher = Blowfish.new(key, Blowfish.MODE_CBC, iv)
# 암호문을 복호화합니다.
plaintext = cipher.decrypt(ciphertext)
# 패딩을 제거합니다.
plaintext = plaintext.rstrip(b"\0")
return plaintext
# 예시
key = b'secret_key_12345' # 16바이트 이내로 지정
plaintext = b'This is a secret message!'
print(f"원본 텍스트: {plaintext}")
print(f'암호화 키: {key}' )
encrypted_text = encrypt(key, plaintext)
print(f"암호화된 텍스트: {encrypted_text}")
# 예시
decrypted_text = decrypt(key, encrypted_text)
print(f"복호화된 텍스트: {decrypted_text}")
출력결과
원본 텍스트: b'This is a secret message!'
암호화 키: b'secret_key_12345'
암호화된 텍스트: b'\xc5V9\xa4_\xe0\x82>J\xa2\t\xff-\xd1\xf5\x15\xce\x9c\xec\xd4\x87\xe1{\xd6\xd0-\xb5\xc1\xeb\xd7\xbb \xebo3\x1c\xbc\x99oo'
복호화된 텍스트: b'This is a secret message!'
복호화된 평문이 암호화할 때 사용한 "This is a secret message!" 문자열과 동일함을 확인할 수 있습니다.
blowfish 개념 참고 사이트
https://www.geeksforgeeks.org/blowfish-algorithm-with-examples/
'IT > Python' 카테고리의 다른 글
[Python] 환율 변환기 샘플 소스 (0) | 2022.12.09 |
---|---|
[Python] QR Code 생성 프로그램 만들기 예제 (0) | 2022.12.08 |
[Python] NTP 서버에서 시간 가져오기 (0) | 2022.09.28 |
리플릿(Repl.it) - Python 온라인 개발 환경 소개 (0) | 2022.05.11 |
[Python] Visual Studio Code(VS Code) 주석 처리 단축키 (0) | 2022.03.19 |
댓글