【问题标题】:Max Length and Message Too Long error for Asymmetric Encryption in UnityUnity 中非对称加密的最大长度和消息过长错误
【发布时间】:2016-10-22 08:15:01
【问题描述】:

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

我曾经使用 C# 序列化程序,但遇到了问题,所以我被指示使用这个,效果很好,但是当我用这个更改我的一个保存系统时,我遇到了“最大长度为 117”的错误让我觉得我在课堂上节省了太多(我有用于 Transform、Sprite Renderer 和 Collider2D 的变量)所以我增加了我的 keySize 变量(为此使用 1024 以及我使用的所有其他区域。)从 1024 到2048 在我的非对称加密链接中的 EncryptText() 和 DecryptText() 方法中,看到我认为正在工作的东西,因为我已经达到了足够大的大小来保存来自抛出错误消息之一的数据的地步告诉我。

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

关于如何处理这种情况的任何想法?

代码:

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;
        }
    }
}

【问题讨论】:

  • 为什么选择非对称加密,真的需要私钥和公钥吗?一般非对称加密加密只在需要私钥和公钥对的时候使用,否则使用对称密钥加密,一般是AES。
  • 由于无知。我正在学习加密,只是想弄清楚。我的帖子中的链接是从其他人那里得到的,该链接回答了我之前的一个问题并告诉我该链接有利于安全。所以我试着尽我所能去理解它并试图让它发挥作用,但我几乎不知道我会遇到这个错误。
  • 如果您只是想让某些东西工作并确保安全,请考虑RNCryptor-cs。至少看一下它和RNCryptor-Spec,看看需要做些什么才能正确完成。
  • @zaph 感谢您的快速响应 zaph。我看到更多的人谈论 AES,所以我想我会给 AES 一个机会。 几个小时过去了,我去尝试了AES。基本上我只是使用 Encrypt 和 Decrypt 方法并将我的 json 字符串输入到 Encrypt 方法中,并将 encryptedJson 输入到 Decrypt() 方法中,到目前为止一切正常!我什至不需要那个 AsymmetricEncryption 类吗?
  • @zaph 根据我在上一条评论中所说的话,你会说我至少掌握了正确使用脚本的方法吗?稍后我将深入研究它,但只要我有一个良好的开端,这将有所帮助。另外,在使用它来防止像以前那样遇到任何错误时,我需要注意什么吗?

标签: c# cryptography encryption-asymmetric


【解决方案1】:

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

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

如果你真的想使用非对称加密,你需要做的是加密:

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

解密:

  1. 从某处加载对称加密数据和非对称加密密钥。
  2. 使用您的非对称加密私钥解密非对称加密密钥。
  3. 使用解密后的对称密钥解密数据
  4. 使用数据。

【讨论】:

    猜你喜欢
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 2017-04-30
    • 2021-12-17
    • 2017-05-07
    • 1970-01-01
    相关资源
    最近更新 更多