반응형
Caesar Cipher(카이사르) 암호화 문장을 Bruteforce 공격으로 복호화하기
#시저 암호화 문장 무작위 대입을 통해 복호화하기
안녕하세요. 오늘은 Caesar Cipher 암호화 문장을 Shift 수를 알지 못하는 상태에서 복호화하는 방법에 대해서 알아보도록 하겠습니다.
Shift 수를 알지 못할 때는, 사실 간단합니다.
Shift 할 수 있는 길이 만큼 모두 해보는 것이죠.
알파벳의 개수가 52개, 소문자 26, 대문자 26이죠.
따라서 1에서 25의 수만큼 Shift 가능하므로, 1에서 25까지 Shift 한 수만큼 무작위로 해보는거죠.
그 전에 저번 시간에 알아봤던, Shift 수를 알고 있을 경우 복호화 하는 방법에 대해서는 아래 글을 참고하시면 좋을 것 같습니다.
그럼 무작위로 대입하는 방법으로 복호화 함수를 구현해볼게요.
여기서는 입력값은 1개가 되겠네요.
이미 암호화된 문장 말이죠.
def brute_decrypt(encryptedString):
result = ""
for n in range(1, 25):
for i in range(len(encryptedString)):
char = encryptedString[i]
if (char.isspace()):
result += " "
else:
if (char.isupper()):
result += chr((ord(char) - n - 65) % 26 + 65)
else:
result += chr((ord(char) - n - 97) % 26 + 97)
print(result)
result = ""
완성된 함수를 사용해볼까요?
def main():
number = int(input("Input Number > "))
brute_decrypt(encrypt("This is Test String", number))
if __name__ == "__main__":
main()
자 그럼 이제 실행해보면, 아래와 같습니다.
암호화를 Shift 수 5로 했을 경우, 아래와 같이 결과가 나오네요.
Input Number > 5
Xlmw mw Xiwx Wxvmrk
Wklv lv Whvw Vwulqj
Vjku ku Vguv Uvtkpi
Uijt jt Uftu Tusjoh
This is Test String
Sghr hr Sdrs Rsqhmf
Rfgq gq Rcqr Qrpgle
Qefp fp Qbpq Pqofkd
Pdeo eo Paop Opnejc
Ocdn dn Ozno Nomdib
Nbcm cm Nymn Mnlcha
Mabl bl Mxlm Lmkbgz
Lzak ak Lwkl Kljafy
Kyzj zj Kvjk Jkizex
Jxyi yi Juij Ijhydw
Iwxh xh Ithi Higxcv
Hvwg wg Hsgh Ghfwbu
Guvf vf Grfg Fgevat
Ftue ue Fqef Efduzs
Estd td Epde Dectyr
Drsc sc Docd Cdbsxq
Cqrb rb Cnbc Bcarwp
Bpqa qa Bmab Abzqvo
Aopz pz Alza Zaypun
중간에 보시면, "This is Test String"이라는 평문이 발견되죠?
그게 5번째 출력됐으니, Shift 수가 5라는 것도 쉽게 알 수 있죠.
자 어떤가요?
이제는 Shift 수 없이도 Caesar Cipher 암호화 문장을 복호화 할 수 있겠죠?
한번 연습해보세요!
그럼 저는 아래에 전체 코드를 공유하고 들어가보겠습니다.
다음 시간에 만나요!
def encrypt(plainString, n):
result = ""
for i in range(len(plainString)):
char = plainString[i]
if (char.isspace()):
result += " "
else:
if (char.isupper()):
result += chr((ord(char) + n - 65) % 26 + 65)
else:
result += chr((ord(char) + n - 97) % 26 + 97)
return result
def decrypt(encryptedString, n):
result = ""
for i in range(len(encryptedString)):
char = encryptedString[i]
if (char.isspace()):
result += " "
else:
if (char.isupper()):
result += chr((ord(char) - n - 65) % 26 + 65)
else:
result += chr((ord(char) - n - 97) % 26 + 97)
return result
def brute_decrypt(encryptedString):
result = ""
for n in range(1, 25):
for i in range(len(encryptedString)):
char = encryptedString[i]
if (char.isspace()):
result += " "
else:
if (char.isupper()):
result += chr((ord(char) - n - 65) % 26 + 65)
else:
result += chr((ord(char) - n - 97) % 26 + 97)
print(result)
result = ""
def main():
number = int(input("Input Number > "))
brute_decrypt(encrypt("This is Test String", number))
if __name__ == "__main__":
main()
반응형
'#연구 > #Python' 카테고리의 다른 글
파이썬 웹 크롤링 헤더 값 추가 방법 #웹 크롤링이 안될 때 (0) | 2021.06.02 |
---|---|
파이썬 리스트를 이용한 2차원 배열 만들기 (0) | 2021.05.20 |
파이썬으로 Caesar Cipher 복호화 함수 구현하기 #카이사르(시저) 암호화 Decrypt 함수 만들어보기 #Shift 수를 알고 있을 때 (0) | 2021.03.30 |
파이썬으로 Caesar 암호화 구현하기 #파이썬으로 숫자 입력 받아 카이사르(시저) 암호화 구현하기! #Caesar_cipher (0) | 2021.03.30 |
[파이썬/Python] 파일에서 특정 문자열이 사용된 개수 세어보기 #파일에서 문자열 개수 파악하는 함수 (0) | 2021.01.24 |