[목차]

 

 

1. 시저 암복호화 프로그램 코딩1

2. 시저 암복호화 프로그램 코딩2

3. 단일 치환 암호 코딩

4. 주상 전치 암복호화 문제 풀기

5. 정리

 

 

 

 

 


 

 

 

 

 

[시저 암복호화 프로그램 코딩1]

 

#!/usr/bin/python3
# input : str('nice to meet you')
# encryption system: caesar cipher
# key : 5
# output : str('SNHJ YT RJJY DTZ')
# make encryption and decryption book
#   * encbook = {'A': 0, 'B': 1, 'C': 2, ...}
#   * decbook = {0 : 'A', 1 : 'B', 2 : 'C', ...}


import sys



def main():
    plaintext = 'nice to meet you!'
    key = 5
    encbook, decbook = makebook()


    # (1) encryption
    key = 5
    encrypted = translate(plaintext, key, encbook, decbook, 'encryption')
    print('Plaintext: ', plaintext)
    print('Enctrypted: ', encrypted)


    # (2) decryption
    key = -5
    decrypted = translate(encrypted, key, encbook, decbook, 'decryption')
    print("Decrypted: ", decrypted)


def translate(msgs, key, enc, dec, mode):
    # input : dict(encbook), dict(decbook), int(key), str(msgs), str(encryption|decryption)
    # output : str(translated)
    # function:
    # * caesar Cipher Algorithm: C = ( P + K ) mod 26
    # print(msg, key, enc)
    translated = ''
    if mode == 'encryption':
        msgs = msgs.upper()
    for msg in msgs:
        # print(msg)
        if msg in enc:
            dict_key = (enc[msg] + key) % 26
            translated += dec[dict_key]
        else:
            translated += msg

    if mode == 'decryption':
        results = translated.lower()
        return results

    return translated


def makebook():
    # input: None
    # output: dict(encbook), dict(decbook)
    # function: encbook, decbook을 만든다.
    encbook = {}
    decbook = {}
    for i in range(0, 26):
        print(chr(65 + i),i)
        key = chr(65+i)
        value = i
        encbook[key] = value
        decbook[value] = key
    print(encbook, decbook)

    return encbook, decbook



if __name__ == '__main__':
    main()

 

 

 

 


 

 

 

 

[시저 암복호화 프로그램 코딩 2]

def main():
    mysymbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 !?."
    mymsgs = "This is my secret plaintext."
    mykey = 13

    encrypted = enc_caesar_cipher(mymsgs, mykey, mysymbols)
    print("Plaintext: ", mymsgs)
    print("Ciphertext: ", encrypted)

    decrypted = dec_casesar_cipher(encrypted, mykey, mysymbols)
    print("Decrypted :", decrypted)

def dec_casesar_cipher(msgs, key, symbols):
    # print(msgs, key, symbols)
    dec_str = ''
    for msg in msgs:
        #print(msg)
        if msg in symbols:
            # P = (C - Key) % len(symbols)
            symbols_index = symbols.find(msg)
            symbols_len = len(symbols)
            translated_index = (symbols_index - key) % symbols_len
            dec_str += symbols[translated_index]
        else:
            dec_str += msg

    return dec_str

def enc_caesar_cipher(msgs, key, symbols):
    # input: str(msg), int(key), str(symbol)
    # output: enc_str
    # function:
    # print(msgs, key, symbols)
    enc_str = ''
    for msg in msgs:
        # print(msg)
        if msg in symbols:
            # C = (P + K) % len(symbols)
            symbols_index = symbols.find(msg)
            #print(symbols_index) ; input()
            symbols_len = len(symbols)
            translated_index = (symbols_index + key) % symbols_len
            enc_str += symbols[translated_index]
        else:
            enc_str += msg

    return enc_str



if __name__ == "__main__":
    main()

 

 

 

위 파일을 모듈로 활용해 작성한 코드

import caesarCipher

myencrypted_msg = "guv5Jv5Jz!J5rp4r6J2ynv06r 6M"
mysymbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 !?."


def main():

    for key, ch in enumerate(mysymbols):
        # print(key, ch)
        decrypted = caesarCipher.dec_casesar_cipher(myencrypted_msg, key, mysymbols)
        print("Key #%d: %c - |%s|" %(key, ch, decrypted))

if __name__ == '__main__':
    main()

 

 

 

 

 


 

 

 

 

[단일 치환 암호 코딩]

 

 

# input : encbook, decbook, str('hello world')
#   * encbook = {'h':'A', 'e':'K',...}
#   * decbook = {'A':'h', 'K':'e',...}
# output : encrypted_msg or decrypted_msg
# function :


def main():
    myencbook = {'h': 'A', 'e': 'K', 'l': 'O', 'o': 'B', 'w': 'L', 'r': 'Z', 'd': 'Y'}
    mydecbook = makebook(myencbook)
    # print(mydecbook)
    mymsg = 'hello world!!'

    # (1) encryption
    encrypted = substitution(mymsg, myencbook)
    print("Plaintet : ", mymsg)
    print("Ciphertext: ", encrypted)
    # (2) decryption
    decrypted = substitution(encrypted, mydecbook)
    print("Decryted : ", decrypted)


def substitution(msg, keytab):
    # input: str(msg), dic(keytab)
    # output : str(enc_msg|dev_msg)
    # print(msg, enc)
    translated = ''
    for i in msg:
        # print(i)
        if i in keytab:
            translated += keytab[i]
        else:
            translated += i
    # print(translated)
    return translated


def makebook(enc):
    # input : dict(enc)
    # output : dict(dec)
    # decbook = {v: k for k, v in enc.items()}
    # print(decbook)
    return {v: k for k, v in enc.items()}


if __name__ == '__main__':
    main()

 

 

 


 

 

 

 

[주상 전치 암복호화 문제풀기]

 

 

 

transposition_Encrypt.py

# 주상 전치 암호화 - 1st version

#

# (1) 입력 : 평문 메세지 (Input: Common sense is not so common.)

# (2) 출력 : 주상 전치 암호화/복호화 후 메세지 (Ouput: |Cenoonommstmme oo snnio. s s c|)

# (3) 기능 :

# * 평문 메세지를 입력으로 받아서

# * 주상 전치 암호화 알고리즘을 이용하여 암호화/복호화 한다.

# (4) [참고] 전치 암호화 과정

# 1) messages와 key의 문자 수를 센다.

# 2) 키와 같은 개수의 상자를 한줄에 그린다.(예: 키가 8개면 상자 8개)

# 3) 왼쪽에서 오른쪽으로 상자를 채우고 상자 한개에 글자 한개를 넣는다.

# 4) 문자가 상자 끝에 이르면 상자의 줄을 한 줄 더 그린다.

# 5) 마지막 문자까지 오면 마지막 행에 있는 사용하지 않은 상자는 칠해 둔다.

# 6) 왼쪽 상단부터 시작해 각 열을 내려가면서 문자를 쓴다.

# 열의 가장 아래에 이르면 오른쪽의 다음 열로 이동한다.

# 지운 상자는 건너뛴다. 이것이 암호문이 된다.

 

암호시스템 : 주상 전치 암호

 : 8

입력 평문 : Common sense is not so common.

출력 암호문: ?

 

import transpositionDecrypt


def main():
    mymsgs = "Common sense is not so common."
    mykey = 8

    enc_msg = encrypt_transposition(mymsgs, mykey)
    print("Plaintext: |%s|" % mymsgs)
    print("Ciphertext: |%s| " % enc_msg)

    dec_msg = transpositionDecrypt.decrypt_transposition(enc_msg, mykey)
    print("Decrypted : |%s|" % dec_msg)


def encrypt_transposition(msgs, key):
    encrypted = [''] * key
    print(encrypted)

    for n, ch in enumerate(msgs):
        # print(n, ch)
        list_index = n % key
        encrypted[list_index] += ch

    return ''.join(encrypted)

if __name__ == '__main__':
    main()

 

 

 

 

transposition_Decrypt.py

 

# 주상 전치 복호화 - 1st version

#

# (1) 입력 : 평문 메세지 (Input: Common sense is not so common.)

# (2) 출력 : 주상 전치 암호화/복호화 후 메세지 (Ouput: )

# (3) 기능 :

# * 평문 메세지를 입력으로 받아서

# * 주상 전치 암호화 알고리즘을 이용하여 암호화/복호화 한다.

# (4) [참고] 전치 암호화 과정

# 1) messages와 key의 문자 수를 센다.

# 2) 키와 같은 개수의 상자를 한줄에 그린다.(예: 키가 8개면 상자 8개)

# 3) 왼쪽에서 오른쪽으로 상자를 채우고 상자 한개에 글자 한개를 넣는다.

# 4) 문자가 상자 끝에 이르면 상자의 줄을 한 줄 더 그린다.

# 5) 마지막 문자까지 오면 마지막 행에 있는 사용하지 않은 상자는 칠해 둔다.

# 6) 왼쪽 상단부터 시작해 각 열을 내려가면서 문자를 쓴다. 열의 가장 아래에 이르면 오른쪽의 다음 열로 이동한다.

# 지운 상자는 건너뛴다. 이것이 암호문이 된다.

 

암호 시스템: 주상 전치 암호

입력 암호문: Cenoonommstmme oo snnio. s s c

 : 8

출력 평문 : ?

 

 

■ 올림

import math

math.ceil(len(messages)/key)

■ 올림, 내림, 반올림

math.ceil() : 올림,

meth.floor(), 내림,

math.round() : 반올림

 

 

import math


def main():
    mymsgs = "Cenoonommstmme oo snnio. s s c"
    mykey = 8

    decrypt_transposition(mymsgs, mykey)

def decrypt_transposition(msgs, key):
    # input : str(msgs(encrypted))
    # output : int(key)
    # print(msgs, key)
    msgs_size = len(msgs)
    list_index = math.ceil(msgs_size / key)
    total_array_size = key * list_index
    black_box_size = total_array_size - msgs_size
    #print("=> 30 :", msgs_size)
    #print("=> 32 :", total_array_size)
    #print("=> 2 : ", black_box_size)

    black_box_list = []
    for i in range(black_box_size):
        black_box_index = (total_array_size -1) - (i * list_index)
        black_box_list.append(black_box_index)
    black_box_list.reverse() # or .sort()
    # print(black_box_list)
    for num in black_box_list:
        msgs = msgs[:num] + '^' + msgs[num:]

    decrypted = [''] * list_index
    for n, ch in enumerate(msgs):
        # print(n, ch)
        decrypted_list_index = n % list_index
        decrypted[decrypted_list_index] += ch
    # print("=>", decrypted)
    decrypted = ''.join(decrypted)
    decrypted = decrypted[:msgs_size]
    # print("Decrypted : |%s|" % decrypted)
    return decrypted

if __name__ == '__main__':
    main()

 

 

 


 

 

 

[정리]

 

 

고전 암호

치환(Substitution) & 전치(Trasposition)

* 치환(Substitution) 암호 = 대치 암호

* 전치(Transposition) 암호 = 전이식 암호 = 이동 암호

암호단위:(고전암호)문자, (현대암호)비트

 

 

 

치환암호

단일 치환 암호

* 1:1 치환 암호 방식

* 빈도 정보를 통해 복호화가 가능하다(알파벳, 단어 등의 빈도 수)

* 암호문이 길수록 복호화가 쉬워진다.

* (예) 시저(caesar) 암호 -> Brute Force Attack

* (예) 아핀(affine) 암호 -> 문자/문자열 빈도수

 

다중 치환 암호

* 하나의 평문 알파벳에서 여러 암호 알파벳이 나올수 있다.

* 빈도 정보를 통해 복호화가 가능하다.(알파벳, 단어 빈도 수)

* 암호문이 길수록 보호화가 쉬워진다.

* (예) 비즈니어(Vigenere) 암호

-> 카시스키 분석법, 프리드만 암호공격을 통해 복호화가 가능하다.

 

 

전치암호

단일(단순) 전치 암호

* 문자의 순서를 재배치

* 암호문과 평문이 같은 문자 조합을 갖는다.

* (예) 단일 전치 암호

 

728x90

+ Recent posts