소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
ENC = 0
DEC = 1
def encrypt(text, key):
    crypt_text = ""
    for n, letter in enumerate(text):
        if n >= len(key):
            n = n%len(key)
        print_text = operation(letter, key[n], ENC)
        crypt_text += print_text
        print("plain -> crypt : " + letter + "→" + print_text + " key : " + key[n]) 
    print("Crypt_Text : "+crypt_text)
    
    
    
def decrypt(text, key):
    decrypt_text = ""
    for n, letter in enumerate(text):
        if n >= len(key):
            n = n%len(key)
        print_text = operation(letter, key[n], DEC)
        decrypt_text += print_text
        print("crypt -> plain : " + letter + " → " + print_text + " key : " + key[n])
    print("Decrypt_Text : "+decrypt_text)
    
    
    
def operation(letter, key, action):
    key_value = ord(key)-ord('a')
    if letter.isupper():
        plain_value = ord(letter) - ord('A')
        if action == DEC:
            key_value = -key_value
        result = (plain_value + key_value)%26
        result_text = chr(result + ord('A'))
        
    elif letter.islower():
        plain_value = ord(letter) - ord('a')
        if action == DEC:
            key_value = -key_value
        result = (plain_value + key_value)%26
        result_text = chr(result + ord('a'))
        
    else :
        result_text = letter    
        
    return result_text
    
    
    
def error(text, key):
    if not key.isalpha() or not key.islower() or len(key)>10:
        print("Please Check the Key")
        exit();
    elif len(text) > 255:
        print("Please Check the Text")
        exit();
    else :
        pass        
        
        
        
def select_option():
    option = input("암호화 하려면 1, 복호화 하려면 2 : ")
    if option == '1':
        text = input("평문을 입력하여 주십시오: ")
        key = input("키를 입력하여 주십시오(소문자) : ")
        error(text, key)
        encrypt(text, key)
        
    elif option == '2':
        text = input("암호문을 입력하여 주십시오: ")
        key = input("키를 입력하여 주십시오(소문자) : ")
        error(text, key)
        decrypt(text, key)
    
    else:
        print("Please Check the Option")        
        
        
        
if __name__ == '__main__':
    select_option()
cs



소스코드 해설 (letter 변수)


암호화를 할 것인지 복호화를 할 것인지 입력 받은 후 문자열(text)과 key를 encrypt, decrypt 함수로 넘겨준다. enumerate(text) 내장 함수를 이용하여 문자 하나당 인덱스 값을 넘겨 받는다.

변수이름

n

letter

역할

인덱스 넘버

문자 하나

예시

text = abcde

n = 0, letter = a

n = 1, letter = b



 

대문자

소문자

연산

ord(letter) - ord(‘A’)

ord(letter) - ord(‘a’)

연산

문자의 아스키 코드 65

문자의 아스키 코드 - 97

평문

A ~ Z

a ~ z

평문 값

00 ~ 25

00 ~ 25



소스코드 해설 (key 변수)


문자길이가 키 길이보다 길면 n 값이 넘게 되므로 %연산자를 사용하여 나머지 값을 이용해 key의 인덱스 값 설정한다. 

ex) text = abcd, key = ab → n = 0~3, letter = a, b, c, d => key 길이는 2 일 경우

인덱스 값은 0,1 이지만 여기서 enumerate(text)로 구한 인덱스 값은 0~3이 되므로 2~3의 인덱스 값을 가지지 않는다. 

따라서, %연산자를 사용하여 나머지를 구해야 한다. 즉, 2 % 2 = 0 , 3 % 2 = 1 이 되도록 한다. 

(만약 마이너스만 사용하면 한 차례는 가능하지만 두바퀴 때부터 불가능) key 값을 받아 왔으면 연산 함수에 넣어 key 값을 연산한다.



연산

ord(letter) - ord(‘a’)

연산

문자의 아스키 코드 - 97

key

a ~ z

key

00 ~ 25



소스코드 해설 (action 변수)


함수를 넘길 때, 암호화 할 것인지 복호화 할 것인지 입력 받은 후 암호화 할 것이면 그대로 평문 값고 더하여 연산해주고, 복호화 할 것이면 key 값을 ‘-’로 하여 더해 연산해준다. result_text 로는 chr 모듈을 사용하여 아스키 코드 값을 다시 영문자로 바꿔 출력할 수 있도록 한다.



결과


암호화와 복호화의 경우를 선택하고 key를 설정한다. 이를 통해 key 길이만큼 암/복호화가 진행되고 결과물을 출력한다. 평문이 255글자이상일 경우, key 길이제한 및 대문자 입력의 경우, 특수문자 입력 시 오류가 난다. 

 초기 소스


초기에 소스코드 코딩 시 짧은 소스만 강조하여 읽기 어렵게 해놨다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
def encrypt(text, key):
    crypt_text = ""
    for n, letter in enumerate(text):
        if n >= len(key):
            n = n%len(key)
        if letter.isupper():
            crypt_text = crypt_text + chr((((ord(letter)-65)+(ord(key[n])-97))%26)+65)
        elif letter.islower():
            crypt_text = crypt_text + chr((((ord(letter)-97)+(ord(key[n])-97))%26)+97)
        else:
            crypt_text = crypt_text + letter
    print("Crypto_Text : "+crypt_text)
    
def decrypt(text, key):
    decrypt_text = ""
    for n, letter in enumerate(text):
        if n >= len(key):
            n = n%len(key)
        if letter.isupper():
            decrypt_text = decrypt_text + chr((((ord(letter)-65)-(ord(key[n])-97))%26)+65)
        elif letter.islower():
            decrypt_text = decrypt_text + chr((((ord(letter)-97)-(ord(key[n])-97))%26)+97)
        else:
            decrypt_text = decrypt_text + letter
            
    print("Decrypto_Text : "+decrypt_text)
 
def main():
    option = input("암호화 하려면 1, 복호화 하려면 2 : ")
    if int(option) == 1:
        text = input("평문을 입력하여 주십시오: ")
        key = input("키를 입력하여 주십시오(소문자) : ")
        if not key.isalpha() or not key.islower() or len(key)>10:
            print("Please Check the Key")
            exit();
        encrypt(text, key)
        
    elif int(option) == 2:
        text = input("암호문을 입력하여 주십시오: ")
        key = input("키를 입력하여 주십시오(소문자) : ")
        if not key.isalpha() or not key.islower() or len(key)>10:
            print("Please Check the Key")
            exit();
        decrypt(text, key)
    
    else:
        print("Please Check the Option")
        
if __name__ == '__main__':
    main()
cs


crypt_text = crypt_text + chr((((ord(letter)-65)+(ord(key[n])-97))%26)+65) 이런식으로 한 줄에 다 작성하려고 하니 보기가 어려워 본래 소스코드처럼 보기 단순화해놨다.

'공부 > Python' 카테고리의 다른 글

[DB] INT 형 삽입  (0) 2020.03.21
python venv 설치방법  (0) 2019.11.05
[전자서명]Python OpenSSL  (0) 2018.07.17

+ Recent posts