[C++] 블록암호 구현 - 구현 검증 (AES_AVS)

oolongeya

·

2021. 12. 12. 22:52

AES.zip
0.02MB

프로젝트에 위와 같은 파일들을 추가하여 AES 구현을 검증한다.

 

아래의 문서를 참고한다.

 

검증시스템과 테스트 벡터는 국가정보원 자료실 파일을 참고한다.

https://www.nis.go.kr/AF/1_7_35/vew.do?seq=102&currentPage=1&selectBox=&searchKeyword=&fromDate=&toDate= 

 

자료실 상세 | 암호모듈 검증 | 사이버 안보 | 주요업무 | NIS 국가정보원

 

www.nis.go.kr

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include <iostream>
#include "AES32.h"
#include "AES8.h"
 
using namespace std;
 
bool isHex(char ch) {
    return ((ch >= '0'&& (ch <= '9')) ||
        ((ch >= 'A'&& (ch <= 'F')) ||
        ((ch >= 'a'&& (ch <= 'f'));
}
 
 
// '8' -> 8, "d" -> 13, 'g' -> error!
// 입력 ch : {0, 1, ... , 9, A, .. F, a, ... , f }
byte Hex2Digit(char ch) {
    if (!isHex(ch)) {
        cout << ch << " is not a hex value!" << endl;
        return -1// 의미없는 출력
    }
    if ((ch >= '0'&& (ch <= '9')) {
        return ch - '0'// 예: '7' - '4' = 3
    }
    else if ((ch >= 'A'&& (ch <= 'F')) {
        return ch - 'A' + 10;
    }
    else if ((ch >= 'a'&& (ch <= 'f')) {
        return ch - 'a' + 10;
    }
    cout << "Unknown error!" << endl;
    return -1;
}
 
 
// "8d" -> 8d (string -> num) 
byte Hex2Byte(const char h[2]) {
    byte upper, lower;
    upper = h[0];
    lower = h[1];
    if ((!isHex(upper)) || (!isHex(lower))) {
        cout << "Hex Error" << endl;
        return -1;
    }
    return Hex2Digit(upper) * 16 + Hex2Digit(lower);
}
 
// "8d2e60365f17c7df1040d7501b4a7b5a" -> {8d, 2c, ... , 5a}
void Hex2Array(const char hex_str[], int hex_len, byte barr[]) {
    char h[2];
    byte b_value;
    for (int i = 0; i < hex_len / 2; i++) {
        h[0= hex_str[2 * i];
        h[1= hex_str[(2 * i) + 1];
        b_value = Hex2Byte(h);
        barr[i] = b_value;
    }
 
}
 
void print_b_array(byte b_arr[], int len, const char* Pstr = nullptr) {
    if (Pstr != nullptr) {
        printf("%s = ", Pstr);
    }
    for (int i = 0; i < len; i++) {
        printf("%02x ", b_arr[i]);
    }
    printf("\n");
}
 
void xor_b_array(byte data[], int len, byte xor_arr[]) {
    for (int i = 0; i < len; i++) {
        data[i] ^= xor_arr[i];
    }
}
 
void copy_b_array(byte src[], int len, byte dest[]) {
    for (int i = 0; i < len; i++) {
        dest[i] = src[i];
    }
}
 
void hex_string_test() {
    const char* hex_string = "8d2e60365f17c7df1040d7501b4a7b5a"// literal pool
    byte b[16];
    Hex2Array(hex_string, 32, b);
    printf("[hex_string_test]\n");
    print_b_array(b, 16"KEY");
    printf("\n");
}
 
// -----------------------------------------------------------------------------
void MCT_ECB() {
    const char* hex_key = "8d2e60365f17c7df1040d7501b4a7b5a";
    const char* hex_pt = "59b5088e6dadc3ad5f27a460872d5929";
    byte key[16], pt[16], ct[16];
    u32 rk32[11][4];
 
    Hex2Array(hex_key, 32, key);
    Hex2Array(hex_pt, 32, pt);
 
    printf("[MCT_ECB]\n");
 
    //for (int i = 0; i < 100; i++) {
    for (int i = 0; i < 3; i++) { // 양이 좀 많아서 3으로.. ㅎㅎ.
        print_b_array(key, 16"KEY");
        print_b_array(pt, 16"PT");
 
        for (int j = 0; j < 1000; j++) {
            AES32_Enc_KeySchedule(key, rk32);
            AES32_Encrypt(pt, rk32, ct);
            copy_b_array(ct, 16, pt);
        }
        print_b_array(ct, 16"CT");  
 
        xor_b_array(key, 16, ct);
        copy_b_array(ct, 16, pt);
        printf("\n");
    }
}
 
void MCT_CBC() {
    const char* hex_key = "9dc2c84a37850c11699818605f47958c";
    const char* hex_iv = "256953b2feab2a04ae0180d8335bbed6";
    const char* hex_pt = "2e586692e647f5028ec6fa47a55a2aab";
    byte key[16], iv[16], pt[16], ct[16], prev_ct[16];
    u32 rk32[11][4];
 
    Hex2Array(hex_key, 32, key);
    Hex2Array(hex_iv, 32, iv);
    Hex2Array(hex_pt, 32, pt);
 
    printf("[MCT_CBC]\n");
 
    //for (int i = 0; i < 100; i++) {
    for (int i = 0; i < 3; i++) { // 양이 좀 많아서 3으로.. ㅎㅎ.
        print_b_array(key, 16"KEY");
        print_b_array(iv, 16"IV");
        print_b_array(pt, 16"PT");
 
        for (int j = 0; j < 1000; j++) {
            AES32_Enc_KeySchedule(key, rk32);
            if (j == 0) {
                xor_b_array(pt, 16, iv);
                AES32_Encrypt(pt, rk32, ct);
                copy_b_array(iv, 16, pt);
            }
            else {
                copy_b_array(ct, 16, prev_ct);
                xor_b_array(pt, 16, prev_ct);
                AES32_Encrypt(pt, rk32, ct);
                copy_b_array(prev_ct, 16, pt); // PT[0] = CT[j-1]; 를 한거와 같음 (MCT algorithm)
            }
        }
        print_b_array(ct, 16"CT");
        xor_b_array(key, 16, ct);
        copy_b_array(ct, 16, iv);
        printf("\n");
    }
 
}
 
int main()
{
    hex_string_test();
    MCT_ECB();
    MCT_CBC();
}
 
 
cs

 

반응형