[์ํธ ํ๋กํ ์ฝ] ์์ ์ํธ | Caesar Cipher | Caesar | ์นด์ด์ฌ๋ฅด ์ํธ
- -
์นด์ด์ฌ๋ฅด(์์ )์ํธ
์นด์ด์ฌ๋ฅด ์ํธ๋ ์ํธํํ๊ณ ์ ํ๋ ๋ด์ฉ์ ์ํ๋ฒณ๋ณ๋ก ์ผ์ ํ ๊ฑฐ๋ฆฌ๋งํผ ๋ฐ์ด์ ๋ค๋ฅธ ์ํ๋ฒณ์ผ๋ก ์นํํ๋ ๋ฐฉ์์ด๋ค.
์๋ฅผ ๋ค์ด 3๊ธ์์ฉ ๋ฐ์ด๋ด๋ ์นด์ด์ฌ๋ฅด ์ํธ๋ก 'COME TO ROME'์ ์ํธํํ๋ฉด 'FRPH WR URPH'๊ฐ ๋๋ค.
์ฌ๊ธฐ์ ๋ฐ์ด๋ด๋ ๊ธ์ ์๋ ์ํธ๋ฅผ ๋ณด๋ด๋ ์ฌ๋๊ณผ ํจ๊ป ์ ํด ๋ ์ด๋ ค์ด ์ํธ๋ฅผ ๋ง๋ค ์ ์๋ค. ์ด๋ฐ ์นด์ด์ฌ๋ฅด ์ํธ๋ ์ํ์ํธ๋ผ๊ณ ํ๋ค. ์๋ฅผ ๋ค์ด ์์ ์นด์ด์ฌ๋ฅด ์ํธ๋ก 'RUSQHUVKBVEHQIIQIYDQJEH' ๋ผ๋ ์ํธ๋ฅผ ๋ฐ์์ ๊ฒฝ์ฐ, ํด๋ ํ๋ฉด BECAREFULFORASSASINATOR, ์์ด์๋ฅผ ์กฐ์ฌํ๋ผ๋ ๋ป์ด ๋๋ค. (์ถ์ฒ : ์ํค๋ฐฑ๊ณผ)
์นด์ด์ฌ๋ฅด ์ํธ๋ ๋จ์ํ๊ณ ๊ฐ๋จํ์ฌ ์ผ๋ฐ์ธ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ง๋ง, ์ฒ ์์ ๋น๋์ ์์ฃผ ์ฌ์ฉ๋๋ ๋จ์ด์ ํํ๋ฅผ ์ด์ฉํ๋ฉด ์ฝ๊ฒ ํ ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
Caesar Cipher์ ์๊ณ ๋ฆฌ์ฆ
Caesar ์ํธ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
-
Caesar Cipher Technique๋ ๊ฐ๋จํ๊ณ ์ฌ์ด ์ํธํ ๊ธฐ๋ฒ์ด๋ค.
-
๋จ์ํ ์ ํ์ ๋์ฒด ์ํธ์ด๋ค.
-
์ผ๋ฐ ํ ์คํธ์ ๊ฐ ๋ฌธ์๋ ์ํ๋ฒณ์ผ๋ก ์๋๋ก ๊ณ ์ ๋ ์ซ์๊ฐ์๋ ๋ฌธ์๋ก ๋์ฒด๋๋ค.
๋ค์ ๋ค์ด์ด๊ทธ๋จ์ Caesar ์ํธ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ์ ์๋์ ์ค๋ช ํ๋ค.
์ค๋ช
์ผ๋ฐ ํ ์คํธ ๋ฌธ์๋ ํ ๋ฒ์ ํ๋์ฉ ์ํํ๋ค.
-
์ฃผ์ด์ง ์ผ๋ฐ ํ ์คํธ์ ๊ฐ ๋ฌธ์์ ๋ํด ํ ์คํธ์ ์ํธํ ๋ฐ ๋ณตํธํ ์ ์ฐจ์ ๋ฐ๋ผ ๊ท์น์ ๋ฐ๋ผ ์ฃผ์ด์ง ๋ฌธ์๋ฅผ ๋ณํํ๋ค.
-
๋จ๊ณ๋ฅผ ์ํ ํ ํ ์ํธ ํ ์คํธ๋ผ๊ณ ํ๋ ์ ๋ฌธ์์ด์ด ์์ฑ๋จ.
์๊ณ ๋ฆฌ์ฆ ์ค์ต ์ ์๊ณ ๋ฆฌ์ฆ์ ํ์ํ ๋ช ๊ฐ์ง ์ง์์ ์์๋ณด์.
ex) range์ ์ฐจ์ด
msg = 'hello world'
size = len(msg)
for i in msg:
print(i)
for i in range(size):
print(i)
range๋ค์ str ํํ๊ฐ ์ฌ ์ ์์
ex) find ํจ์
dic = 'abc'
index = dic.find('a') #return = 0
index = dic.find('b') #return = 1
index = dic.find('c') #return = 2
index = dic.find('x') #return = -1
print(index)
find ํจ์๋ ํด๋น ๊ฐ์ด ์กด์ฌ ํ๋ค๋ฉด ๊ทธ ๊ฐ์ ๋ฒํธ(index)๊ฐ์ ๋ฐํํ๊ณ , ๊ฐ์ด ์กด์ฌํ์ง ์๋๋ค๋ฉด -1์ ๋ฐํํ๋ค.
์ ๊ฒฐ๊ณผ๋ 'c'๋ฅผ ์ถ๋ ฅํด๋ณด๊ณ , 'b'๋ฅผ ์ถ๋ ฅํ์ ๋์ ๊ฒฐ๊ณผ์ด๋ค.
์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
def encrypt_caesar(msg,key):
m_size = len(msg)
ans = ''
word = 'abcdefghijklmnopqrstuvwxyz' #๊ฐ๋จํ๊ฒ ์๋ฌธ์๋ก๋ง ๊ตฌ์ฑํ์์(ํ๋ฌธ์ด ์๋ฌธ์๋ผ์)
for i in msg: #->hello world๋ฅผ ํ ๊ธ์์ฉ ์ถ๋ ฅ
index = word.find(i) # word์ค msg ๊ธ์์ ํด๋นํ๋ ๋จ์ด๊ฐ ์๋ค๋ฉด index์ ๋ฃ์ด์ค๋ค. index ์ฆ ์ซ์ ํํ๋ก ๋ค์ด๊ฐ.
#print(index) ->index ํ์ธ์ฉ
if(index == -1): #ํด๋นํ๋ ๊ฐ์ด ์๋ค๋ฉด
ans = ans + i # ๊ทธ ์๋ ๊ฐ ์์ฒด๋ฅผ ans์ ๋ฃ๊ฒ ๋ค. -> ์ฆ ํ๋ฌธ์์ ๊ณต๋ฐฑ์ ํด๋น
else:
index = index + key #key๊ฐ ๋งํผ Index๋ฅผ ์ด๋์ํค๋ ๊ฒ.
index = index % len(word) #index ๊ฐ์ด ๋์น ์ผ์ ์์ง๋ง key๋ฅผ ๋ํด์ฃผ๋ฉด wordํฌ๊ธฐ๋ฅผ ๋ฒ์ด๋ ์ ์์.
ans = ans + word[index] #๋จ์ด ์ฌ์ ์ค ํค๋ฅผ ๋ํด์ค ์ฅ์์ ์๋ ์ํ๋ฒณ์ ans์ ๋ฃ์ด์ฃผ๋
return ans
def decrypt_caesar(enc, key):
e_size = len(enc)
ans = ''
word = 'abcdefghijklmnopqrstuvwxyz'
for i in enc:
index = word.find(i)
if(index == -1):
ans = ans + i #๊ทธ๋๋ก ๋ฌธ์๋ฅผ ๋ฃ์ด์ค (๊ณต๋ฐฑ)
else:
index = index - key #๋ค์ ๋๋ฆฌ๋ ๊ฒ!
index = index % len(word)
ans = ans + word[index]
return ans
def main():
msg = 'hello world'
key = 3 #key๋ ์ซ์ํํ
enc = encrypt_caesar(msg, key)
dec = decrypt_caesar(enc, key)
print("์๋ฌธ : ",msg)
print("์ํธํ : ",enc)
print("๋ณตํธํ : ",dec)
main()
์ฒ์ ๋์๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ์ ํ์ด์ ์ค๋ช ํ์๋ฉด hello world์ค ์ฒซ ๋ฒ์งธ ๊ธ์์ธ h๊ฐ i(๋ณ์)๋ก ๋ค์ด์จ๋ค.
h ๋ word๋ด์ ์๊ธฐ ๋๋ฌธ์ index์ ๋ค์ด๊ฐ๋ค. index = 7(a=0, b=1, c=2 ..)
index ๊ฐ -1์ด ์๋๋ฏ๋ก, else ๋ฌธ์ผ๋ก ์ด๋
7 + key = 10
10 = 10 % 25(์ํ๋ฒณ ์) = 10
# ์ด ์ค์ด ์๋ ์ด์ ๋ index ๊ฐ 25์ธ๋ฐ ํค๊ฐ 3์ธ ๊ฒฝ์ฐ 25๋ฅผ ๋ฒ์ด๋๊ธฐ ๋๋ฌธ์ 28 = 28 % 25 = 3 ์ด ๋๋ผ๊ณ ์๋ ๊ธฐ๋ฅ
๊ทธ๋ฆฌ๊ณ ans ์ word[10]๋ฒ์งธ ์ฆ, k ๋ฅผ ๋ฃ์ด์ค๋ค.
์ฆ ans ์ ์ฒซ ๊ธ์ = h ์์ ํค๊ฐ(3) ์ ์ฎ๊ธด "k"
๊ฒฐ๊ณผ(์ํธํ ๋ฌธ์์ด์ ์ฒซ ๊ธ์๊ฐ k ์ธ๊ฒ์ ํ์ธํ ์ ์๋ค.)
byte ๋จ์๋ก ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
์์ bytearray์ encode, decode์ ๊ด๊ณ๋ฅผ ํ ์คํธ ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ํ ์คํธ ํด๋ณด์๋ค.
ans = bytearray()
msg = b'hello world'
for i in msg:
print(i)
ans.append(i)
print(ans)
#์ด๊ฑธ๋ก ์ ์ ์๋ ๊ฑด encode๋๋ฉด ๊ฐ์ ์์คํค๋ก ๋นผ์ค, ๋ค์ ์ด๊ฑธ ans ์ ๋ฃ์ผ๋ฉด
#bytearray๋ ์ด๋ฅผ decodeํ ๊ฒ ์ฒ๋ผ ๋ค์ ๋ฌธ์๋ก ๋ฐ์์ค.
# =============================================================================
# ์ ์ฝ๋์ ๋ํ ๊ฒฐ๊ณผ ๊ฐ
# 104
# bytearray(b'h')
# 101
# bytearray(b'he')
# 108
# bytearray(b'hel')
# 108
# bytearray(b'hell')
# 111
# bytearray(b'hello')
# 32
# bytearray(b'hello ')
# 119
# bytearray(b'hello w')
# 111
# bytearray(b'hello wo')
# 114
# bytearray(b'hello wor')
# 108
# bytearray(b'hello worl')
# 100
# bytearray(b'hello world')
# =============================================================================
์ ์ฝ๋๋ฅผ ํตํด msg๋ฅผ encode()ํด์ ๋ณด๋ด๋ฉด b'hello world' ์ฆ ๋ฐ์ดํธ ํํ๋ก ๊ฐ๊ฒ ๋๊ณ ,
์ด์ ๊ฐ์ ํ๋ํ๋ ๋ฝ์๋ณด๋ฉด asciiํํ๋ก ๋์ด ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๋ํ bytearray์์ ascii๊ฐ์ ๋ฃ์ผ๋ฉด byteํํ ์ฆ ๋ฌธ์ ํํ๋ก ๋ํ๋ด ์ค๋ค๋ ๊ฒ๋ ์ ์ ์๋ค.
์ด๋ฅผ ํ ๋๋ก byteํํ ์ํธ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํด๋ณด๋๋ก ํ์
def encrypt_caesar(msg,key):
m_size = len(msg)
ans = bytearray()
word = 'abcdefghijklmnopqrstuvwxyz'
for i in msg: #encode๋ msg๋ ascii๊ฐ์ ๊ฐ์ง๊ณ ์๋ค.
index = word.find(chr(i)) #chr(์ซ์) -> ๋ฌธ์ ์ฆ, word์์ ํด๋นํ๋ ๋ฌธ์ ์ฐพ๊ธฐ ์ํด ํ๋ณํ ํด์ค๊ฒ, i๊ฐ ํ์ฌ ์ซ์์ด๊ธฐ ๋๋ฌธ
if(index == -1):
ans.append(i)
else:
index = index + key
index = index % len(word)
ans.append(ord(word[index])) #ord(๋ฌธ์) -> ์ซ์. ์ฆ append ํด์ ๊ฐ ๋ฃ์ด์ค ๋ ๋ค์ ascii๊ฐ์ผ๋ก ๋ณ๊ฒฝํด์ค.
return ans
def decrypt_caesar(enc, key):
e_size = len(enc)
ans = bytearray()
word = 'abcdefghijklmnopqrstuvwxyz'
for i in enc:
index = word.find(chr(i))
if(index == -1):
ans.append(i)
else:
index = index - key
index = index % len(word)
ans.append(ord(word[index]))
return ans
def main():
msg = 'hello world'
key = 3 #key๋ ์ซ์ํํ
enc = encrypt_caesar(msg.encode(), key)
dec = decrypt_caesar(enc, key)
print("\n------------------------------------------")
print("ํค : ",key)
print("์๋ฌธ : ",msg)
print("์ํธ๋ฌธ : ",enc.decode())
print("์์ ํ ๋ณตํธํ : ",dec.decode())
print("\n(ํ๋ณํx)์ํธํ : ",enc)
print("(ํ๋ณํx)๋ณตํธํ : ",dec)
print("------------------------------------------")
main()
๊ฒฐ๊ณผ
Caesar Cipher ์๊ณ ๋ฆฌ์ฆ ํดํน
์ํธ๋ฌธ์ ๋ค์ํ ๊ฐ๋ฅ์ฑ์ผ๋ก ํดํน ๋ ์ ์๋ค.
์ด๋ฌํ ๊ฐ๋ฅ์ฑ ์ค ํ๋๋ ๊ฐ๋ฅํ ๋ชจ๋ ์ํธ ํด๋ ํค๋ฅผ ์๋ํ๋ Brute Force Technique ์ด๋ค.
์ด ๊ธฐ์ ์ ๋ง์ ๋ ธ๋ ฅ์ด ํ์ํ์ง ์์ผ๋ฉฐ ํด์ปค์๊ฒ๋ ๋น๊ต์ ๊ฐ๋จํ๋ค. Caesar ์ํธ ์๊ณ ๋ฆฌ์ฆ์ ํดํนํ๊ธฐ์ํ ํ๋ก๊ทธ๋จ ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ๋ค.
message = 'GIEWIVrGMTLIVrHIQS' #encrypted message
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for key in range(len(LETTERS)):
translated = ''
for symbol in message:
if symbol in LETTERS:
num = LETTERS.find(symbol)
num = num - key
if num < 0:
num = num + len(LETTERS)
translated = translated + LETTERS[num]
else:
translated = translated + symbol
print('Hacking key #%s: %s' % (key, translated))
#์ด ์๊ณ ๋ฆฌ์ฆ์ ํค์ ๊ฐฏ์๋งํผ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ๊ตฌํด์ ๊ฐ์ ์์ํ์ฌ ์ถ๋ ฅ ์
์ด์ ์์์ ์ํธํ ๋ ์ํธ ํ ์คํธ๋ฅผ ๊ณ ๋ คํ๊ณ ,
๊ทธ๋ฐ ๋ค์ ํค๋ก ๊ฐ๋ฅํ ํดํน ๋ฐฉ๋ฒ๊ณผ ๋ฌด์ฐจ๋ณ ๋์ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ์ฌ์ฉํ ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ๋ค.
'Languages > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
-
[์ํธ ํ๋กํ ์ฝ] ํด์ ํจ์ ->์ํ ๋ฌธ์ 2021.03.21
-
[์ํธ ํ๋กํ ์ฝ] ์์ ์ํธ ์ฌ์ | ์์ ์ํธ 2021.03.19
-
[์ํธ ํ๋กํ ์ฝ] XOR๋ฅผ ์ด์ฉํ ์ํธ | XOR ํ๋ก์ธ์ค | XOR 2021.03.12
-
[์ํธ ํ๋กํ ์ฝ] ๊ฐ๋จํ ์ํธํ,๋ณตํธํ | Reverse Cipher | ์ญ ์ํธ ์๊ณ ๋ฆฌ์ฆ 2021.03.12
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค