본문 바로가기

Hacking/Crypto

암호학_교육내용

크립텍트, 에너그램

 

암호화, 평문, 암호문, 복호화

 

암호화 Encryption

f(plain) = encrypted

 

복호화 Decryption

f(-1)(encrypted) = plain

-1 = 역함수

 

암호문들의 집합 

 

복호화

@            A

#     = >   B

$             C

 

암호화

A            @

B     = >   #

C             $

 

====암호함수의 중요한 점====

암호화는 쉬운데 복호화가 어려운 것, 암호함수의 역함수를 쉽게 찾을 수 있으면 안된다

일방향 함수

 

고전암호

======전치암호======

 

전치암호는 평문의 문자 순서를 재배치하여 암호화하는 것이다

 

======치환암호======

 

아래는 각각의 암호학에 맞게 코딩한 python 코드이다.

 

 스키테일 ( scytale )

스키테일 암호는 APPLE이라는 문자열이 있을 때 key값을 n으로 해주었을 때 A와 P사이에 랜덤 값을 n-1개넣어줘서 암호화 시키는 방식이다.


암호화 코드

 

import random
import string

print("[*] SCYTALE - ENCRYPT")

plain = input("[+] Input Plain Text >> ")
key = input("[+] Input Scytale Key >> ")

comp = ""

for i in range(0, len(plain)):
    comp += plain[i]
    for j in range(0, int(key)-1):
        comp += random.choice(string.ascii_letters)
print(comp)

 

복호화 코드

 

print("[*] SCYTALE - ENCRYPT")

plain = input("[+] Input Plain Text >> ")
key = input("[+] Input Scytale Key >> ")

comp = ""

for i in range(0, len(plain)):
    if(i % int(key) == 0):
        comp += plain[i]
print(comp)

카이사르 ( caesar )

 

카이사르 암호는 A라는 문자를 받으면 아스키코드값에서 n번째 뒤에 떨어지거나 n번째 앞에 있는값으로 치환하여 암호화해주는 방식이다.

 

암호화

 

print("[*] Caesar - ENCRYPT")

plain = input("[+] Input Plain Text >> ")
key = input("[+] Input Caesar Key >> ")

comp = ""

comp = ""
for i in range(0, len(plain)):
    comp += chr(ord(plain[i]) + int(key))
print(comp)

 

복호화

 

print("[*] Caesar - ENCRYPT")

plain = input("[+] Input Plain Text >> ")
key = input("[+] Input Caesar Key >> ")

de_c = ""
num = ""

for i in range(0, len(plain)):
    de_c += chr(ord(plain[i]) - int(key))
print(de_c)

 

복호화 ( Brute Force )

 

inp = input("[+] 복호화할 문자열을 입력하세요 : ")
inp1 = input("[+] 그 중에서 찾을 문자열을 입력하세요 : ")

comp = ""

# Brute Force
for i in range(0, 26):

    # 문자열 변환
    for j in range(0, len(inp)):

        # 대소문자 구분
        if inp[j].isupper() == True:
            comp += chr((ord(inp[j]) - ord('A') + int(i+1))%26 + ord('A'))
        else:
            comp += chr((ord(inp[j]) - ord('a') + int(i+1))%26 + ord('a'))
            
    # search String
    if inp1.lower() in comp.lower():
        print("================================================\n[+] 복호화된 암호문 : %s"%comp)
        print("[+] key 값 : %d"%i)
        break

비즈네르 ( Vigenère )

 

비즈네르 표

 

암호화

 

inp = input("비르네르 암호화 시킬 문자열을 입력해주세요 : ")
key = input("key 값 : ")

x = ""
y = ""

# 공백 제거
inp = inp.replace(" ", "")
key = key.replace(" ", "")

# 암호화
for i in range(0, len(inp))

	# 비즈네르에서 x값 설정
    x = (ord(key[i % len(key)].upper()) - ord('A')) % 26
    
    # 비즈네르에서 y값 설정한 뒤, y에 저장
    y += chr((ord(inp[i].upper()) - ord('A') + int(x)) % 26 + ord('A'))
    
 # x, y에 위치한 값 출력
print(y)

 

복호화는 한줄만 바꾸면 된다

 

 y += chr((ord(inp[i].upper()) - ord('A') + int(x)) % 26 + ord('A'))에서 

+ int(x)   >   - int(x)


인코딩

 

문자 코드를 기준으로 문자를 코드로 변환하는 것을 문자 인코딩, 코드를 문자로 변환하는 것을 문자 디코딩이라 한다

입력 데이터를 컴퓨터 속에서 사용하는 코드로 변환하는 것 = 문자를 코드로 변환

 

디코딩

변환된 코드를 다시 부호화되기 전으로 되돌리는 처리 방식 = 코드를 문자로 변환

 

 

암호화와 인코딩의 차이

 

인코딩은 데이터 가용성을 유지하기위한 것이며 공개적으로 사용할 수있는 스키마를 사용합니다.

암호화는 데이터 기밀성을 유지하기위한 것이므로 특정한 사람만 변환을 되돌릴 수 있다.

 

암호화 해시

 

해시는 평문을 암호화된 문장으로 만들어 주는 기능만 한다 문자열의 길이 또한 암호화가 되더라도 일정하다

암호화(Encryption)는 암호화로 만들어주는 것 뿐만 아니라 그 문장을 다시 복호화해주는 기능을 제공한다

 

 

'Hacking > Crypto' 카테고리의 다른 글

교육내용_2  (0) 2019.09.28