암호학 (Cryptology)/code

[C++] 블록암호 구현 - 패딩 (Padding)

oolongeya 2021. 12. 12. 16:16
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
 
// 블록암호 구현 - 패딩(Padding)
 
#include <iostream>
#include <fstream>
 
using namespace std;
typedef unsigned char byte;
 
// 0x80 패딩
 
void padding(byte in[], int in_length, byte out[16]) {
 
    byte pad_byte = 0x80;
 
    for (int i = 0; i < in_length; i++) {
        out[i] = in[i];
    }
    out[in_length] = 0x80;
    for (int i = in_length + 1; i < 16; i++) {
        out[i] = 0x00;
    }
}
 
 
void padding_test() {
    
    ifstream fin;
    ofstream fout;
 
    char ch;
 
    // 사용할 binary 파일 작성
    
    int tmp = 0x01020304;
 
    fout.open("file-in.bin");
 
    for (int i = 1; i < 10; i++) {
        fout.write((char*)&tmp, sizeof(tmp));
        tmp += 0x01;
    }
    fout.close();
    
 
    fin.open("file-in.bin", ios::binary);
    if (fin.fail()) {
        cout << "Input file open error!" << endl;
        return;
    }
 
    fout.open("file-out.bin", ios::binary);
    if (fout.fail()) {
        cout << "Output file open error!" << endl;
        return;
    }
 
    // 파일 크기 확인
    int file_size;
 
    fin.seekg(0, fin.end); // 파일 포인터를 끝으로 이동해서 계산 하는 방식
    file_size = fin.tellg(); // .. 
    cout << "Input File Size = " << file_size << endl;
    fin.seekg(0, fin.beg);
    
    int num_block, remainder;
    num_block = file_size / 16 + 1// 패딩 후 출력되는 블록 개수
    remainder = file_size - (num_block - 1* 16;
 
    byte buffer[16];
    for (int i = 0; i < num_block - 1; i++){
        fin.read((char*)buffer, 16);
        fout.write((char*)buffer, 16);
    }
 
    byte out_buffer[16];
    for (int i = 0; i < remainder; i++){
        fin.read(&ch, 1);
        buffer[i] = ch;
    }
 
    padding(buffer, remainder, out_buffer);
    fout.write((char*)out_buffer, 16);
 
    fin.close();
    fout.close();
 
}
 
 
int main()
{
    padding_test();
}
cs

 

 

반응형