본문 바로가기

디지털포렌식(Digital forensic)/숫자

[파일]통장 비밀 번호

반응형

현재 통장 비밀 번호는 4자리 숫자를 사용한다.
각 자리 마다 0~9까지 선택할 수 있으므로 10개의 숫자를 선택할 수 있으므로
조합되는 총 비밀 번호의 숫자는 10×10×10×10 = 10,000개의 비밀번호가 만들어진다.
 
은행에서는 비밀번호가 뚫리는 보안 문제를 막고자
1) 같은 숫자로 반복되는 경우
2) 동일 숫자가 2회 이상인 경우
3) 생일 4자리와 같은 경우
4) 나열되는 숫자(1,2,3,4)의 경우에는 비번 생성을 할 수 없도록 규칙을 만들어놓았다.


같은 숫자로 반복되지 않도록 하는 경우의 수

예) 9987 = 같은 숫자 9가 반복됨.
위의 예와 같이 같은 숫자로 반복되지 않도록 하는 경우의 수는
첫번째 자리는 어느 숫자가 와도 상관없으므로 10
두번째 자리는 첫번째 자리 숫자를 제외한 9
세번째 자리는 첫번째 자리와 두번째 자리를 제외한 8
네번째 자리는 첫번째, 두번째, 세번째 자리를 제외한 7개의 숫자만 올 수 있으므로
 

10 * 9 * 8 * 7 = 5,040가지
실제 만들 수 있는 수는 10,000 - 5,040 = 4,960가지가 된다.

 

총 4개의 숫자 중에서 2개+2개가 반복되는 경우의 수

먼저, 비밀번호 4자리를 2개+2개로 구분해보자.
앞의 2개짜리 한 그룹과 뒤의 2개짜리 한 그룹이 있다.
먼저, 앞의 한 그룹은 10개 숫자 중에서 2개를 선택하는 조합의 수를 계산하면
 

10C2 = 10! / (2!(10-2)!)

여기서,
10은 전체 항목의 수
2는 선택할 항목의 수가 된다.

C기호는 combination(조합)기호로 
n개의 원소를 갖는 집합에서 r개의 원소를 선택하는 경우의 수를 의미한다.
우리의 경우는 10개의 원소를 갖는 집합 속에서 2개의 원소를 선택하니 10C2로 표현했다.

 
10! (10 팩토리얼)은 10부터 1까지 모든 양의 정수를 곱한 값이다.
10! = 10 x 9 x 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 3,628,800
 
2! (2 팩토리얼)은 2부터 1까지 모든 양의 정수를 곱한 값이다.
2! = 2 x 1 = 2

위 값을 공식에 대입해서 계산하면
10C2 = 10! / (2!(10-2)!)
10C2 = 3,628,800 / (2! * 8!) , 여기서 8! =
8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 40,320 이므로 다시 대입하면

10C2 = 3,628,800 / 80,640 ≈ 45

따라서, 10개의 숫자중에서 2개를 선택하는 조합의 수는 약 45개가 된다.


아래 코드는 C#으로 만들어진 비밀번호 생성코드다.
생성되는 비밀번호는 총 9720개로
생성 조건에서 제약되는 조건은 두 개가 적용되었다.

1. 각 자릿수는 0~9까지의 숫자 중 하나를 가진다.
2. 비밀번호에는 중복된 숫자가 포함되어서는 안된다.
 

ConsoleApp1.zip
0.03MB

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<string> passwords = GeneratePasswords();

        foreach (string password in passwords)
        {
            Console.WriteLine(password);
        }
    }

    static List<string> GeneratePasswords()
    {
        List<string> passwords = new List<string>();

        for (int d1 = 0; d1 <= 9; d1++)
        {
            for (int d2 = 0; d2 <= 9; d2++)
            {
                for (int d3 = 0; d3 <= 9; d3++)
                {
                    for (int d4 = 0; d4 <= 9; d4++)
                    {
                        // Check if the password contains repeating digits
                        if (d1 == d2 || d1 == d3 || d1 == d4 || d2 == d3 || d2 == d4 || d3 == d4)
                            continue;

                        // Create the password string
                        string password = $"{d1}{d2}{d3}{d4}";

                        // Add the password to the list
                        passwords.Add(password);
                    }
                }
            }
        }

        return passwords;
    }
}

결과

비밀번호 생성 알고리즘의 순서는 아래와 같다.
 
1. 첫번째 자릿수 (d1)을 0부터 9까지 시도한다.
2. 두번째 자릿수 (d2)는 0부터 9까지 시도하되, d2가 d1과 같아서는 안된다.
3. 세번째 자릿수 (d3)는 0부터 9까지 시도하되, d3는 d2, d1과 같아서는 안된다.
4. 네번째 자릿수 (d4)는 0부터 9까지 시도하되, d4는 d3, d2, d1과 같아서는 안된다.

위 코드의 특징은
숫자 비밀번호의 '중복방지'라는 코드의 절대 조건에 따라
 

0, 1로 시작하는 코드는 생성할 수 없다.



당신의 통장 비밀 번호도 이 숫자들 중 하나
 

728x90