PYTHON/네트워크보안과 블록체인

[PYTHON] 대칭 키 암호화

G허니 2024. 8. 11. 20:05

대칭 키 암호화는 암호화와 복호화에 동일한 키를 사용하는 방식입니다. 이 방식의 장점은 속도가 빠르다는 점이며, 단점은 키 관리가 어렵다는 것입니다. 여기서는 세 가지 방법을 사용하여 암호화와 복호화를 수행합니다.

 

단일 치환 암호화

사전(E)과 사전(D)을 이용하여 입력받은 문장을 암호화하고 복호화하는 코드입니다.

 

import random

# 사전 E 생성
key = [chr(i) for i in range(ord('a'), ord('z') + 1)]
value = key.copy()
random.shuffle(value)

E = {k: v for k, v in zip(key, value)}
D = {v: k for k, v in E.items()}

def Encryption(text):
    table = text.maketrans(E)
    return text.translate(table)

def Decryption(text):
    table = text.maketrans(D)
    return text.translate(table)

# 사용자 입력
print("평문 입력: ", end='')
text = input().lower()
ciphertext = Encryption(text)
print("암호문: {}".format(ciphertext))
print("복호문: {}".format(Decryption(ciphertext)))

 

  • 입력된 평문을 사전 E를 사용하여 암호화하고, 암호문을 D를 사용하여 복호화합니다.
  • random.shuffle을 사용해 알파벳을 무작위로 섞어 새로운 매핑을 생성합니다.

 

Vigenere 암호화

Vigenere 암호는 키를 이용하여 각 문자를 다른 문자로 변환하는 방식입니다. 입력받은 키를 사용하여 암호화 및 복호화를 수행합니다.

 

def vigenere_E(text, key):
    text = text.upper().replace(" ", "")
    key = key.upper().replace(" ", "")
    cipher_text = ""
    key_index = 0

    for c in text:
        cipher_text += chr((ord(c) + ord(key[key_index]) - 2 * ord("A")) % 26 + ord("A"))
        key_index = (key_index + 1) % len(key)
    
    return cipher_text

def vigenere_D(text, key):
    text = text.upper().replace(" ", "")
    key = key.upper().replace(" ", "")
    cipher_text = ""
    key_index = 0

    for c in text:
        temp = (ord(c) - ord(key[key_index]) - 2 * ord("A")) % 26
        cipher_text += chr(temp + ord("A"))
        key_index = (key_index + 1) % len(key)
    
    return cipher_text

# 사용자 입력
plaintext = input("평문 입력: ")
key = input("Vigenere 암호 키? ")
vigenere_ciphertext = vigenere_E(plaintext, key)
print("암호문:", vigenere_ciphertext)
print("복호문:", vigenere_D(vigenere_ciphertext, key))

 

  • 비제네르 암호는 평문의 각 문자에 키의 문자를 더하고, 키가 끝나면 반복하여 적용합니다.
  • 대문자로 변환 후, 공백을 제거하여 암호화합니다.

 

Auto 키 암호

자동 키 암호는 첫 번째 문자의 값을 키로 사용하여 암호화하는 방식입니다.

 

def autokey_E(text, key):
    text = text.upper().replace(" ", "")
    cipher_text = ""

    for i in range(len(text)):
        temp = chr((ord(text[i]) - ord("A") + int(key)) % 26 + ord("A"))
        cipher_text += temp
        key = ord(text[i]) - ord("A")

    return cipher_text

def autokey_D(text, key):
    text = text.upper().replace(" ", "")
    cipher_text = ""

    for i in range(len(text)):
        temp = (ord(text[i]) - int(key) - ord("A")) % 26
        cipher_text += chr(temp + ord("A"))
        key = ord(cipher_text[i]) - ord("A")
    
    return cipher_text

# 사용자 입력
key = input("자동 키 암호 키? ")
autokey_ciphertext = autokey_E(plaintext, key)
print("암호문:", autokey_ciphertext)
print("복호문:", autokey_D(autokey_ciphertext, key))

 

  • 첫 번째 문자의 값을 키로 사용하여 암호화하며, 각 문자에 대해 키를 갱신합니다.
  • 이 방법은 입력하는 동안 키가 지속적으로 변하는 특징이 있습니다.

 

AES 암호화

AES(Advanced Encryption Standard)는 대칭키 암호화 알고리즘으로, 데이터를 안전하게 암호화하고 복호화하기 위해 널리 사용됩니다. AES는 미국 국립표준기술연구소(NIST)에 의해 2001년에 승인되었으며, DES(Data Encryption Standard)를 대체하기 위해 개발되었습니다.

 

from cryptography.fernet import Fernet

key = Fernet.generate_key()

fernet = Fernet(key)

with open('data.txt', 'rb') as f:
    data = f.read()

encrypt_data = fernet.encrypt(data)

with open('encrypted.txt', 'wb') as f:
    f.write(encrypt_data)

with open('encrypted.txt', 'rb') as f:
    encrypt_data = f.read()

decrypt_data = fernet.decrypt(encrypt_data)

print(decrypt_data.decode())

 

  • Fernet를 사용하여 파일에 저장된 데이터를 암호화 합니다.
  • 그 암호화된 데이터를 다시 읽어 복호화하여 원래의 데이터를 출력합니다.
  • Fernet는 대칭키 암호화 방식을 사용하므로, 같은 키로 암호화와 복호화를 수행합니다.

 

깃허브

https://github.com/Ghoney99/Network-Secure-and-BlockChain