unity 保存字典,并加密

本文介绍了如何在Unity中将字典数据保存到本地,并使用加密技术确保数据的安全性。内容涉及利用JsonUtility序列化字典,以及在运行时进行加密和解密的方法。
摘要由CSDN通过智能技术生成

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, "");
        }
    }

    

    //===========
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值