using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System;
using MiniJSON;
/// <summary>
///
/// </summary>
public static class SharePrefs {
//=================================================================================
//共通
//=================================================================================
private const string PASS = "testmima123";
private const string DIRECTORY_NAME = "Data";
private static string EncryptKey(string sourceString) {
System.Security.Cryptography.RijndaelManaged rijndael =
new System.Security.Cryptography.RijndaelManaged();
//パスワードから共有キーと初期化ベクタを作成
byte[] key, iv;
GenerateKeyFromPassword(
rijndael.KeySize, out key, rijndael.BlockSize, out iv);
rijndael.Key = key;
rijndael.IV = iv;
//文字列をバイト型配列に変換する
byte[] strBytes = System.Text.Encoding.UTF8.GetBytes(sourceString);
//対称暗号化オブジェクトの作成
System.Security.Cryptography.ICryptoTransform encryptor =
rijndael.CreateEncryptor();
//バイト型配列を暗号化する
byte[] encBytes = encryptor.TransformFinalBlock(strBytes, 0, strBytes.Length);
//閉じる
encryptor.Dispose();
//バイト型配列を文字列に変換して返す
return System.Convert.ToBase64String(encBytes);
}
private static string EncryptValue(string value){
return EncryptKey(value);
}
internal static void Save(Dictionary<string, int> saveDict, string v) {
throw new NotImplementedException();
}
private static string DecryptValue(string value){
//RijndaelManagedオブジェクトを作成
System.Security.Cryptography.RijndaelManaged rijndael =
new System.Security.Cryptography.RijndaelManaged();
//パスワードから共有キーと初期化ベクタを作成
byte[] key, iv;
GenerateKeyFromPassword(
rijndael.KeySize, out key, rijndael.BlockSize, out iv);
rijndael.Key = key;
rijndael.IV = iv;
//文字列をバイト型配列に戻す
byte[] strBytes = System.Convert.FromBase64String(value);
//対称暗号化オブジェクトの作成
System.Security.Cryptography.ICryptoTransform decryptor =
rijndael.CreateDecryptor();
//バイト型配列を復号化する
//復号化に失敗すると例外CryptographicExceptionが発生
byte[] decBytes = decryptor.TransformFinalBlock(strBytes, 0, strBytes.Length);
//閉じる
decryptor.Dispose();
//バイト型配列を文字列に戻して返す
return System.Text.Encoding.UTF8.GetString(decBytes);
}
private static void GenerateKeyFromPassword(int keySize, out byte[] key, int blockSize, out byte[] iv) {
//パスワードから共有キーと初期化ベクタを作成する
//saltを決める
byte[] salt = System.Text.Encoding.UTF8.GetBytes("saltは必ず8バイト以上");
//Rfc2898DeriveBytesオブジェクトを作成する
System.Security.Cryptography.Rfc2898DeriveBytes deriveBytes =
new System.Security.Cryptography.Rfc2898DeriveBytes(PASS, salt);
//反復処理回数を指定する デフォルトで1000回
deriveBytes.IterationCount = 1000;
//共有キーと初期化ベクタを生成する
key = deriveBytes.GetBytes(keySize / 8);
iv = deriveBytes.GetBytes(blockSize / 8);
}
private static string LoadAndDecryptValue(string key){
string str = PlayerPrefs.GetString (EncryptKey(key), "");
if(string.IsNullOrEmpty(str)){
return "";
}
return DecryptValue (str);
}
//=================================================================================
//保存
//=================================================================================
public static void Save(string key , int value){
PlayerPrefs.SetString (EncryptKey(key), EncryptValue(value.ToString()) );
}
public static void Save(string key , float value){
PlayerPrefs.SetString (EncryptKey(key), EncryptValue(value.ToString()) );
}
public static void Save(string key , string value){
PlayerPrefs.SetString (EncryptKey(key), EncryptValue(value) );
}
public static void Save(string key, bool value){
if(value){
PlayerPrefs.SetString (key, key);
}
else{
PlayerPrefs.SetString (key, "");
}
}
//===========
unity 保存字典,并加密
最新推荐文章于 2023-11-07 22:03:13 发布
本文介绍了如何在Unity中将字典数据保存到本地,并使用加密技术确保数据的安全性。内容涉及利用JsonUtility序列化字典,以及在运行时进行加密和解密的方法。
摘要由CSDN通过智能技术生成