[์ํธ ํ๋กํ ์ฝ] Base64 ์ธ์ฝ๋ฉ ๊ตฌํํ๊ธฐ
- -
์ธ์ฝ๋ฉ์ด๋?
Base64 ์ธ์ฝ๋ฉ์ ๋ํด ์์๋ณด๊ธฐ์ ์ ๋จผ์ ์ธ์ฝ๋ฉ์ด๋๊ฒ ๋ฌด์์ธ์ง ๊ฐ๋ตํ๊ฒ ์์๋ณด์.
์ธ์ฝ๋ฉ(encoding)์ ์ ๋ณด์ ํํ๋ ํ์์ ํ์คํ, ๋ณด์, ์ฒ๋ฆฌ ์๋ ํฅ์, ์ ์ฅ ๊ณต๊ฐ ์ ์ฝ ๋ฑ์ ์ํด์ ๋ค๋ฅธ ํํ๋ ํ์์ผ๋ก ๋ณํํ๋ ์ฒ๋ฆฌ ํน์ ๊ทธ ์ฒ๋ฆฌ ๋ฐฉ์์ ๋งํ๋ค. ๋์์์ด๋ ์ด๋ฏธ์ง์์ญ์์๋ ๋ง์ด ์ฌ์ฉ๋๋ ์ฉ์ด์ง๋ง ์ฐ๋ฆฌ๋ Binary Data๋ฅผ Text๋ก ๋ฐ๊ฟ์ฃผ๋ Base64 ์ธ์ฝ๋ฉ์ ๋ํด์ ์์๋ณผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋จธ์ง๋ ์๋ตํ๋๋ก ํ๊ฒ ๋ค.
๋ค์ํ ํน์ง๋ค์ ์๊ณ ์ถ๋ค๋ฉด ? ์๋ ๋ธ๋ก๊ทธ ์ฐธ๊ณ ํ๊ธฐ.
lucete1230-cyberpolice.tistory.com/95
Base 64 ์ธ์ฝ๋ฉ์ด๋?
์ปดํจํฐ ๋ถ์ผ์์ ์ฐ์ด๋ Base 64 (๋ฒ ์ด์ค ์ก์ญ์ฌ)๋ 8๋นํธ ์ด์ง ๋ฐ์ดํฐ(์๋ฅผ ๋ค์ด ์คํ ํ์ผ์ด๋, ZIP ํ์ผ ๋ฑ)๋ฅผ ๋ฌธ์ ์ฝ๋์ ์ํฅ์ ๋ฐ์ง ์๋ ๊ณตํต ASCII ์์ญ์ ๋ฌธ์๋ค๋ก๋ง ์ด๋ฃจ์ด์ง ์ผ๋ จ์ ๋ฌธ์์ด๋ก ๋ฐ๊พธ๋ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ๊ฐ๋ฆฌํค๋ ๊ฐ๋ ์ด๋ค.
์๋ Base 64๋ฅผ ๊ธ์ ๊ทธ๋๋ก ๋ฒ์ญํ์ฌ ๋ณด๋ฉด 64์ง๋ฒ์ด๋ ๋ป์ด๋ค. ํน๋ณํ 64์ง๋ฒ์ด ์ปดํจํฐ์์ ํฅ๋ฏธ๋ก์ด ๊ฒ์, 64๊ฐ 2์ ์ ๊ณฑ์(64 = 26)์ด๋ฉฐ, 2์ ์ ๊ณฑ์๋ค์ ๊ธฐ๋ฐํ ์ง๋ฒ๋ค ์ค์์ ํ๋ฉด์ ํ์๋๋ ASCII ๋ฌธ์๋ค์ ์จ์ ํํํ ์ ์๋ ๊ฐ์ฅ ํฐ ์ง๋ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ๋ค์ ์ ๊ณฑ์์ธ 128์ง๋ฒ์๋ 128๊ฐ์ ๊ธฐํธ๊ฐ ํ์ํ๋ฐ ํ๋ฉด์ ํ์๋๋ ASCII ๋ฌธ์๋ค์ 128๊ฐ๊ฐ ๋์ง ์๋๋ค.
๊ทธ๋ฐ ๊น๋ญ์ ์ด ์ธ์ฝ๋ฉ์ ์ ์ ๋ฉ์ผ์ ํตํ ์ด์ง ๋ฐ์ดํฐ ์ ์ก ๋ฑ์ ๋ง์ด ์ฐ์ด๊ณ ์๋ค. Base 64์๋ ์ด๋ค ๋ฌธ์์ ๊ธฐํธ๋ฅผ ์ฐ๋๋์ ๋ฐ๋ผ ์ฌ๋ฌ ๋ณ์ข ์ด ์์ง๋ง, ์ ์๋ ค์ง ๊ฒ์ ๋ชจ๋ ์ฒ์ 62๊ฐ๋ ์ํ๋ฒณ A-Z, a-z์ 0-9๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๋ง์ง๋ง ๋ ๊ฐ๋ฅผ ์ด๋ค ๊ธฐํธ๋ฅผ ์ฐ๋๋์ ์ฐจ์ด๋ง ์๋ค.
์ํค ๋ฐฑ๊ณผ์์ base64๋ฅผ ๊ฒ์ํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ์์๊ฐ ๋์จ๋ค. ์ด๋ฅผ ์ง์ ๊ตฌํํ ์ฝ๋๋ก ์ค์ตํด๋ณด๋๋ก ํ๊ฒ ๋ค.
100% ์๋ฒฝํ์ง ์์ง๋ง, ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ ๊ฒ์ ๋ชฉํ๋ก ๋์๋ค.
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 23 00:01:31 2021
@author: ์ดํ์
"""
import re
word = {'000000': 'A', '000001': 'B', '000010': 'C', '000011': 'D',
'000100': 'E', '000101': 'F', '000110': 'G', '000111': 'H',
'001000': 'I', '001001': 'J', '001010': 'K', '001011': 'L',
'001100': 'M', '001101': 'N', '001110': 'O', '001111': 'P',
'010000': 'Q', '010001': 'R', '010010': 'S', '010011': 'T',
'010100': 'U', '010101': 'V', '010110': 'W', '010111': 'X',
'011000': 'Y', '011001': 'Z', '011010': 'a', '011011': 'b',
'011100': 'c', '011101': 'd', '011110': 'e', '011111': 'f',
'100000': 'g', '100001': 'h', '100010': 'I', '100011': 'j',
'100100': 'k', '100101': 'l', '100110': 'm', '100111': 'n',
'101000': 'o', '101001': 'p', '101010': 'q', '101011': 'r',
'101100': 's', '101101': 't', '101110': 'u', '101111': 'v',
'110000': 'w', '110001': 'x', '110010': 'y', '110011': 'z',
'110100': '0', '110101': '1', '110110': '2', '110111': '3',
'111000': '4', '111001': '5', '111010': '6', '111011': '7',
'111100': '8', '111101': '9', '111110': '+', '111111': '/'}
aaa = []
def base64_enc(msg):
string = ''
zz=[]
result_enc =''
#๋ฌธ์๋ฅผ 8bit๋ก ํํํ๊ธฐ.
for i in range(len(msg)):
a = bin(msg[i])
#print(a)
aaa.append(int(a,2))
if(len(a)!=9):
a = '0'+a
string += a
else:
string+=a
string = re.sub("b","",string)
#๊ธธ์ด ๋๋๋ ๋ถ๋ถ > base64 encoding ์ 6byte๋ก ๋๋ ์ค.
length=6
for i in range(0, len(string),length):
zz.append(string[i:i+length])
#padding์ฒ๋ฆฌ
for i in range(len(zz)):
z = len(zz[i])
# = ์ ํ๊ฐ ํน์ 2๊ฐ ๋ฐ์ ๋์ฌ ์ ์์.
if(z == 4):
zd = zz[i];zd +='00';zz[i] =zd;zz.append("=")
if(z == 2):
zd = zz[i];zd +='0000';zz[i] =zd;zz.append("==")
# base64์ธ์ฝ๋ฉ ํ๋ฅผ ๊ฐ์ ธ์์, key์ถ๋ ฅํ๊ธฐ.
for i in zz:
for key, value in word.items(): #mydict์ ์์ดํ
์ ํ๋์ฉ ์ ๊ทผํด์, key, value๋ฅผ ๊ฐ๊ฐ name, age์ ์ ์ฅ
if i == str(key):
result_enc += word[key]
if i == "=":
result_enc += i
elif i == "==":
result_enc += i
return result_enc
def base64_dec():
ans = ''
for i in aaa:
ans += chr(i)
return ans
def main():
msg = input("๋ณ๊ฒฝํ ๋ฌธ์์ด์ ์
๋ ฅํ์์ค : ")
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
enc = base64_enc(msg.encode()) #๊ฐ์ ์ธ์ฝ๋ฉํด์ ๋ณด๋ด๊ธฐ~
dec = base64_dec()
print("base 64 Encoding : ",enc)
print("---------------------------------------------------------")
print("base 64 Deciding : ",dec)
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
main()
์ฐธ๊ณ ๋ก base 64 ํ๋ ๊ฐ์ ธ์ฌ ์๊ฐ ์์ด์ ์ง์ ์ง์ ํด์ฃผ์๋ค.
์๋๋ ์์ง ์์ธ์ฒ๋ฆฌ๋ฅผ ๋๋ง์น์ง ์์ ์ฝ๋์ด์ง๋ง, ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฝ๋์ด๋ค. (decoding๋ถ๋ถ)
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 22 23:56:37 2021
@author: ์ดํ์
"""
import re
word = {'000000': 'A', '000001': 'B', '000010': 'C', '000011': 'D',
'000100': 'E', '000101': 'F', '000110': 'G', '000111': 'H',
'001000': 'I', '001001': 'J', '001010': 'K', '001011': 'L',
'001100': 'M', '001101': 'N', '001110': 'O', '001111': 'P',
'010000': 'Q', '010001': 'R', '010010': 'S', '010011': 'T',
'010100': 'U', '010101': 'V', '010110': 'W', '010111': 'X',
'011000': 'Y', '011001': 'Z', '011010': 'a', '011011': 'b',
'011100': 'c', '011101': 'd', '011110': 'e', '011111': 'f',
'100000': 'g', '100001': 'h', '100010': 'I', '100011': 'j',
'100100': 'k', '100101': 'l', '100110': 'm', '100111': 'n',
'101000': 'o', '101001': 'p', '101010': 'q', '101011': 'r',
'101100': 's', '101101': 't', '101110': 'u', '101111': 'v',
'110000': 'w', '110001': 'x', '110010': 'y', '110011': 'z',
'110100': '0', '110101': '1', '110110': '2', '110111': '3',
'111000': '4', '111001': '5', '111010': '6', '111011': '7',
'111100': '8', '111101': '9', '111110': '+', '111111': '/'}
def base64_enc(msg):
string = ''
zz=[]
result_enc =''
#๋ฌธ์๋ฅผ 8bit๋ก ํํํ๊ธฐ.
for i in range(len(msg)):
a = bin(msg[i])
#print(a)
if(len(a)!=9):
a = '0'+a
string += a
else:
string+=a
string = re.sub("b","",string)
#๊ธธ์ด ๋๋๋ ๋ถ๋ถ > base64 encoding ์ 6byte๋ก ๋๋ ์ค.
length=6
for i in range(0, len(string),length):
zz.append(string[i:i+length])
#padding์ฒ๋ฆฌ
for i in range(len(zz)):
z = len(zz[i])
# = ์ ํ๊ฐ ํน์ 2๊ฐ ๋ฐ์ ๋์ฌ ์ ์์.
if(z == 4):
zd = zz[i];zd +='00';zz[i] =zd;zz.append("=")
if(z == 2):
zd = zz[i];zd +='0000';zz[i] =zd;zz.append("==")
# base64์ธ์ฝ๋ฉ ํ๋ฅผ ๊ฐ์ ธ์์, key์ถ๋ ฅํ๊ธฐ.
for i in zz:
for key, value in word.items(): #mydict์ ์์ดํ
์ ํ๋์ฉ ์ ๊ทผํด์, key, value๋ฅผ ๊ฐ๊ฐ name, age์ ์ ์ฅ
if i == str(key):
result_enc += word[key]
if i == "=":
result_enc += i
elif i == "==":
result_enc += i
return result_enc
def base64_dec(enc):
dic =''
dic2 = {v:k for k,v in word.items()} #๊ฐ ๋ค์ง๊ธฐ.
for i in enc:
if(i == '='):
dic += i
dic = dic.replace("00=", "")
elif(i == "=="):
dic += i
dic = dic.replace("0000==", "")
else :
dic += dic2.get(i)
box=[]
length = 8 #๊ธธ์ด๋ฅผ ๋ค์ 8๊ธ์๋ก ๋๋ ค์ ascii์ฝ๋๋ก ๋ฐ๊ฟ ์ค๋น.
for i in range(0, len(dic),length):
box.append("b"+dic[i:i+length])
aes=[]
result=''
for i in range(len(box)):
aes.append(box[i].replace("b0","0b"))
result += chr(int(aes[i],2))
return result
def main():
msg = input("๋ณ๊ฒฝํ ๋ฌธ์์ด์ ์
๋ ฅํ์์ค : ")
enc = base64_enc(msg.encode()) #๊ฐ์ ์ธ์ฝ๋ฉํด์ ๋ณด๋ด๊ธฐ~
dec = base64_dec(enc)
print("==================================================")
print("base 64 Encoding : ",enc)
print("base 64 Deciding : ",dec)
print("==================================================")
main()
์ถ๋ ฅ๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํ๊ณ ์ถ๋ค๋ฉด ์๋ ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ ์ฌ์ดํธ๋ฅผ ์ด์ฉํด์ ์ฒดํฌํด๋ณด๋๋ก ํ์!
www.convertstring.com/ko/EncodeDecode/Base64Encode
๊ฐ์ด ๋์ผํ๊ฒ ์ธ์ฝ๋ฉ ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฌธ์ ํ๊ฐ (8bit)๋ฅผ ์ด์ง์๋ก ํํํ์ฌ, ์ด๋ฅผ 6bit์ฉ ์ชผ๊ฐ๊ณ ํด๋นํ๋ base64ํ์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด
base64 ์ธ์ฝ๋ฉ์ด ์๋ฃ๋๋ค. ๋ง์ง๋ง ๋นํธ๊ฐ ๋น๋ค๋ฉด ํจ๋ฉ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋๋ฐ, ์ด๋ ํจ๋ฉ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์๋ 0์ ๊ฐ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก
'=' ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ ๊ฒ์ด๋ค.
์์์ ์ํค๋ฐฑ๊ณผ์์ ๋์๋ ์์๋ ํ๋ฒ ๋ฃ์ด๋ณด์๋ค
๊ฒฐ๊ณผ๊ฐ ๋ฌธ์ ์์ด ๋์ผํ๊ฒ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
'Languages > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
-
[์ํธ ์๊ณ ๋ฆฌ์ฆ] ์ํธํ ์ด์ ๋ฆฌ | ์ํธ | ๋์นญ์ํธ | ์คํธ๋ฆผ & ๋ธ๋ก 2021.04.01
-
[์ํธ ํ๋กํ ์ฝ] ํด์ ํจ์ ๊ตฌํํ๊ธฐ | ํ์ผ ํด์ ๊ฐ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ 2021.04.01
-
[์ํธ ํ๋กํ ์ฝ]AES ๊ตฌํํ๊ธฐ 2021.03.24
-
[์ํธ ํ๋กํ ์ฝ] ํด์ ํจ์ ->์ํ ๋ฌธ์ 2021.03.21
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค