02. 암호와 순서의 세계, 순열(Permutation)

1. 학습 목표 (Learning Objectives)

  • 뽑을 때 ‘순서’에 따라 전혀 다른 의미로 변하는 위계와 권력의 논리, ‘순열(Permutation)’과 계승 기호 ‘팩토리얼(!)’의 개념을 마스터합니다.
  • 파이썬의 itertools.permutations 모듈을 이용하여 암호 자물쇠의 가능한 번호를 무차별 대입(Brute-force) 방식으로 전부 해킹(나열)하는 알고리즘 시뮬레이션을 구축해 봅니다.

2. 순서가 곧 권력! 순열($_nP_r$)

경우의 수를 세는 수학 기호 중 알파벳 $\mathbf{P}$ 로 표기되는 문법이 있습니다. 바로 순열(Permutation) 의 약자입니다.

순열의 철학: “누가 첫 번째고 누가 두 번째인지, 그 배열된 자존심 순서(Rank)가 우주에서 제일 중요하다! 똑같은 놈 3명을 뽑았어도 서 있는 순서가 바뀌면 무조건 새로운 경우의 수로 취급한다!”

예시 시나리오: 5명의 후보 동아리 부원 중, (회장 1명, 부회장 1명) 총 2명의 권력 핵심 간부를 선출해야 합니다!

  • 뽑히는 후보군: 5명
  • 선택할 자리 수: 2명
  • 수학 기호로는 $_5P_2$ 라고 부르며, 계산 방식은 첫 번째 회장 자리에 앉을 후보(5명) $\times$ 부회장 자리에 앉을 남은 후보(4명) = $\mathbf{20\text{가지의 집권 체제 조합}}$. [수식: $5 \times 4$]

3. 미친 듯이 커지는 경우의 폭주, 팩토리얼 ($N!$)

학생 10명이 단체로 일렬로 서서 사진을 찍는다고 가정해 볼까요? 수학 기호 $\mathbf{P}$ 의 규칙대로, 회장을 뽑는 방식과 똑같이 일일이 첫 번째 줄, 마지막 줄 자리에 올 학생을 순서대로 박습니다.

  • $10P{10} = 10 \times 9 \times 8 \times 7 \dots \times 2 \times 1 = \mathbf{3,628,800\text{가지}}$ (미친 숫자!!!)

이렇게 10부터 맨 끝 1까지 무자비하게 줄지어 싸그리 몽땅 다 곱해버리는 잔인한 수식을 수학 세계에서는 1글자의 느낌표 ‘$10!$’ (10 팩토리얼, Factorial) 기호로 축약하여 표현합니다. (고작 10명이 자리를 바꿨을 뿐인데 무려 $362$만 장의 사진이 나옵니다!)

순열(Permutation) 슬롯 머신 SVG: 빈자리 3개를 그려놓고, 첫 번째 자리에 올 수 있는 경우 5가지, 두 번째 4가지, 세 번째 3가지가 연속해서 곱해지는(5*4*3=60) 순열의 수학적 직관을 도식화한 인포그래픽
2D 웹툰 애니 사이버펑크 스타일: 어두운 방에서 후드를 깊게 눌러쓴 차가운 표정의 전문 해커가 초록색으로 빛나는 홀로그램 키보드를 맹렬하게 두드리는 가운데, 그의 등 뒤로는 거대한 디지털 자물쇠를 중심으로 수백만 개의 3자리 숫자 배열(순열 브루트포스) 경우의 수가 폭포수 매트릭스처럼 쏟아져 내리며 자물쇠가 깨지기 직전인 역동적 장면

4. 파이썬 무차별 대입 암호 해킹 체험 (Python)

순열의 이 “엄격한 순서와 배열의 교체 규칙” 은 현대 해커들이나 암호 자물쇠 전문가들이 가장 머리 아파하는 지점입니다. 여행용 가방 3자리 다이얼 번호 자물쇠나 핸드폰 비밀번호는 순열($_nP_r$)의 원리로 지독하게 방어되고 있기 때문입니다.

파이썬의 permutations 엔진 코드를 사용해 우리가 해커가 된 것처럼 숫자를 뽑아 배열해 보겠습니다!

import itertools

# 1. 0부터 4까지, 5개의 숫자 키패드 해킹판
numbers = [0, 1, 2, 3, 4]
r_length = 3  # 3자리 비밀번호를 만들자! (기호: 5P3)

print("🔐 [해킹 시스템 가동] 브루트포스 순열 비밀번호 스캐너")
print(f"👉 타겟 넘버 풀: {numbers} | 비밀번호 자릿수: {r_length}자리")
print("-" * 50)

# 2. 파이썬 `permutations` 엔진 (5개의 숫자 중 3개를 뽑아 모든 '순서/배열' 구성)
all_passwords = list(itertools.permutations(numbers, r_length))

# 총 경우의 수 계산 (_5P_3 = 5 x 4 x 3 = 60가지)
print(f"🔥 예측된 총 수학적 비밀번호 경우의 수 (_5P_3): {len(all_passwords)}가지 발생!\n")

# 3. 해킹된 번호 렌더링 리스트 출력 (극히 일부만 예제로)
for idx, pwd in enumerate(all_passwords[:10], 1):
    # 튜플 (1, 2, 3) 을 문자열 '123' 형태의 진짜 비밀번호처럼 합치기(join)
    pwd_str = "".join(map(str, pwd))
    print(f"[해킹 시도 #{idx:02d}] 입력값 : {pwd_str}")

print("(.....이하 수십 개의 브루트포스 조합 생략.....)")

파이썬의 실행 결과 요약:

🔐 [해킹 시스템 가동] 브루트포스 순열 비밀번호 스캐너
👉 타겟 넘버 풀: [0, 1, 2, 3, 4] | 비밀번호 자릿수: 3자리
--------------------------------------------------
🔥 예측된 총 수학적 비밀번호 경우의 수 (_5P_3): 60가지 발생!

[해킹 시도 #01] 입력값 : 012
[해킹 시도 #02] 입력값 : 013
[해킹 시도 #03] 입력값 : 014
[해킹 시도 #04] 입력값 : 021
[해킹 시도 #05] 입력값 : 023
[해킹 시도 #06] 입력값 : 024
[해킹 시도 #07] 입력값 : 031
[해킹 시도 #08] 입력값 : 032
[해킹 시도 #09] 입력값 : 034
[해킹 시도 #10] 입력값 : 041
(.....이하 수십 개의 브루트포스 조합 생략.....)

인간이 자물쇠를 돌려 60번을 헤매야 하는 순열$_5P_3$ 의 모든 경우를, 파이썬의 permutations 모듈은 내부 수학 팩토리얼 알고리즘을 회전시켜 문자열 조합 튜플을 1억 개라도 쏟아낼 준비가 된 해킹 머신입니다.

5. 학습 정리 (Summary)

  1. 순열 ($_nP_r$): $n$개의 원소 중 $r$개를 뽑아 철저하게 ‘순서대로 차곡차곡 배열’하는 경우의 수 방법론으로, 회장/부회장 선거나 자물쇠 암호처럼 순번이 뒤바뀌면 의미가 완전히 박살 나는 권력과 지위의 연산자입니다.
  2. 파이썬 연계 itertools.permutations: 순열 수열 공식을 그대로 IT 로직으로 짠 파이썬의 고성능 라이브러리로, 모든 발생 가능한 숫자/데이터 문자열의 배열 쌍을 단기간에 브루트포스식으로 추출하고 병합하는 비밀번호 필터링 시뮬레이션에 유용합니다.
서브목차