Unity 中非对称加密的最大长度和消息太长错误
Max Length and Message Too Long error for Asymmetric Encryption in Unity
我使用 Here 的非对称加密,当我将保存数据的 classes 转换为 Json 数据时,我能够完美地工作 JsonUtility.ToJson () 然后我使用上面link中的加密。
我曾经使用 C# Serializer,但 运行 遇到了问题,所以我被引导使用它,效果很好,但是当我用它更改我的一个保存系统时,我 运行 进入"Max Length is 117" 的错误让我觉得我在 class 中节省了太多(我有 T运行sform、Sprite Renderer 和 Collider2D 的变量)所以我增加了 keySize 变量(在我的非对称加密 link 中的 EncryptText() 和 DecryptText() 方法中使用 1024,我也使用它。)从 1024 到 2048,看到我认为正在工作的东西直到我有足够大的大小来保存其中一条抛出错误消息告诉我的数据。
然后我到达了它说 "CryptographicException:message too long" 的地步,现在我想知道,"how do I fix this?"。这让我担心如果我把它放在我在 Unity Store 的一个项目中人们会 运行 进入场景中保存太多的问题(大约有 4 个 GameObjects 被保存大声笑...: ( )。即使我将保存的内容分解为多个 classes 并以这种方式保存,我觉得大小问题可能是一个红色警报。
关于如何处理这种情况有什么想法吗?
代码:
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;
}
}
}
您没有使用非对称加密来加密大量数据。如果您有大量数据通常使用对称加密然后使用非对称加密来加密密钥。
但是,这对您的目的来说完全是矫枉过正。从代码的外观来看,您的播放器性能中似乎只有 public 和私钥的两个字段,您只是在加密稍后将读出的 "State"。不要为此使用非对称加密,只需使用对称加密。
如果您真的想使用非对称加密,您需要做的是加密:
- 每次加密数据时生成一个新的随机对称加密密钥。
- 使用随机密钥对称加密您的数据。
- 使用来自非对称加密的 public 密钥加密随机密钥。
- 将对称加密的数据和非对称加密的随机密钥一起存储在某处。
解密:
- 从某处加载对称加密数据和非对称加密密钥。
- 使用非对称加密的私钥解密非对称加密的密钥。
- 使用解密后的对称密钥解密数据
- 使用数据。
我使用 Here 的非对称加密,当我将保存数据的 classes 转换为 Json 数据时,我能够完美地工作 JsonUtility.ToJson () 然后我使用上面link中的加密。
我曾经使用 C# Serializer,但 运行 遇到了问题,所以我被引导使用它,效果很好,但是当我用它更改我的一个保存系统时,我 运行 进入"Max Length is 117" 的错误让我觉得我在 class 中节省了太多(我有 T运行sform、Sprite Renderer 和 Collider2D 的变量)所以我增加了 keySize 变量(在我的非对称加密 link 中的 EncryptText() 和 DecryptText() 方法中使用 1024,我也使用它。)从 1024 到 2048,看到我认为正在工作的东西直到我有足够大的大小来保存其中一条抛出错误消息告诉我的数据。
然后我到达了它说 "CryptographicException:message too long" 的地步,现在我想知道,"how do I fix this?"。这让我担心如果我把它放在我在 Unity Store 的一个项目中人们会 运行 进入场景中保存太多的问题(大约有 4 个 GameObjects 被保存大声笑...: ( )。即使我将保存的内容分解为多个 classes 并以这种方式保存,我觉得大小问题可能是一个红色警报。
关于如何处理这种情况有什么想法吗?
代码:
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;
}
}
}
您没有使用非对称加密来加密大量数据。如果您有大量数据通常使用对称加密然后使用非对称加密来加密密钥。
但是,这对您的目的来说完全是矫枉过正。从代码的外观来看,您的播放器性能中似乎只有 public 和私钥的两个字段,您只是在加密稍后将读出的 "State"。不要为此使用非对称加密,只需使用对称加密。
如果您真的想使用非对称加密,您需要做的是加密:
- 每次加密数据时生成一个新的随机对称加密密钥。
- 使用随机密钥对称加密您的数据。
- 使用来自非对称加密的 public 密钥加密随机密钥。
- 将对称加密的数据和非对称加密的随机密钥一起存储在某处。
解密:
- 从某处加载对称加密数据和非对称加密密钥。
- 使用非对称加密的私钥解密非对称加密的密钥。
- 使用解密后的对称密钥解密数据
- 使用数据。