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