함수는 총 세 가지로 작성하였습니다.


getDivisors(int) : 약수를 구하는 함수

perm(number list) : 숫자 배열의 모든 가능한 배열을 추출하는 함수

Decrypt(암호문, 암호문길이, 키) : 암호문을 각각의 키 배열로 브루트 포싱 공격하여 문자열을 얻어내는 함수


main함수에서는 단순히 Decrypt 함수를 불러내는 역할만 하면 되기 때문에 공격 이전에 암호문을 입력받고, 암호문의 길이와 가능한 키 블록의 크기를 알려주도록 하였습니다.


코드는 아래와 같습니다.


import sys

#Get Divisors, if 28 ==> 1,2,4,7,14,28
def getDivisors(num):
	half = int(num/2)
	divisors = []
	
	while half > 0:
		if num % half == 0:
			divisors.append(half)
		half -= 1
			
	divisors.append(num)
	
	return sorted(divisors)


#numlist_a is like [1,2,3,4]
def perm(numlist_a):
	length = len(numlist_a)
	if length == 1:
		return [numlist_a]
	else:
		result = []
		for i in numlist_a:
			numlist_b = numlist_a.copy()
			numlist_b.remove(i)
			numlist_b.sort()
			for j in perm(numlist_b):
				j.insert(0, i)
				if j not in result:
					result.append(j)
					
	return result
	
#Decryption Module
def Decrypt(encString, encLen, U_Key):
	F = open(Your_Directory, 'w') # Your_Directory is not Defined... Please Define your own directory
	msgsize 	= encLen
	keysize 	= len(U_Key)
	ret 		= ''
	
	blocksize 	= int(msgsize/keysize)
	buffer 	= [''] * keysize
	d_buffer	= [''] * keysize
	pos 		= 0
	
	U_Key 		= perm(U_Key)

	for i in range(keysize):
		decString	= encString[pos:pos + blocksize]
		buffer[i]	= decString
		pos 		+= blocksize
	
	for each_key in U_Key:
		for num, d_num in enumerate(each_key):
			d_buffer[d_num-1] = buffer[num-1]
		F.write(''.join(d_buffer))
		F.write("\n")
		
	F.close()
			


if __name__ == "__main__":
	EncryptedMessage	= input("Input Encrypted Message : ")
	EncryptedLen		= len(EncryptedMessage)
	KeyLenSeries		= getDivisors(EncryptedLen)
	
	print("\nYour Key Lengths are : ", KeyLenSeries)
	
	KeyLen			= int(input("\nSelect your key length : "))
	
	if KeyLen not in KeyLenSeries:
		print("Please Check Your Key Length Again.\nProcess Exit.")
		sys.exit(0)
	
	UseKey			= []
	for i in range(1,KeyLen+1):
		UseKey.append(i)
		
	Decrypt(EncryptedMessage, EncryptedLen, UseKey)


동작 구조는 다음과 같습니다.

초기 키 값은 처음 생성된 키 배열을 의미합니다.

키 길이 약수가 만약 4로 선택되었다면, [1,2,3,4]가 되겠죠.

Perm은 모든 배열의 가짓수를 구하는 함수이며, 해당 함수에서 나오는 값은 [1,2,3,4], [1,2,4,3], [1,3,2,4], [1,3,4,2] ..... [4,3,2,1]과 같은 모든 가짓수를 한 배열에 저장하게 됩니다.

그리고 이를 이용하여 각각 복호문을 만들게 되는 것입니다.






'PYTHON > Python 2.x' 카테고리의 다른 글

Python [Windows] Process List Check  (2) 2017.01.15
Python2 시스템 종료 (Python2 Shutdown)  (0) 2017.01.13

+ Recent posts