我使用了来自这里的非对称加密,当我用JsonUtility.ToJson()将保存数据的类转换为Json数据时,我能够很好地工作,然后在上面的链接中使用加密。
我过去经常使用C#序列化程序,但是遇到了一些问题,所以我被引导使用这个非常好的方法,但是当我用它改变我的一个保存系统时,我遇到了“最大长度为117”的错误,这让我觉得我在类中保存了太多(我有转换、雪碧渲染器和Collider2D的变量),所以我增加了我的keySize变量(在这个方面使用1024,以及我使用的所有其他领域)。从1024年到2048年,在非对称加密链接中的EncryptText()和DecryptText()方法中,我看到了当我到达一个足够大的大小来保存抛出错误信息告诉我的数据时,我所认为的工作。
然后我到达了一个点,上面写着“密码异常:消息太长了”,现在我想知道,“如何解决这个问题?”这让我担心,如果我把它放在我的一个项目在团结商店,人们会遇到的问题,储蓄太多的场景(这是大约4 GameObjects被保存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;
}
}
}发布于 2016-10-22 00:15:01
您不使用非对称加密来加密大量数据。如果您有大量数据,则通常使用对称加密,然后使用非对称加密对密钥进行加密。
然而,对于你的目的来说,这完全是过分的。从代码的外观来看,您的密钥只包含两个字段,用于您的播放器中的公钥和私钥,并且您只是在加密一个稍后将被读出的"State“。不要对此使用非对称加密,只需使用对称加密。
如果您真的想使用非对称加密,那么您需要做的就是加密:
解密:
https://stackoverflow.com/questions/40186937
复制相似问题