프롤로그
이 글은 "화이트 해커를 위한 암호화 해킹" 을 이용하여 공부하는 걸 기록하기 위한 글이다.
주요 내용
I love you 라는 평문이 있을 때, a -> 2, b -> d 이런식으로 각 단어들을 다른 단어로 치환해서 새로운 암호문을 만드는 것을 가장 첫 번째 코드로 나온다.
첫 장이다 보니까 파이썬 기초문법들이 나오는데, 나는 이미 백준 골드3을 파이썬으로만 300문제 이상 풀었기에 기초 문법은 다 알고 있어서 그냥 한 번 슥 훑어보면서 넘어갔다. 그래서 여기 설명에도 안 적을 거다.
단문 암호화 복호화 하기
코드
def makeCodebook():
decbook = {"5":"a", "2":"b", "#":"d", "8":"e", "1":"f", "3":"g", "4":"h", "6":"i", "0":"l", "9":"m",
"*":"n", "%":"o", "=":"p", "(":"r", ")":"s", ";":"t", "?":"u", "@":"v", ":":"y", "7":" "};
encbook = {};
for k in decbook:
val = decbook[k];
encbook[val] = k;
return encbook, decbook
def encrypt(msg, encbook):
for c in msg:
if c in encbook:
msg = msg.replace(c, encbook[c]);
return msg;
def decrypt(msg, decbook):
for c in msg:
if c in decbook:
msg = msg.replace(c, decbook[c]);
return msg;
if __name__ == "__main__":
plaintext = "I love you with all my heart";
encbook, decbook = makeCodebook();
ciphertext = encrypt(plaintext, encbook);
print(ciphertext);
deciphertext = decrypt(ciphertext, decbook);
print(deciphertext);
실행 결과
PS C:\github\cryp> & C:/anaconda/python.exe c:/github/cryp/chap01/Cipher.py
I70%@87:%?7w6;4750079:7485(;
I love you with all my heart
코드 분석
def makeCodebook():
decbook = {"5":"a", "2":"b", "#":"d", "8":"e", "1":"f", "3":"g", "4":"h", "6":"i", "0":"l", "9":"m",
"*":"n", "%":"o", "=":"p", "(":"r", ")":"s", ";":"t", "?":"u", "@":"v", ":":"y", "7":" "};
encbook = {};
for k in decbook:
val = decbook[k];
encbook[val] = k;
return encbook, decbook
암호화와 복호화를 위하여, 처음에 만들어놓는 규칙이다.
5 -> a로 바꾸고, 2->b 이렇게 원상 복구 시키는 decbook 라는 딕셔너리를 반대로 하는 encbook 를 생성한 후 반환한다.
def encrypt(msg, encbook):
for c in msg:
if c in encbook:
msg = msg.replace(c, encbook[c]);
return msg;
메시지와 인코딩북을 입력받고, encbook의 규칙에 맞춰서 msg의 값을 바꾼다.
새로운 변수를 쓰지않고, 입력받은 매개변수 그대로 사용한다.
def decrypt(msg, decbook):
for c in msg:
if c in decbook:
msg = msg.replace(c, decbook[c]);
return msg;
복호화도 마찬가지로 msg 를 decbook 의 규칙에 맞춰서 원래 문장으로 복구한다.
if __name__ == "__main__":
plaintext = "I love you with all my heart";
encbook, decbook = makeCodebook();
ciphertext = encrypt(plaintext, encbook);
print(ciphertext);
deciphertext = decrypt(ciphertext, decbook);
print(deciphertext);
평문을 생성하고, 이 평문을 암호화 한 후 나오는 결과 출력, 다시 암호화 한 값을 복호화 한 후 나오는 결과를 출력하는 것이다.
결과 해석
# 평문 : I love you with all my heart
I70%@87:%?7w6;4750079:7485(;
I love you with all my heart
encbook과 decbook 에 없는 것은 원문 그대로 넘어가게 되는데, 제일 앞글자 I를 보면 그렇다는 것을 확인할 수가 있다.
아무튼 평문을 암호화했다가 다시 평문으로 복호화 했던 결과가 최초 입력했던 원문 메시지와 같으므로 우리가 작성한 코드는 제대로 동작한다는 것을 알 수 있다.
파일 암호화 복호화 하기
코드
내용은 다 똑같은데, if__name__ == "__main__": 이 부분만 살짝 바꼈다.
if __name__ == "__main__":
h = open('plain.txt', 'rt');
content = h.read();
h.close();
encbook, decbook = makeCodebook();
content = encrypt(content, encbook);
h = open('encryption.txt', 'wt+');
h.write(content);
h.close();
이 코드를 실행하기 위해 plain.txt 를 하나 생성하고
For seven days and seven nights
Man will watch this awesome sight.
The tides will rise beyond their ken
To bite away the shores and then
A fiery dragon will cross the sky
Six times before this earth shall die
Mankind will tremble and frightened be
for the sixth heralds in this prophecy.
The great star will burn for seven days,
The cloud will cause two suns to appear
The big mastiff will howl all night
When the great pontiff will change country.
이를 작성한다.
실행 결과
위에서
다음과 같이 바뀌었다.
코드 분석
h = open('plain.txt', 'rt');
plain.txt 라는 파일을 rt 로 연다. rb면 read binary 라는 뜻이고, rt 면 read text 인 것 같다.
그러니까 평문 그대로 읽어 들인다는 뜻이다.
h = open('encryption.txt', 'wt+');
이부분은 wt+ 인데, write text 에다가 + 가 붙은 것은
텍스트 쓰기 모드로 파일 생성 후 오픈이라는 뜻이다. 만약 기존에 파일이 있다면 기존 파일은 삭제된다.
그리고 파일을 열었으면
h.close();
위와 같이 h.close() 로 항상 파일은 닫아주고 있다.
에필로그
아
깃 연결하는 게 진짜 개화났다. 자꾸 안 되어 가지고.... 매번 느끼는 건데 코딩하는 것 보다 환경설정이 더 오래걸린다.
https://webnautes.tistory.com/2181
깃 연결은 이 글을 참고하여 잘 해결하였다.
'보안 스터디 > 암호학' 카테고리의 다른 글
[암호학] 암호화 해킹 #6 (AES 및 구현) (0) | 2024.01.18 |
---|---|
[암호학] 암호화 해킹 #5 (3DES 및 구현) (1) | 2024.01.18 |
[암호학] 암호화 해킹 #4 (대칭키 암호, Symmetric-key Cryptography) (0) | 2024.01.17 |
[암호학] 암호화 해킹 #3 (전치 암호 도구 만들기) (5) | 2024.01.14 |
[암호학] 암호화 해킹 #2 (카이사르 암호 도구 만들기) (2) | 2024.01.13 |