개발 관련/SW, App 관련

게임정보 데이터 암호화와 복호화 하기

by 소서리스25 2023. 4. 27.
반응형

데이터의 암호화 및 복호화 하기

 

현재 게임 앱이나 어플리케이션 개발에서 주로 사용하고 있는 암호화와 복호화 코드이다. 본인은 여기에 개인적으로 허접하게 만든 암호화와 복호화를 섞어서 쓴다.

설정된 사용자 키와 가상키를 이용하여 현재의 데이터를 암호화하고, 이를 다시 복호화 하기 때문에 코드를 안다고 해서 쉽게 해킹하기는 어렵다고 본다. 

 

다만 문제점이 리얼타임으로는 적합하지 않다. 특히 모바일 환경에서는 더욱 그렇다고 본다. 암호화 및 복호화시 딜레이 타임이 생각보다 길게 소요되기 때문이다.

중요 이벤트 발생이나, 스테이지 변환시에 사용하면 좋을 듯 하다.

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
public static string EncDa(string enData) 
{
    byte[] plainTextBytes = Encoding.UTF8.GetBytes(enData);
    byte[] keyBytes = new Rfc2898DeriveBytes(Intro.pKey, Encoding.ASCII.GetBytes(Intro.pKey)).GetBytes(256 / 8);
    var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.Zeros };
    var encryptor = symmetricKey.CreateEncryptor(keyBytes, Encoding.ASCII.GetBytes(Intro.vKey));
    byte[] cipherTextBytes;
 
    using (var memoryStream = new MemoryStream())
    {
        using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
        {
            cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
            cryptoStream.FlushFinalBlock();
            cipherTextBytes = memoryStream.ToArray();
            cryptoStream.Close();
        }
        memoryStream.Close();
    }
    return Convert.ToBase64String(cipherTextBytes);
}
 
public static string DecDa(string deData) 
{
    byte[] cipherTextBytes = Convert.FromBase64String(deData);
    byte[] keyBytes = new Rfc2898DeriveBytes(Intro.pKey, Encoding.ASCII.GetBytes(Intro.pKey)).GetBytes(256 / 8);
    var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.None };
    var decryptor = symmetricKey.CreateDecryptor(keyBytes, Encoding.ASCII.GetBytes(Intro.vKey));
    var memoryStream = new MemoryStream(cipherTextBytes);
    var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
    byte[] plainTextBytes = new byte[cipherTextBytes.Length];
    int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
    memoryStream.Close();
    cryptoStream.Close();
 
    return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount).TrimEnd("\0".ToCharArray());
}
cs

 

아쉽게도 상세한 내용까지는 잘 모든다. 따라서 자세한 설명은 생략한다. 적절하게 활용하면 되겠다.

코드 사용에 시스템의 Security.Cryptography; 선언이 필요하다.

 

우선 유저의 데이터가 다음과 같다고 예정한다. 개별로 처리해도 되고, 묶어서 처리해도 되고, 처리된 결과를 서버나 자체 DB에 넣어서 사용한다.

 

예) 유저 데이터의 string 형식

_userData = "nameYongsa,hp1000,mp500,stage20,level15,bag0012310034,skill00003";

 

그러면 암호화 한 다음 다시 복호화 하면 다음과 같은 결과를 알 수 있다.

유저 데이터의 암호화 후 복호화 결과
유저 데이터의 암호화 후 복호화 결과

 

적어도 쉽게 데이터를 변형하지 못하도록 하는 하나의 방법이라 생각한다.

 

반응형

댓글