일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- pythonprogramming
- root me
- web-server
- system hacking
- burp suite
- 웹해킹
- CTF
- Over The Wire
- hackthissite
- 프로그래밍
- 인공지능
- 정보보안
- webhacking.kr
- sql injection bypass
- overthewire
- SQL Injection
- Wargame
- WebHacking
- write up
- 웹개발
- web hacking
- lord of sqlinjection
- XSS GAME
- 테크트렌드
- 웹해킹 기초
- geminipro
- 코딩
- 사이버보안
- 개발자
- Bandit
- Today
- Total
컴맹에서 컴공 그리고 화이트 해커가 되는 그날까지
[python] 파이썬을 활용하여 카이사르 암호 도구 만들기 본문
로마 황제 율리우스 카이사르(julius Caesar)는 그의 가족이나 친분이 두터운 신하에게 은밀한 내용을 보낼 때 암호문을 사용했다고 합니다.
오늘은 그래서 카이사르가 사용했던 카이사르 암호를 파이썬으로 구현해 보려고 합니다.
카이사르 암호는 원래의 문장에 있는 모든 알파벳 문자를 일정 크기만큼 이동시켜서 만듭니다.
원래 문장 | 바뀐 문장 |
A | B |
B | C |
C | D |
... | ... |
Z | A |
EX) I love python → J mpwf qzuipo
카이사르 암호의 공식 찾기
A | B | C | D | ... | Z |
0 | 2 | 3 | 4 | 25 |
표와 같이 알파벳 대문자 A~Z까지 26개의 문자를 부여해 봅니다.
이 표를 활용하여 원래 문장의 문자가 암호키에 따라 어떤 문자로 바뀌게 되는지 인덱스를 이용하여 규칙을 살펴볼 것입니다.
임호키 인덱스를 k, 원래 문장의 문자 인덱스를 i, 바뀐 문장의 문자 인덱스를 Enc(i)라고 하면
Enc(i) = (i+k) mod 26
여기서 mod는 모듈로 읽고 의미는 다음과 같습니다
a mod b → a를 b로 나눈 나머지
즉 "원래 문장의 문자 인덱스 i가 암호문에서 치환되는 문자 인덱스는 (i+k)를 26으로 나눈 나머지가 됩니다.
위에 카이사르 암호의 예시처럼 암호키가 B이면 암호키 인덱스는 k=1입니다. 이 경우의 카이사르 문자변환식은
Enc(i) = (i+1) mod 26이 됩니다.
이제 파이썬으로 만들 준비가 되었으니 한번 만들어 보겠습니다.
makeDisk(key) 함수 로직
우선 makeDiske(key)는 암호키 'key'를 입력 받아 카이사르 암호디스트를 구성합니다. 프로그래밍 편의상 암호화를 위한 enc_disk와 복호화를 위한 dec_disk를 생성한 후 이를 리턴합니다.
ASCII코드를 인자로 입력 받아 해당하는 ASCII문자로 리턴하는 함수가 chr()입니다.
chr(x+65)는 x+65에 해당하는 ASCII문자를 리턴합니다. 여기서 x는 0~25까지 이므로, x+65는 65~90까지 숫자가 되며,
이는 대문자 A~Z의 ASCII코드 값입니다.
위의 코드에서 enc_i = (i+k)%26 이 부분이 바로 Enc(i) = (i+k) mod 26을 구현한 것입니다.
파이썬에서 'mod' 연산자는 '%' 입니다.
만약 k 값이 1인경우 enc_disk, dec_disk는 다음과 같은 사전 자료가 됩니다.
enc_disk
키 | A | B | C | ... | Z |
값 | B | C | D | ... | A |
dec_disk
키 | B | C | D | ... | A |
값 | A | B | C | ... | Z |
caesar(msg, key, mode) 는 인자로 입력된 msg를 암호키 key로 암호문을 만들거나, 암호문을 평문으로 만듭니다.
mode는 암호화 할 것인지, 복호화 할 것인지 나타내는 플래그입니다.
makeDisk(key)를 호출하고 결과가 None이면 빈 문자를 리턴합니다.
mode가 ENC이면 enc_disk를, DEC이면 dec_disk를 변수 disk에 할당합니다.
만약 msg='010ILOVEPYTHON!', key='B', mode = ENC 인 경우
0,1,0,!는 else: ret += c를 수행하게 되고 ILOVEPYTHON은 ret += disk[c]를 수행하게 되어
ret은 010JMPWFQZUIPO!가 됩니다.
위 사진 main()은 I love python을 암호 키 B로 암호화, 복호화 한 결과를 출력하는 것입니다.
이렇게 오늘은 카이사르 암호에 대해 배워보고 파이썬을 활용하여 카이사르 암호를 구현해 보았습니다.
'프로그래밍 > python' 카테고리의 다른 글
무차별 대입 공격 (카이사르 암호 해독) (0) | 2025.02.24 |
---|---|
Streamlit 챗봇 디버깅: API 응답 문제 해결 완벽 가이드 (0) | 2025.02.24 |
파이썬 클래스 상속 정리 (0) | 2023.09.04 |
[python] 파이썬 공부 (0) | 2023.08.30 |
[python] 카이사르 암호 응용, 무차별 대입 공격 (0) | 2022.11.16 |