首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >统一中非对称加密的最大长度和消息过长错误

统一中非对称加密的最大长度和消息过长错误
EN

Stack Overflow用户
提问于 2016-10-21 23:59:08
回答 1查看 885关注 0票数 0

我使用了来自这里的非对称加密,当我用JsonUtility.ToJson()将保存数据的类转换为Json数据时,我能够很好地工作,然后在上面的链接中使用加密。

我过去经常使用C#序列化程序,但是遇到了一些问题,所以我被引导使用这个非常好的方法,但是当我用它改变我的一个保存系统时,我遇到了“最大长度为117”的错误,这让我觉得我在类中保存了太多(我有转换、雪碧渲染器和Collider2D的变量),所以我增加了我的keySize变量(在这个方面使用1024,以及我使用的所有其他领域)。从1024年到2048年,在非对称加密链接中的EncryptText()和DecryptText()方法中,我看到了当我到达一个足够大的大小来保存抛出错误信息告诉我的数据时,我所认为的工作。

然后我到达了一个点,上面写着“密码异常:消息太长了”,现在我想知道,“如何解决这个问题?”这让我担心,如果我把它放在我的一个项目在团结商店,人们会遇到的问题,储蓄太多的场景(这是大约4 GameObjects被保存lol.*( )。即使我将保存的内容分解成多个类并保存它,我也觉得大小问题可能是一个红色警报。

对于如何处理这种情况,有什么想法吗?

代码:

代码语言:javascript
复制
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;
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-22 00:15:01

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

然而,对于你的目的来说,这完全是过分的。从代码的外观来看,您的密钥只包含两个字段,用于您的播放器中的公钥和私钥,并且您只是在加密一个稍后将被读出的"State“。不要对此使用非对称加密,只需使用对称加密。

如果您真的想使用非对称加密,那么您需要做的就是加密:

  1. 每次加密数据时生成一个新的随机对称加密密钥。
  2. 用随机密钥对称加密数据。
  3. 使用您的公钥从非对称加密中加密随机密钥。
  4. 将对称加密的数据和非对称加密的随机密钥一起存储在某处。

解密:

  1. 从某处加载对称加密数据和非对称加密密钥。
  2. 从非对称加密中用私钥解密非对称加密密钥。
  3. 使用解密的对称密钥来解密数据。
  4. 利用这些数据。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40186937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档