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
| #include<iostream>
#include<algorithm>
#include<string>
#include<queue>
using namespace std;
typedef unsigned char byte;
void init(byte S[], byte K[], char key[]) {
int keysize = strlen(key);
int i;
for (i = 0; i < 256; i++) {
S[i] = (byte)i;
K[i] = (byte)key[i % keysize]; //ex) key 가 damin 이라면 K[0] = d, K[1] = a ...
}
}
void Shuffle(byte S[], byte K[]) {
int i, j = 0;
for (i = 0; i < 256; i++) {
j = (j + S[i] + K[i]) % 256;
swap(S[i], S[j]); // 무작위로 S배열 섞기
}
}
void Decryption(byte ciphertext[], queue<byte>keystream) {
int ciphersize = strlen((char*)ciphertext);// 암호문 길이만큼 반복하기 위해 구해놓기
byte keystreamByte; // 배열 S에서 복호화 할 바이트 선택!
int num;
byte plaintext[1000] = ""; // 복호화 한 text를 넣을 예정!
for (num = 0; num < ciphersize; num++) {
keystreamByte = keystream.front(); // Keystream에서 하나씩 꺼내기
keystream.pop();
plaintext[num] = ciphertext[num] ^ keystreamByte; // 0번째 부터 차례대로 넣기!
ciphertext[num] = (byte)plaintext[num] ^ keystreamByte; // 0번째 부터 차례대로 넣기!
}
cout << "\nDecryption 결과 : " << plaintext << endl << endl;
}
void Encryption(byte S[], char plaintext[]) {
int plainsize = strlen(plaintext);// 평문 길이만큼 반복하기 위해 구해놓기
byte keystreamByte; // 배열 S에서 암호화 할 바이트 선택!
queue<byte>keystream; // keystream 만들기
int num;
byte ciphertext[1000] = ""; // 암호화 한 text를 넣을 예정!
char hexa[1000] = "";
int i = 0, j = 0, t;
cout << "\nEncryption 결과 : ";
for (num = 0; num < plainsize; num++) {
i = (i + 1) % 256;
j = (j + S[i]) % 256;
swap(S[i], S[j]);
t = (S[i] + S[j]) % 256;
keystreamByte = S[t]; // 평문과 xor 연산할 keystreamByte
keystream.push(keystreamByte);
ciphertext[num] = (byte)plaintext[num] ^ keystreamByte; // 0번째 부터 차례대로 넣기!
sprintf_s(hexa, "%X", (unsigned int)keystreamByte);
cout << hexa << " ";
}
cout << "(hexacode)\n\n";
Decryption(ciphertext, keystream);
}
int main() {
char key[100]; // 사용자에게 입력받을 키
byte S[256]; // Look up table, 처음에 0~255의 순열
byte K[256]; // key의 값을 순차적으로 넣을 곳!
char plaintext[100]; // 입력 받을 평문
cout << "Key를 입력하세요 : ";
cin.getline(key, 100);
cout << "Key 입력 완료!\n";
init(S, K, key); // S배열과 K배열 초기화!
cout << "초기화 완료!\n";
Shuffle(S, K); // 초기화 한 후에 S 배열 난수로 Shuffle!
cout << "Shuffle 완료!\n";
cout << "------------------------------\n";
cout << "평문을 입력하세요 : ";
cin.getline(plaintext, 100);
cout << "------------------------------\n";
Encryption(S, plaintext);
cout << "------------------------------\n";
}
|