📌 개요
유니티로 로컬 데이터 저장을 개발하다 json으로 직렬화하여 데이터를 저장하는 기능을 구현하였습니다.
그런데... 날 것으로 저장하니 데이터가 훤히 보이네요ㄷㄷ...
아무래도 암호화와 복호화 과정을 통해 유저가 뜯어 고치지 못하게 해야겠군요.
구글링을 해보니 XOR 암복호화 방식이 간단하네요. 당장 구현을 시작해보겠습니다.
XOR 암복호화란?
XOR 암복호화 : 데이터의 각 비트를 암호화 키와 XOR 연산(배타적 논리합)을 수행하는 암복호화 기법
정확히 말하자면 평문의 각 비트를 암호화 키의 비트와 XOR 연산을 수행하여 비트 배열을 난독화시킵니다.
자세한 동작 원리는 다음과 같습니다.
- 평문(PlaneText)의 각 비트를 키의 대응 비트와 XOR 연산 수행
- 키의 대응 비트가 마지막 요소를 넘어가면 다시 첫번째 비트로 XOR 연산 수행
- 위 연산을 모든 평문 비트에 대해 수행
어때요, 매우 간단하지 않나요?
사실 XOR 암복호화가 구현이 쉬운 이유가 또 있습니다.
XOR 암복호화는 XOR 연산의 특징으로 인해 암호화와 복호화 모두 동일한 로직을 거칩니다.
그렇기 때문에 XOREncrytAndDecryt 메서드만 구현하면 되기 때문에 구현이 쉽습니다.
이제 위 원리대로 코드를 구현해보겠습니다.
XOR 암복호화 구현
[ C# XOR 암복호화 코드 보기 ]
private static string key = "SecretKey";
public static void Main()
{
string plainText = "{\"Name\":\"New User\",\"Level\":0,\"Exp\":0,\"Gold\":0}";
Console.WriteLine("=============================================");
Console.WriteLine("[ XOR 암호화 및 복호화 ]");
Console.WriteLine();
Console.Write("원문 바이트 : ");
PrintBytes(Encoding.ASCII.GetBytes(plainText));
Console.WriteLine();
string encryptedText = XOREncryptAndDecrypt(plainText, key);
Console.Write("암호화 결과 : ");
PrintBytes(Encoding.ASCII.GetBytes(encryptedText));
Console.WriteLine();
string decryptedBytes = XOREncryptAndDecrypt(encryptedText, key);
Console.Write("복호화 결과 : ");
PrintBytes(Encoding.ASCII.GetBytes(decryptedBytes));
}
private static void PrintBytes(byte[] bytes)
{
foreach (byte b in bytes)
{
Console.Write($"{(char)b}");
}
Console.WriteLine();
}
public static string XOREncryptAndDecrypt(string plainText, string key)
{
byte[] cypherBytes = new byte[plainText.Length];
byte[] plainBytes = Encoding.ASCII.GetBytes(plainText);
for (int i = 0; i < plainText.Length; i++)
{
cypherBytes[i] = (byte)(plainBytes[i] ^ key[i % key.Length]);
}
return Encoding.ASCII.GetString(cypherBytes);
}
[ XOR 암호화 결과 확인 ]
XOR 암복호화 결과 분석
XOR 암복호화가 잘 적용되었네요.
하지만 XOR 암복호화는 심각한 보안 문제가 존재합니다.
만약 평문이 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA " 라면 어떤 결과가 나타날까요?
... 이런 암호화 결과에서 동일한 패턴이 등장합니다.
그렇습니다. XOR 암복호화에 취약점은 키 반복으로 인해 패턴이 등장한다는 점입니다.
만약 이 패턴을 다시 XOR 연산을 시켜본다면 어떻게 될까요?
허허허 아주 기가 막히게 Key 값을 얻을 수 있군요.
이것 때문에 보안에 취약하다는 것이군요.
XOR 암복호화 말고 다른 방법을 찾아보도록 하겠습니다.
📝 정리
XOR 암복호화는 데이터의 각 비트를 암호화 키와 XOR 연산(배타적 논리합)을 수행하는 암복호화 기법입니다.
XOR 암복호화는 간단한 대칭 키 암호화 방식입니다.
(※ 대칭 키 암호화 : 단일 키로 암호화와 복호화를 동시에 수행 가능)
또한, 알고리즘이 간단하며 암호화와 복호화 로직이 동일하기 때문에 구현이 쉽습니다.
가벼운 암호화가 필요하거나 성능이 중요한 상황에서 유용하지만 보안성이 취약하다는 단점이 있습니다.
'IT > 기술 정리' 카테고리의 다른 글
[보안] C# AES-256 암복호화 알고리즘 (0) | 2024.12.09 |
---|