함수는 총 세 가지로 작성하였습니다.
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 |