반응형
Python으로 txt파일을 읽어와서 시저암호를 이용해 암호화하고 새로운 txt파일로 저장하는 프로그램을 작성했다. 불러오려고 하는 파일과 작성하는 파이썬 파일이 같은 디렉터리 내에 있어야 한다. os 라이브러리의 getcwd()를 이용하면 현재 작동하는 디렉터리를 알 수 있다. 만약 디렉터리를 변경하고 싶다면 os.chdir()을 이용하면 될 것이다. 파일을 그냥 open하려고 하니 오류가 발생해서, encoding='UTF8'을 추가해줬더니 잘 작동됐다.
암호화 함수를 라이브러리에 저장하여 사용했고, 터미널에는 평문과 암호문을 30글자씩 출력해 보여주도록 했다.
평문, 즉 읽어오는 파일의 이름은 article.txt이고, 암호한 결과를 저장한 파일의 이름은 article_cipher.txt 이다. 이미 article_cipher.txt 파일이 존재하면 overwrite할건지 물어보도록 했다.
Caesar_encrypt.py
"""
================================
Caesar Encrypt Program
================================
"""
import caesar_lib as cs
import os, sys
#=== Read Message from a file...
in_file_name = 'article.txt'
print('Current Working Directory: ', os.getcwd())
#--- changing working directory: os.chdir()
if not os.path.exists(in_file_name):
print("File %s does not exist." %(in_file_name))
sys.exit()
inFileObj = open(in_file_name, 'rt', encoding='UTF8')
msg = inFileObj.read()
inFileObj.close()
key = 3
cipher_msg = cs.encrypt(msg, key)
#=== Write Ciphertext Message to a file...
out_file_name = 'article_cipher.txt'
if os.path.exists(out_file_name):
print('Overwrite %s? (Y)es or (N)o' %(out_file_name))
response = input('===> ')
if not response.lower().startswith('y'):
sys.exit()
outFileObj = open(out_file_name, 'w', encoding='UTF-8')
outFileObj.write(cipher_msg)
outFileObj.close()
print("PT = %s..." %(msg[0:30])) //앞에 30글자만 출력
print("CT = %s..." %(cipher_msg[0:30]))
caesar_lib.py
"""
===================================================
Ceasar Cipher Library
===================================================
"""
## 함수로 구현된 시저암호
def encrypt(msg, key):
upAlphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
lowAlphabet = 'abcdefghijklmnopqrstuvwxyz'
ciphertext_msg = ''
for ch in msg:
if ch in upAlphabet:
idx = upAlphabet.find(ch)
new_idx = (idx + key) % 26
cipher_ch = upAlphabet[new_idx]
ciphertext_msg = ciphertext_msg + cipher_ch
elif ch in lowAlphabet:
idx = lowAlphabet.find(ch)
new_idx = (idx + key) % 26
cipher_ch = lowAlphabet[new_idx]
ciphertext_msg = ciphertext_msg + cipher_ch
else:
ciphertext_msg = ciphertext_msg + ch
return ciphertext_msg
이렇게 같은 디렉터리 안에 article_cipher 파일이 만들어 저장된다.
Key=3인 시저암호로 암호화 했으니, 각 알파벳들이 3칸씩 뒤로 밀려 정상적으로 암호화 된 것을 확인할 수 있다.
반응형
'Language > Python' 카테고리의 다른 글
[Python] 문자열 공백 제거하기 (replace, strip, lstrip, rstrip) (0) | 2021.07.12 |
---|---|
[Python] txt 파일 내의 모든 알파벳 개수 세기 (0) | 2021.03.27 |