본문 바로가기

디지털포렌식(Digital forensic)/키(key)

아핀(affine) 암호, QAPASAA가 가르키는 나라는?

반응형


아핀 암호는 시저 암호와 비제네르 암호보다 더 복잡한 암호화 방법으로,
두 개의 정수 값과 모듈러 연산을 사용하여 암호화한다.

 

아핀 암호의 수학식은 아래와 같다.

C = (a * P + b) % 26
  • C: 암호문의 문자
  • a: 정수 값(공개적으로 알려진 값)
  • P: 평문 문자
  • b: 정수 값(또 다른 키 값)
  • 26: 알파벳 길이 (알파벳 개수 = 문자집합의 크기)

 

여기서 ab는 암호화를 조절하는 두 개의 키 값이다.
a
는 모듈러 역원을 가지는 값이고, 이는 수학적으로 '서로소 관계'인 경우에 해당된다.

 

아핀 암호는 암호학에서 사용되는 대표적인 대치 암호 중 하나입니다. 이 암호는 두 개의 정수, 일반적으로 a와 b라고 표시되는 두 개의 매개변수를 사용하여 평문 문자를 암호화하는 데 사용됩니다.

 

아핀 암호의 복호화는 아래와 같은 구조를 갖는다.

P = (a^(-1) * (C - b)) % M

 

P는 평문 문자이고,

a^(-1)은 a의 모듈러 역수를 나타낸다. 즉, a * a^(-1) % M = 1이어야 한다.

using System;

class AffineCipher
{
    static int ModInverse(int a, int m)
    {
        for (int x = 1; x < m; x++)
            if ((a * x) % m == 1)
                return x;
        return 1;
    }

    static string Encrypt(string plaintext, int a, int b)
    {
        string ciphertext = "";
        foreach (char c in plaintext)
        {
            if (char.IsLetter(c))
            {
                char encryptedChar = (char)(((a * (c - 'A') + b) % 26) + 'A');
                ciphertext += encryptedChar;
            }
            else
            {
                ciphertext += c;
            }
        }
        return ciphertext;
    }
    
    static string Decrypt(string ciphertext, int a, int b)
    {
        int aInverse = ModInverse(a, 26);
        string plaintext = "";
        foreach (char c in ciphertext)
        {
            if (char.IsLetter(c))
            {
                char decryptedChar = (char)(((aInverse * (c - 'A' - b + 26)) % 26) + 'A');
                plaintext += decryptedChar;
            }
            else
            {
                plaintext += c;
            }
        }
        return plaintext;
    }

    static void Main(string[] args)
    {
        string plaintext = "WINE";
        int a = 5;
        int b = 8;

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

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

WINE 이라는 평문을 입력하면 OWVC로 암호화가 된다.

 


암호화된 알파벳 QAPASAA의 원문은?

 

728x90