시저 암호, 암호학, Caesar Ciper, 암호, 암호문, 평문, 복호화, 부호화, Shift, ASCII,
- # Caesar Cipher edit version
- # 암호화에 대한 과학을 암호학(cryptography)이라고 한다.
- # 비밀 코드 시스템은 암호(cipher)라고 한다.
- # 암호학에서 암호화 하고자 하는 메시지를 평문(plaintext)라고 한다.
- # 평문을 암호화된 문장으로 만들 때 암호화(encrypting)한다고 한다.
- # 평문은 암호문(ciphertext)으로 암호화된다.
- # 암호문은 의미 없는 임의의 글자의 연속으로 보인다(가비지 데이터(garbage data)라고 한다.)
- # 암호화 시에는 암호문을 평문으로 해독(decrypt)할 수 있다.
- # 많은 암호는 키를 사용하며, 키(key)는 비밀 값이며, 특정 암호로 암호화한 암호문을 해독 할 수 있다.
- # 시저 암호(Caesar Cipher)
- # 시저 암호에서 키는 1~26까지의 숫자이다.
- # 시저 암호는 매우 일찌감치 발명된 암호이다.
- # a~z 까지 0~25라는 숫자를 할당한다, 이 후에 암호화시 key값의 정수만큼 shift옮긴다.
- # ex) key 1인 경우 a~z 1~26값이 되버린다. a->b b->c ... z->a가 된다.
- # C:암호문, M:복호문, P:평문, K: key 정의 시
- # -> 암호화 과정 : C = P + K mod 26
- # -> 복화화 과정 : M = C - K mod 26
- # 시저 암호의 경우 경우의 수가 적기 때문에 전수 조사 공격(brute force attack)에 매우 취약하다.
- # 말인 즉슨 시저 암호에서 가능한 모든 경우데 대해 조사하여 원래의 문장을 알아내는 것이다.
- # ASCII와 글자를 숫자로 대신하기
- # 'A'~'Z' ASCII번호 65~90 // 'a'~'z'는 ASCII번호 97~122 // 0~9 ASCII번호 48~57
- # chr(1)함수 : ASCII번호를 파라미터로 받아 하나의 글자로 된 문자열 반환 ->> chararcter
- # ord('a')함수 : 하나의 글자로 된 문자열을 받아 문자의 ASCII 값을 반환한다. ->> ordinal
- MAX_KEY_SIZE = 26
- def getMode():
- while True:
- mode = input().lower()
- # split()메소드 : 문자열 분할 ->여기서는 빈칸으로 분할
- return mode
- else:
- def getMessage():
- def getKey():
- key = 0
- while True:
- # print('%s',%(문자열)) 문자열로 된 변수 삽입하기
- if (key >= 1 and key <= MAX_KEY_SIZE):
- return key
- # mode 암호화/해독, message 평문/암호문, key 암호 사용키
- def getTranslatedMessage(mode, message, key):
- if mode[0] == 'd': # d로 시작할 경우 해독한다.
- key = -key # 해독할 경우 key 음수 처리한다
- # 해독할 경우 shift만큼 빼야하므로
- translated = ''
- for symbol in message:
- # isalpha() 문자열 메소드 : 문자열이 대.소문자 알파벳이면 True를 반환한다, 이외의 글자가 있을 경우 False를 반환
- if symbol.isalpha():
- num += key # key값 만큼 더하여 shift한다
- # isupper() 문자열 메소드 : 문자열에 대문자만 있으면 True를 반환한다.
- if symbol.isupper():
- num -= 26
- num += 26
- # islower() 문자열 메소드 : 문자열에 소문자만 있으면 True를 반환한다.
- elif symbol.islower():
- num -= 26
- num += 26
- else:
- translated += symbol # 글자가 아닌 심볼은 그냥 붙인다.
- # 그러므로 빈칸, 숫자, 마침표 같은 문자는 암호,해독 되지도 않는다.
- return translated
- mode = getMode()
- message = getMessage()
- if mode[0] != 'b':
- key = getKey()
- if mode[0] != 'b':
- else : # 전수 조사 모드를 사용한다. for문을 이용해 전체를 출력한다.
- for key in range(1,MAX_KEY_SIZE+1):
'Computer Language' 카테고리의 다른 글
02 Python 자료형 (0) | 2015.01.28 |
---|---|
ReversiGame.py (0) | 2015.01.16 |
SonarGame.py (0) | 2015.01.14 |
CartesianCorrdinateSystems.py (0) | 2015.01.14 |
BaseBallGame.py (0) | 2015.01.13 |