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,所以不太安全。好吧,这就是场景。谢谢:)好的,这很有意思。谢谢:)