소스코드
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 변수)
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 |