C# unity c中的加密#
我有一个加密和解密脚本,工作得非常好,但我的问题是,它到底有多安全?我使用了另一个来源的一些脚本,并自己添加了盐。我没有使用任何需要高安全性的脚本,只是为单个玩家加密当前保存游戏数据 任何建议或建议也将不胜感激,因为我是新的加密 提前谢谢C# unity c中的加密#,c#,encryption,unity3d,C#,Encryption,Unity3d,我有一个加密和解密脚本,工作得非常好,但我的问题是,它到底有多安全?我使用了另一个来源的一些脚本,并自己添加了盐。我没有使用任何需要高安全性的脚本,只是为单个玩家加密当前保存游戏数据 任何建议或建议也将不胜感激,因为我是新的加密 提前谢谢 using System; using UnityEngine; using System.IO; using System.Security.Cryptography; using System.Text; public static class
using System;
using UnityEngine;
using System.IO;
using System.Security.Cryptography;
using System.Text;
public static class Crypto
{
private const string saltIndiatior = "MySaltIndacationString"
private const int startSaltLength = 32;
private const int endSaltLength = 32;
public static string RandomString(int length)
{
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*<>+-=_";
var stringChars = new char[length];
var random = new System.Random();
for (int i = 0; i < stringChars.Length; i++)
{
stringChars[i] = chars[random.Next(chars.Length)];
}
return new String(stringChars);
}
private static string GetSalt(int max)
{
byte[] salt = new byte[max];
RNGCryptoServiceProvider.Create().GetNonZeroBytes(salt);
return UTF8Encoding.UTF8.GetString(salt);
}
/// <summary>
/// Encrypts a message
/// </summary>
/// <param name="toEncrypt">plain text to encrypt</param>
/// <param name="key">Length must be 32</param>
/// <returns></returns>
public static string Encrypt(string toEncrypt, string key)
{
string startSalt = RandomString(startSaltLength);
string salt = GetSalt(endSaltLength);
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
// 256-AES key
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(startSalt + saltIndiatior + "{" + salt.Length + "}" + toEncrypt + salt);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
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);
}
/// <summary>
/// Decrypts a message
/// </summary>
/// <param name="toDecrypt">encrypt</param>
/// <param name="key"></param>
/// <returns></returns>
public static string Decrypt(string toDecrypt, string key)
{
Debug.Log("Decrypting::" + toDecrypt);
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
// AES-256 key
byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
// better lang support
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
string decoded = UTF8Encoding.UTF8.GetString(resultArray);
Debug.Log("0(decoded)::" + decoded);
//Remove 32 char long startSalt
decoded = decoded.Remove(0, startSaltLength);
if (decoded.StartsWith(saltIndiatior))
{
string saltSize = decoded.Substring(0, 1 + decoded.IndexOf("}"));
Debug.Log("1 (salt Indicator):: " + saltSize);
int saltLength = int.Parse(saltSize.Replace(saltIndiatior, "").Replace("{", "").Replace("}", ""));
Debug.Log("2(saltLength):: " + saltLength);
Debug.Log("3(salt)::" + decoded.Substring(decoded.Length - saltLength, saltLength));
decoded = decoded.Remove(0, saltSize.Length);
if (saltLength > 0)
{
decoded = decoded.Remove(decoded.Length - saltLength, saltLength);
}
Debug.Log("Finished:: " + decoded);
return decoded;
}
else
{
Debug.LogError("ERROR: could not decrypt properly");
return decoded;
}
}
}
使用系统;
使用UnityEngine;
使用System.IO;
使用System.Security.Cryptography;
使用系统文本;
公共静态类密码
{
private const string saltIndiatior=“mysaltindatationstring”
private const int startSaltLength=32;
私有常量int-endSaltLength=32;
公共静态字符串RandomString(int-length)
{
var chars=“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz012456789!@$%^&*+-=”;
var stringChars=新字符[长度];
var random=新系统.random();
for(int i=0;i0)
{
decoded=decoded.Remove(decoded.Length-saltLength,saltLength);
}
Log(“完成::”+解码);
返回解码;
}
其他的
{
LogError(“错误:无法正确解密”);
返回解码;
}
}
}
这取决于你在玩什么样的游戏。如果这是一个离线游戏,而你将盐存储在玩家的电脑上,那么就没有那么安全了。一开始可能有点难以发现,但一旦发现,就等于没有加密
如果您不希望玩家修改其保存的数据,最安全的方法是将其托管在您的服务器上。但是,我建议,如果只是一个离线游戏,您不必担心保存数据。让玩家做他们想做的事情,如果游戏崩溃,那是他们的问题。这取决于你在玩什么样的游戏。如果这是一个离线游戏,而你将盐存储在玩家的电脑上,那么就没有那么安全了。一开始可能有点难以发现,但一旦发现,就等于没有加密
如果您不希望玩家修改其保存的数据,最安全的方法是将其托管在您的服务器上。但是,我建议,如果只是一个离线游戏,您不必担心保存数据。让玩家随心所欲,如果游戏崩溃,这是他们的问题。很确定如果有人想作弊,他们只会反编译你的游戏(然后查看你的加密),或者使用一些作弊引擎添加数百万金币,然后保存游戏安全性其实并不重要。。当然,这总比没有好,所以不能使用文本编辑器来添加项目。它使用ECB,所以不太安全。非常确定,如果有人想作弊,他们只需反编译你的游戏(然后查看你的加密),或者使用一些作弊引擎来添加数百万黄金,那么保存游戏安全性其实并不重要。。当然,这总比什么都没有好,所以不能使用文本编辑器来添加项目。它使用ECB,所以不太安全。好吧,这就是场景。谢谢:)好的,这很有意思。谢谢:)