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


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

Python으로 Windows OS의 프로세스를 체크하는 소스입니다.

먼저 소스를 봅시다.


import os, sys, time
from win32com.client import GetObject

WMI = GetObject('winmgmts:')

ProcessList = []

processes = WMI.instancesOf('Win32_Process')

for process in processes:
	 ProcessList.append(process.Properties_('Name').Value)

print ProcessList


소스에서 os, sys, time 이외의 win32com.client라는 패키지와 GetObject라는 모듈이 있습니다.

win32com.client는 Python 모듈을 따로 받아줘야 합니다.


win32com.client 다운로드 링크(Source Forge) : https://sourceforge.net/projects/pywin32/files/?source=navbar


각설하고, 소스를 설명하겠습니다.


WMI에는 GetObject('winmgmts:')를 선언합니다.

processes라는 변수에는 WMI.instancesOf('Win32_Process')를 통해 프로세스에 대한 데이터를 모두 긁어옵니다.

그리고 for 문에서는 processes에서 있는 정보를 하나씩 가져와서 Properties_('Name').Value를 통해 하나씩 ProcessList에 append 하도록 만들었습니다.

이후 ProcessList를 통해 확인합니다.


<<참고>>


GetObject()함수는 VB(Visual Basic)의 GetObject() 함수와 동일한 기능을 한다고 합니다.

GetObject(Class = "ProgramID") 혹은 GetObject(Class = clsid)로 쓰면, 이미 실행하고 있는 COM object에 연결합니다.

COM(Component Object Model) object란 마이크로소프트가 개발한 소프트웨어 구성요소들의 응용프로그램 이진 인터페이스를 말합니다.






Python 2.7.x로 작성한 shutdown.py입니다.


다음 소스는 랜덤한 시간으로 shutdown을 할 수 있도록 하는데, shutdown은 os.system 함수를 사용합니다.

아주 아주 간단한 소스입니다.

-r 옵션은 restart옵션이고, 만약 컴퓨터를 끄고 싶다면 -s를 사용하면 되겠습니다.


#python 2 version source
import os
import random

time = random.randrange(600,900)

os.system("shutdown -r -t %s" % str(time))


os.system을 통해 cmd 창에서 실행할 명령어를 작성하였습니다.

str(time)은 time을 랜덤값으로 600 ~ 900sec를 주어지도록 하였습니다.


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

Python3 Transposition Cipher Bruteforcing(전치 암호)  (0) 2017.04.04
Python [Windows] Process List Check  (2) 2017.01.15

+ Recent posts