본문 바로가기

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

숫자 전치 암호, 짐 캐리의 <넘버23> 9161938535

반응형

 

2007년에 나온 영화 <넘버23>

23쌍의 염색체로 이루어진 인간의 세포,
적혈구가 인간의 몸 한 바퀴를 도는 데 걸리는 시간은 23초,
유클리드 기하학의 정의 23개,
중세 템플기사단 역대 수장 23명,
악마의 연회일 6월 23일,
시저 황제 23번 찔림,
주요 테러사건 발생일(2001년 9월 11일)의 합 23,
타이타닉 침몰일(1912년 4월 15일)의 합 23,
일본 히로시마에 원폭이 투하된 시간(오전 8시 15분)의 합 23,
체르노빌 원전폭발 사고가 새벽 1시 23분에 발생
지구 자전축은 23.5도 기울어져 있고,
마야 문명은 2012년 12월 23일이 종말이었다.
게다가 영화 주인공과 관련된 모든 숫자도 23이었다.


 

"전치 암호(Transposition Cipher)"는 숫자만을 위한 암호화이다.
이 방법은 숫자의 순서를 바꾸어 암호화하는 방식으로, 간단하면서도 다양한 변형이 가능한 암호화 방법이다.

전치 암호의 기본 원리는 입력된 숫자를 일정한 규칙에 따라 재배열하여 암호화하는 것이다.


예를 들어, 입력된 숫자를 두 자리씩 끊어서 역순으로 재배열하는 방식,
입력된 숫자가 "123456"이라면 두 자리씩 끊어서 역순으로 재배열하면 "654321"이 된다.

역순으로 재배치하지 않고 두 자리씩 끊는다면 563412가 된다.

 

using System;

class TranspositionCipher
{
    static string Encrypt(string plaintext)
    {
        int length = plaintext.Length;
        int rows = (int)Math.Ceiling((double)length / 2);
        char[,] matrix = new char[rows, 2];

        int index = 0;
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                if (index < length)
                {
                    matrix[i, j] = plaintext[index];
                    index++;
                }
            }
        }

        string encryptedText = "";
        for (int j = 0; j < 2; j++)
        {
            for (int i = 0; i < rows; i++)
            {
                if (matrix[i, j] != '\0')
                {
                    encryptedText += matrix[i, j];
                }
            }
        }

        return encryptedText;
    }

    static string Decrypt(string ciphertext)
    {
        int length = ciphertext.Length;
        int rows = (int)Math.Ceiling((double)length / 2);
        char[,] matrix = new char[rows, 2];

        int index = 0;
        for (int j = 0; j < 2; j++)
        {
            for (int i = 0; i < rows; i++)
            {
                if (index < length)
                {
                    matrix[i, j] = ciphertext[index];
                    index++;
                }
            }
        }

        string decryptedText = "";
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                if (matrix[i, j] != '\0')
                {
                    decryptedText += matrix[i, j];
                }
            }
        }

        return decryptedText;
    }

    static void Main(string[] args)
    {
        string plaintext = "123456";

        string encryptedText = Encrypt(plaintext);
        Console.WriteLine("Encrypted: " + encryptedText);

        string decryptedText = Decrypt(encryptedText);
        Console.WriteLine("Decrypted: " + decryptedText);
    }
}

 

결과
Encrypted: 135246
Decrypted: 123456


9161938535

 

이 숫자들과 23과의 관계는?

728x90