Notice
Recent Posts
Recent Comments
Today
Total
05-20 00:03
Archives
관리 메뉴

Jeongchul Kim

CaesarCiper.py 본문

Computer Language

CaesarCiper.py

김 정출 2015. 1. 16. 16:39
시저 암호, 암호학, Caesar Ciper, 암호, 암호문, 평문, 복호화, 부호화, Shift, ASCII, 
  1. # Caesar Cipher edit version
  2.  
  3. # 암호화에 대한 과학을 암호학(cryptography)이라고 한다.
  4. # 비밀 코드 시스템은 암호(cipher)라고 한다.
  5. # 암호학에서 암호화 하고자 하는 메시지를 평문(plaintext)라고 한다.
  6. # 평문을 암호화된 문장으로 만들 때 암호화(encrypting)한다고 한다.
  7. # 평문은 암호문(ciphertext)으로 암호화된다.
  8. # 암호문은 의미 없는 임의의 글자의 연속으로 보인다(가비지 데이터(garbage data)라고 한다.)
  9. # 암호화 시에는 암호문을 평문으로 해독(decrypt)할 수 있다.
  10. # 많은 암호는 키를 사용하며, 키(key)는 비밀 값이며, 특정 암호로 암호화한 암호문을 해독 할 수 있다.
  11.  
  12. # 시저 암호(Caesar Cipher)
  13. # 시저 암호에서 키는 1~26까지의 숫자이다.
  14. # 시저 암호는 매우 일찌감치 발명된 암호이다.
  15. # a~z 까지 0~25라는 숫자를 할당한다, 이 후에 암호화시 key값의 정수만큼 shift옮긴다.
  16. #    ex) key 1인 경우 a~z 1~26값이 되버린다. a->b b->c ... z->a가 된다.
  17. # C:암호문, M:복호문, P:평문, K: key 정의 시
  18. #  -> 암호화 과정 : C = P + K mod 26
  19. #  -> 복화화 과정 : M = C - K mod 26
  20. # 시저 암호의 경우 경우의 수가 적기 때문에 전수 조사 공격(brute force attack)에 매우 취약하다.
  21. # 말인 즉슨 시저 암호에서 가능한 모든 경우데 대해 조사하여 원래의 문장을 알아내는 것이다.
  22.  
  23. # ASCII와 글자를 숫자로 대신하기
  24. # 'A'~'Z' ASCII번호 65~90 // 'a'~'z'는 ASCII번호 97~122 // 0~9 ASCII번호 48~57
  25. # chr(1)함수 : ASCII번호를 파라미터로 받아 하나의 글자로 된 문자열 반환 ->> chararcter
  26. # ord('a')함수 : 하나의 글자로 된 문자열을 받아 문자의 ASCII 값을 반환한다. ->> ordinal
  27.  
  28. MAX_KEY_SIZE = 26
  29.  
  30. def getMode():
  31.     while True:
  32.         print('Do you wish to encrypt or decrypt a message?')
  33.         mode = input().lower()
  34.         if mode in 'encrypt e decrypt d brute b'.split():
  35.             # split()메소드 : 문자열 분할 ->여기서는 빈칸으로 분할
  36.             return mode
  37.         else:
  38.             print('Enter either "encrypt" or "e" or "decrypt" or "d" or "brute" or "b".')
  39.  
  40. def getMessage():
  41.     print('Enter your message:')
  42.     return input()
  43.  
  44. def getKey():
  45.     key = 0
  46.     while True:
  47.         print('Enter the key number (1-%s)' % (MAX_KEY_SIZE))
  48.         # print('%s',%(문자열)) 문자열로 된 변수 삽입하기
  49.         key = int(input())
  50.         if (key >= 1 and key <= MAX_KEY_SIZE):
  51.             return key
  52.  
  53. # mode 암호화/해독, message 평문/암호문, key 암호 사용키
  54. def getTranslatedMessage(mode, message, key):
  55.     if mode[0] == 'd'# d로 시작할 경우 해독한다.
  56.         key = -key # 해독할 경우 key 음수 처리한다
  57.         # 해독할 경우 shift만큼 빼야하므로
  58.     translated = ''
  59.  
  60.     for symbol in message:
  61. # isalpha() 문자열 메소드 : 문자열이 대.소문자 알파벳이면 True를 반환한다, 이외의 글자가 있을 경우 False를 반환
  62.         if symbol.isalpha():
  63.             num = ord(symbol) # symbol를 ASCII코드 값으로 반환한다.
  64.             num += key  # key값 만큼 더하여 shift한다  
  65. # isupper() 문자열 메소드 : 문자열에 대문자만 있으면 True를 반환한다.
  66.             if symbol.isupper():
  67.                 if num > ord('Z')# Z보다 커지면 26을 빼 순환 시킨다
  68.                     num -= 26
  69.                 elif num < ord('A')# A보다 값이 작아지면 26을 더해 순환시킨다.
  70.                     num += 26
  71. # islower() 문자열 메소드 : 문자열에 소문자만 있으면 True를 반환한다.
  72.             elif symbol.islower():
  73.                 if num > ord('z'):
  74.                     num -= 26
  75.                 elif num < ord('a'):
  76.                     num += 26
  77.  
  78.             translated += chr(num) # 번역된 것을 문자를 문자열에 붙인다.
  79.         else:
  80.             translated += symbol # 글자가 아닌 심볼은 그냥 붙인다.
  81.             # 그러므로 빈칸, 숫자, 마침표 같은 문자는 암호,해독 되지도 않는다.
  82.     return translated
  83.  
  84. mode = getMode()
  85. message = getMessage()
  86. if mode[0] != 'b':
  87.     key = getKey()
  88.    
  89. print('Your translated text is:')
  90.  
  91. if mode[0] != 'b':
  92.     print(getTranslatedMessage(mode, message, key))
  93. else : # 전수 조사 모드를 사용한다. for문을 이용해 전체를 출력한다.
  94.     for key in range(1,MAX_KEY_SIZE+1):
  95.         print(key,getTranslatedMessage('decrypt',message,key))
  96.  
  97.  



'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
Comments