Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity中非对称加密的最大长度和消息太长错误_C#_Cryptography_Encryption Asymmetric - Fatal编程技术网

C# Unity中非对称加密的最大长度和消息太长错误

C# Unity中非对称加密的最大长度和消息太长错误,c#,cryptography,encryption-asymmetric,C#,Cryptography,Encryption Asymmetric,我使用的是来自的非对称加密,当我使用JsonUtility.ToJson()将保存数据的类转换为Json数据时,我能够使事情完美地工作,然后我使用上面链接中的加密 我曾经使用C#序列化程序,但遇到了问题,所以我被指示使用它,这很好,但当我用它更改一个保存系统时,我遇到了错误“Max Length is 117”,这让我觉得我在类中保存了太多(我有用于转换、精灵渲染器和碰撞R2D的变量)所以我在EncryptText()和DecryptText()中将keySize变量从1024增加到2048方法

我使用的是来自的非对称加密,当我使用JsonUtility.ToJson()将保存数据的类转换为Json数据时,我能够使事情完美地工作,然后我使用上面链接中的加密

我曾经使用C#序列化程序,但遇到了问题,所以我被指示使用它,这很好,但当我用它更改一个保存系统时,我遇到了错误“Max Length is 117”,这让我觉得我在类中保存了太多(我有用于转换、精灵渲染器和碰撞R2D的变量)所以我在EncryptText()和DecryptText()中将keySize变量从1024增加到2048方法在非对称加密链接中,当我到达某个点时,看到了我所认为的工作原理,在这个点上,我有足够大的大小来保存抛出错误消息告诉我的数据

然后我到达了一个点,它说“加密异常:消息太长”,现在我想知道,“我该如何解决这个问题?”。这让我担心,如果我把它放在Unity Store的一个项目中,人们会遇到在一个场景中保存太多的问题(这是关于保存了4个游戏对象的lol…:()。即使我将保存的内容分为多个类并以这种方式保存,我觉得大小问题可能是一个红色警报

关于如何处理这种情况有什么想法吗

代码:

public class State_Manager : MonoBehaviour {

    public void Save()
    {
        // IF we have nothing to save then don't save.
        if(transformStateList.Count == 0){
            return;
        }
        // Create a new State_Data.
        State_Data data = new State_Data ();
        // Loop the amount of the size of the List.
        for(int i = 0; i < transformStateList.Count; i++){
            // Create a new Object_Data struct.
            Object_Data objectData = new Object_Data ();
            // Store our data in our data structure.
            objectData.StoreData(transformStateList[i]);
            // Add it to the list.
            data.objectData.Add (objectData);
        }
        // Turn the Store_Data into Json data.
        string stateToJson = JsonUtility.ToJson(data);
        // Encrypt the Json data.
        string encryptedJson = AsymmetricEncryption.EncryptText (stateToJson, keySize, PlayerPrefs.GetString("PK"));
        // Save the information.
        PlayerPrefs.SetString("State", encryptedJson);
    }

    [System.Serializable]
    class State_Data
    {   
        public List<Object_Data> objectData = new List<Object_Data> ();
    }
}

[Serializable]
public class Object_Data {

    // Transform information.
    public bool active;
    public string name;
    public int layer;
    public float xPos;
    public float yPos;
    public float zPos;

    // Sprite Renderer Information
    public string spriteName = "";
    public string sortLayerName = "";
    public int sortLayerOrder = 0;

    // Collider2D Information.
    public bool isCollider = false;
    public bool activeCollider;

    public void StoreData(GameObject go){
        // Save the activeness.
        active = go.activeInHierarchy;
        // Save the GameObjects name.
        name = go.name;
        // Save the GameObjects layer.
        layer = go.layer;
        // Save the GameObjects position.
        xPos = go.transform.position.x;
        yPos = go.transform.position.y;
        zPos = go.transform.position.z;
        // IF this GameObject has a sprite renderer,
        // ELES it doesn't have a sprite renderer.
        if (go.GetComponent<SpriteRenderer> () != null) {
            // Save the sprite name, sorting layer name and the sorting layer order.
            spriteName = go.GetComponent<SpriteRenderer> ().sprite.name;
            sortLayerName = go.GetComponent<SpriteRenderer> ().sortingLayerName;
            sortLayerOrder = go.GetComponent<SpriteRenderer> ().sortingOrder;
        }
        // IF there is a Collider2D attached,
        // ELSE there is not a Collider2D attached.
        if (go.GetComponent<Collider2D> () != null) {
            isCollider = true;
            activeCollider = go.GetComponent<Collider2D> ().enabled;
        }
    }
}
公共类状态管理器:单一行为{
公共作废保存()
{
//如果我们没有什么要保存的,那就不要保存。
if(transformStateList.Count==0){
返回;
}
//创建一个新的State\u数据。
State_Data Data=新State_Data();
//循环列表大小的数量。
for(int i=0;i
您不使用非对称加密来加密大量数据。如果您有大量数据,则通常使用对称加密,然后使用非对称加密来加密密钥

然而,这对你来说完全是小题大做。从代码的外观来看,你的播放器性能中似乎只有两个公钥和私钥字段,你只是在加密一个“状态”,稍后将读出。不要使用非对称加密,只需使用对称加密即可

如果您确实希望使用非对称加密,则需要执行加密:

  • 每次加密数据时生成一个新的随机对称加密密钥
  • 使用随机密钥对称加密数据
  • 使用非对称加密中的公钥加密随机密钥
  • 将对称加密的数据和非对称加密的随机密钥存储在一起
  • 对于解密:

  • 从某处加载对称加密的数据和非对称加密的密钥
  • 使用非对称加密中的私钥解密非对称加密密钥
  • 使用解密的对称密钥解密数据
  • 使用数据

  • 您不使用非对称加密来加密大量数据。如果您有大量数据,则通常使用对称加密,然后使用非对称加密来加密密钥

    然而,这对于您的目的来说是完全过分的。从代码的外观来看,您的播放器性能中似乎只有两个公钥和私钥字段,您只是在加密一个“状态”,稍后将读出。不要使用非对称加密