암호학 (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 |
반응형