본문 바로가기
IT/Python

[Python] Blowfish(블로우피쉬) 대칭키 알고리즘 개념 및 python 암복호화 샘플코드

by 초록술 2022. 10. 14.
반응형

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/

 

Blowfish Algorithm with Examples - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

반응형

댓글