C#中的加密密钥保护

Tho*_*mas 3 c# encryption

是否有解决以下问题的行业标准:

故事; 我有一个程序(=>游戏),它将状态(=> level,..)保存在xml文件中; 这个状态不应该是用户可编辑的; 我想阻止人们编写可修补我的xml和程序状态的补丁软件.

您想要保护您的xml文件.您可以通过加密来完成此操作.不过你怎么用钥匙?

因为有人可以随时进行逆向工程(打开你的dll)阅读密钥......?

public static string Encrypt (string toEncrypt)
{
 byte[] keyArray = UTF8Encoding.UTF8.GetBytes ("12345678901234567890123456789012");
 // 256-AES key
 byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes (toEncrypt);
 RijndaelManaged rDel = new RijndaelManaged ();
 rDel.Key = keyArray;
 rDel.Mode = CipherMode.ECB;
 // http://msdn.microsoft.com/en-us/library/system.security.cryptography.ciphermode.aspx
 rDel.Padding = PaddingMode.PKCS7;
 // better lang support
 ICryptoTransform cTransform = rDel.CreateEncryptor ();
 byte[] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
 return Convert.ToBase64String (resultArray, 0, resultArray.Length);
}

public static string Decrypt (string toDecrypt)
{
 byte[] keyArray = UTF8Encoding.UTF8.GetBytes ("12345678901234567890123456789012");
 // AES-256 key
 byte[] toEncryptArray = Convert.FromBase64String (toDecrypt);
 RijndaelManaged rDel = new RijndaelManaged ();
 rDel.Key = keyArray;
 rDel.Mode = CipherMode.ECB;
 // http://msdn.microsoft.com/en-us/library/system.security.cryptography.ciphermode.aspx
 rDel.Padding = PaddingMode.PKCS7;
 // better lang support
 ICryptoTransform cTransform = rDel.CreateDecryptor ();
 byte[] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
 return UTF8Encoding.UTF8.GetString (resultArray);
}
Run Code Online (Sandbox Code Playgroud)

编辑:app是100%客户端.

Eri*_*ert 10

我有一个程序(=>游戏),它将状态(=> level,..)保存在xml文件中; 这个状态不应该是用户可编辑的; 我想阻止人们编写可修补我的xml和程序状态的补丁软件.您可以通过加密来完成此操作.不过你怎么用钥匙?因为有人可以随时进行逆向工程(打开你的dll)并阅读密钥.

你已经产生了一个令人信服的论据,即你想做的事情是不可能的.你的论点是正确的.

安全系统的目的是保护用户攻击,而不是保护用户的数据用户本身.

以这种方式思考:游戏是一个可以编辑状态的程序.用户可以运行游戏.因此,用户可以运行可以编辑状态的程序.您甚至不需要考虑密钥管理,因为整个方案根本不可能.您不能同时要求用户能够运行更改状态的程序并同时禁止它.

如果你真的希望游戏状态不受用户保护,那么必须提供的是:不允许用户运行游戏.相反,游戏必须在您拥有的服务器上运行,并且用户运行与服务器通信的客户端.然后,服务器负责确定客户端是否是敌对的,并确定游戏状态是什么.

由于游戏现在在您拥有的服务器上运行,并将状态保存到您拥有的服务器,因此您知道用户不会编辑状态,因为他们无法运行执行此操作的程序.

  • 这一切都是100%正确.虽然确实无法阻止用户这样做,但至少值得一提的是,你可以*让它变得更难.它成为[wall a latters]的案例(http://blogs.msdn.com/b/oldnewthing/archive/2012/01/17/10257351.aspx),但它可能(特别是对于一个游戏)只是制作*足够*,即使并非不可能,也是一个可接受的业务要求(如果你更具体地说"硬得多"有多难).游戏开发者(合理地)花费大量时间和金钱来解决这个明显不可解决的问题. (2认同)