본문 바로가기

해킹&보안/암호학

[아핀 암호 알고리즘]

아핀 암호는 치환 암호의 한 혀애로, 평문의 각 문자를 다른 문자로 대체하는 방식으로 작동합니다. 이 암호는 다음과 같은 수학적인 함수를 사용하여 평문을 암호화 합니다.

 

 

아핀암호의 장단점

장점

  1. 간단한 구현: 아핀 암호는 수학적 함수를 사용하여 평문을 암호화하기 때문에 구현이 간단하다.
  2. 빠른 암호화 및 복호화: 간단한 수학적 연산으로 이루어지므로 암호화 및 복호화 과정이 빠르다.

단점

  1. 약한 보안성: 아핀 암호는 단순한 구조로 인해 보안성이 상대적으로 약하다. 암호문을 통게적 분석을 통해 쉽게 공격할 수 있다.
  2. 키 값을 안전하게 공유하는 것이 중요하며, 이를 위한 안전한 키 교환 방법이 필요하다.

아핀암호의 암호화 수식은 다음과 같다

C = (P * K1 + K2)  mod 26

 

평문에서 k1을 곱한 후, k2를 더해준다. 결과 값이 허용 범위를 넘어설 경우 mod26을 취해서 범위 안으로 유도해준다.

 

반대로 복호화의 수식은 아래와 같은 방법으로 복호한다

P = ((C - K2) * K1-1) mod 26

복호화도 마찬가지로 결과 값이 허용 범위를 넘어설 경우 mod26을 취해서 범위 안으로 유도해준다.

 

affine cipher 예시

평문과 k1을 곱하고 k2를 더하는 과정( 26이상일때는 mod26을 수행)

 

아핀암호의 기본적인 개념을 알았으니 C언어로 구현을 해보겠습니다.

C언어로 구현을 하면 아래와 같은 코드로 나올 수 있습니다.

더보기

#include <stdio.h>


char affineEncrypt(char plaintext, int a, int b) {
    if (plaintext >= 'a' && plaintext <= 'z') {
        return 'a' + (a * (plaintext - 'a') + b) % 26;
    }
    return plaintext; 
}


char affineDecrypt(char ciphertext, int a, int b) {
    if (ciphertext >= 'a' && ciphertext <= 'z') {
        int a_inverse = 0;
     
        while ((a * a_inverse) % 26 != 1) {
            a_inverse++;
        }
        return 'a' + (a_inverse * (ciphertext - 'a' - b + 26)) % 26;
    }
    return ciphertext;
}

int main() {
    char message[] = "hello world"; 
    int a = 5; // a 값
    int b = 8; // b 값

    printf("평문: %s\n", message);


    printf("암호화: ");
    for (int i = 0; message[i] != '\0'; i++) {
        printf("%c", affineEncrypt(message[i], a, b));
    }
    printf("\n");


    printf("복호화: ");
    for (int i = 0; message[i] != '\0'; i++) {
        printf("%c", affineDecrypt(affineEncrypt(message[i], a, b), a, b));
    }
    printf("\n");

    return 0;
}

함수별로 자세히 알아보겠습니다.

char affineEncrypt(char plaintext, int a, int b) {
    if (plaintext >= 'a' && plaintext <= 'z') {
        return 'a' + (a * (plaintext - 'a') + b) % 26;
    }
    return plaintext; 
}

암호화 함수 부분인데 이 부분에선

1. 평문 문자를 입력으로 받아서  a, b값을 사용하여 암호화

2. 암호화된 문자를 반환

3. 소문자 알파벳에만 적용

 

char affineDecrypt(char ciphertext, int a, int b) {
    if (ciphertext >= 'a' && ciphertext <= 'z') {
        int a_inverse = 0;
     
        while ((a * a_inverse) % 26 != 1) {
            a_inverse++;
        }
        return 'a' + (a_inverse * (ciphertext - 'a' - b + 26)) % 26;
    }
    return ciphertext;
}

이 함수는 복호화 함수입니다.

1. 암호문 문자를 입력으로 받고  a, b값을 사용하여 복호화 진행

2. 복호화된 문자를 반환

3. 소문자 알파벳에만 적용

 

int main() {
    char message[] = "hello world"; 
    int a = 5; // a 값
    int b = 8; // b 값

    printf("평문: %s\n", message);


    printf("암호화: ");
    for (int i = 0; message[i] != '\0'; i++) {
        printf("%c", affineEncrypt(message[i], a, b));
    }
    printf("\n");


    printf("복호화: ");
    for (int i = 0; message[i] != '\0'; i++) {
        printf("%c", affineDecrypt(affineEncrypt(message[i], a, b), a, b));
    }
    printf("\n");

    return 0;
}

main 함수 부분입니다.

1. 사용자가 지정한 평문을 정의하고, 아호화를 위해 a, b 값을 설정

2. 아핀 암호화 함수를 사용하여 평문을 암호화하고, 그 결과를 출력

3. 다시 암호문을 아핀 복호화 함수를 사용하여 원래의 평문으로 복호화, 결과 출력

 

여기서 message에 hello world를 저장하여서 이 문자열을 가지고 암호화, 복호화를 진행하는 코드입니다.

 

 

  정리를 하면         

평문 : hello world     

암호화 키: (5, 8)      

      암호화 결과 : rclla oaplx

                                    복호화 결과 : hello world(원래 상태로 복구)

'해킹&보안 > 암호학' 카테고리의 다른 글

AES (고급 암호화 표준)  (1) 2024.05.24
블록 암호  (0) 2024.05.24
[곱셈 암호 알고리즘]  (0) 2024.04.30
[카이사르 복호화 알고리즘]  (1) 2024.03.24
[카이사르 암호화 알고리즘]  (0) 2024.03.24