본문 바로가기

강의자료/C/C++

031. 비트연산을 이용한 암호화/복호화.

◈ 이 글은 강의를 위하여 제가 직접 작성한 내용입니다. 따라서 퍼가실 경우, 출처를 명확히 해주시기 바랍니다!!
◈ This ariticle was written by me for teaching. So if you want to copy this article, please clarify the source!!


/*
※ 다음은 XOR연산의 특성입니다.

1004 			-> 0000 0000 0000 0000 0000 0011 1110 1100
2101 			-> 0000 0000 0000 0000 0000 1000 0011 0101
1004 ^ 2101 	-> 0000 0000 0000 0000 0000 1011 1101 1001	-> 3033
=============================================================
3033			-> 0000 0000 0000 0000 0000 1011 1101 1001
2101			-> 0000 0000 0000 0000 0000 1000 0011 0101
3033 ^ 2101		-> 0000 0000 0000 0000 0000 0011 1110 1100	-> 1004
=============================================================
3033			-> 0000 0000 0000 0000 0000 1011 1101 1001
1004 			-> 0000 0000 0000 0000 0000 0011 1110 1100
3033 ^ 1004		-> 0000 0000 0000 0000 0000 1000 0011 0101	-> 2101

즉, A ^ B = C가 나왔을 경우, C ^ A = B, C ^ B = A가 나오게 됩니다.
XOR의 이와같은 특성을 이용하여 데이터의 암호화 및 복호화기법에 사용할 수 있습니다.

1. 사용자로부터 최대 1024크기의 문자열을 입력받으시오.

2. 암호화에 사용할 임의의 암호화키(문자열)를 만드시오. 예) "snake"

3. 암호화키를 이용하여 입력받은 문자열을 암호화한 후 화면에 출력하시오.

  예) 입력받은 문자열이 "abcdefghijklmnopqrstuvwxyz"일 경우,
	abcdefghijklmnopqrstuvwxyz
	snakesnakesnakesnakesnakes
  암호화키에 해당하는 "snake"를 입력받은 문자열 길이만큼 반복하며 수직관계에 해당하는 문자끼리 XOR연산을 하시오 : a^s, b^n, c^a, d^k, e^e, ....., x^k, y^e, z^s

4. 암호화된 문자열을 XOR연산의 특성을 이용하여 다시 복호화한 후 화면에 출력하시오.

>>> 실행결과

암호화할 문자열을 입력하십시오.
MBC아카데미디지털교육원

[암호화된 문자열]
>,"裸렴仝餠?첆뗀禽Γ?

[복호화된 문자열]
MBC아카데미디지털교육원

*/

#include 
using namespace std;

#define MAX_CHAR 1024

void CryptoString(char* origin, char* crypto, char* key, int strLength);

void main()
{
	char origin[MAX_CHAR];
	char encode[MAX_CHAR];
	char decode[MAX_CHAR];
	char cryptoKey[] = "snake";
	char strLength = 0;

	cout << "암호화할 문자열을 입력하십시오." << endl;
	cin.getline(origin, _countof(origin));
	//cin >> origin;
	strLength = strlen(origin);

	CryptoString(origin, encode, cryptoKey, strLength);

	cout << "[암호화된 문자열]" << endl;
	cout << encode << endl;

	CryptoString(encode, decode, cryptoKey, strLength);

	cout << "[복호화된 문자열]" << endl;
	cout << decode << endl;

	system("PAUSE");
}

void CryptoString(char* origin, char* crypto, char* key, int strLength)
{
	int keySize = strlen(key);
	int keyCount = 0;
	for(int i=0; i < strLength; i++)
	{
		crypto[i] = origin[i] ^ key[keyCount++];
		if(keyCount == keySize) keyCount = 0;
	}
	crypto[strLength] = '\0';
}