본문 바로가기

해킹&보안/웹 & 앱

Brute Force Attack

본 블로그의 정보는 공부 목적입니다. 
허가 없이 어떠한 공격, 악용하는 경우 모든 법적 책임은 사용자 본인에게 있습니다.

의미&특징

  • 브루트포스(전수 조사 공격)은 암호학에서 카이사르암호(시저암호)등에 적용할 수 있는 공격이다.
  • 이 공격은 모든 경우의 수를 모두 대입하여 평문을 찾아내는 방법이다.
  • 간단하고 직관적인 방법이지만, 경우에 따라 실행 시간이 매우 길어질 수 있다. 특히 입력의 크기가 클 때는 모든 가능한 경우의 수를 시도하는 것이 현실적으로 불가능할 수도 있다.

출처 - https://ko.wikipedia.org/wiki/무차별_대입_공격

 

암호학 공부 시작했을 때 카이사르 암호부터 시작을했다. 이 카이사르 암호가 전수조사 공격에 취약하다고 들었고 그 공격을 코드로 구현해서 암호문을 해독해보면 어떨까 싶어 파이썬으로 구현해보기로 했다. 

 

시나리오

A는 길을가다가 쪽지를 주웠고 쪽지안에는 비밀번호 1279!@1245가 적혀있었다. 하지만 이 쪽지의 주인을 몰라 쪽지를 뒤져보니 암호화된 문자열이 있었다. 이 문자열이 쪽지의 정보와 관련이 있을 수도 있으니 해독해보기로 했다.

암호화된 문자열은 다음과 같다▼

더보기
tqxxa yk zmyq ue XET. Ftue bmeeiadp ue yk xmbfab bmeeiadp. Bxqmeq abqz ftq MNO ruxq mzp otqow uf

파이썬 코드로 구현을 하여 해독해보자.

def makeDisk(k):
    
    dec_disk = {}
   
    for i in range(26):
        
        alp = (i+k) % 26 + 65
        
        dec_disk[chr(alp)] = chr(i + 65)
        
    return dec_disk

위 코드를 간단히 설명해보자면

디스크를 생성하고, 26개의 알파벳에 대해 반복하는데 시저 암호 키를 적용하여 새로운 알파벳을 계산하고 디스크에 매핑 추가하는 코드라고 보면 될 것 같다

 

def caesar(msg, key):
    ret = ''
    
    msg = msg.upper()
    
    disk = makeDisk(key)
    
    for c in msg:
        if c in disk:
           
            ret += disk[c]
        else:
            
            ret += c
    return ret

다음으로는

msg=msg.upper() : 모든 문자를 대문자로 변환하고,

disk = makeDisk(key) :시저 디스크 생성

for c in msg

    if c in disk:  : 메시지의 각 문자에 대해 시저 암호 적용

ret += disk[c] : 디스크에 매핑된 값으로 변환

ret += c : 디스크에 매핑되지 않은 문자는 그대로 유지

 

def attack(msg):
    
    for key in range(1, 26):
       
        decmsg = caesar(msg, key)
        print('SHIFT[%d]: %s' % (key, decmsg))

if __name__ == '__main__':
    
    msg = 'tqxxa yk zmyq ue XET. Ftue bmeeiadp ue yk xmbfab bmeeiadp. Bxqmeq abqz ftq MNO ruxq mzp otqow uf'
   
    attack(msg)

range(1, 26)으로 가능한 모든 키에 대해 시저 암호 해독 시도하고, decmsg로 암호 해독 결과를 출력해준다.

"msg = "는 암호 해독을 위한 문자열을 뜻하기 때문에 이 부분에 암호 문자열을 넣어준다

 

이렇게 코드는 끝이 났다.이제 실행을 해보자.

실행 결과

쉬프트를 1번, 2번 ... 25번까지 모두 해본 코드이다. 

하나씩 보니 12번 쉬프트한 것만 우리가 이해할 수 있는 문장으로 해독이 되었고 나머지는 알 수 없는 문자임을 알 수 있었다

"안녕 나의 이름은 LSH이고 이 비밀번호는 내 노트북 비밀번호야. ABC파일을 열어서 확인해줘" 라는 의미였다.

 

코드 정리

def makeDisk(k):
    dec_disk = {}
    for i in range(26):
        alp = (i+k) % 26 + 65
        dec_disk[chr(alp)] = chr(i + 65)
    return dec_disk

def caesar(msg, key):
    ret = ''
    msg = msg.upper()
    disk = makeDisk(key)
    for c in msg:
        if c in disk:
            ret += disk[c]
        else:
            ret += c
    return ret

def attack(msg):
    for key in range(1, 26):
        decmsg = caesar(msg, key)
        print('SHIFT[%d]: %s' % (key, decmsg))

if __name__ == '__main__':
    msg = 'Mjqqt Rd sfrj nx Qjj Xjzsl Mzs'
    attack(msg)

'해킹&보안 > 웹 & 앱' 카테고리의 다른 글

OWASP TOP 10  (0) 2024.07.31
XSS  (0) 2024.07.31
쿠키&세션  (0) 2024.07.30
취약점 (vulnerability)  (0) 2024.05.27
웹 애플리케이션 모의해킹  (0) 2024.05.15