using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;

public sealed class DESEncryption
{
    private static readonly string encryptKey = "5e7b18db";
    private static readonly string decryptKey = "5e7b18db";

    #region**********Method*******************************

    private static TripleDESCryptoServiceProvider TripleDes = new TripleDESCryptoServiceProvider();
    //---指定密钥的哈希创建指定长度的字节数组
    private static byte[] TruncateHash(string key, int length)
    {
        // byte[] functionReturnValue = 0;
        SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
        // Hash the key.
        byte[] keyBytes = System.Text.Encoding.Unicode.GetBytes(key);
        byte[] hash = sha1.ComputeHash(keyBytes);

        // Truncate or pad the hash.
        Array.Resize(ref hash, length);
        return hash;
    }

    //添加用来初始化 3DES 加密服务提供程序的构造函数。
    //key 参数控制 EncryptData 和 DecryptData 方法。
    public static void Init(string key)
    {
        // Initialize the crypto provider.
        TripleDes.Key = TruncateHash(key, TripleDes.KeySize / 8);
        TripleDes.IV = TruncateHash("", TripleDes.BlockSize / 8);
    }
    //添加加密字符串的公共方法
    public static string EncryptData(string plaintext)
    {
        Init(encryptKey);
        byte[] plaintextBytes = System.Text.Encoding.Unicode.GetBytes(plaintext);

        return Convert.ToBase64String(EncryptData(plaintextBytes));

    }
    public static byte[] EncryptData(byte[] plaintextBytes)
    {
        System.IO.MemoryStream ms = new System.IO.MemoryStream();

        CryptoStream encStream = new CryptoStream(ms, TripleDes.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write);

        encStream.Write(plaintextBytes, 0, plaintextBytes.Length);
        encStream.FlushFinalBlock();

        return ms.ToArray();

    }

    //添加解密字符串的公共方法
    public static string DecryptData(string encryptedtext)
    {
#if !Code_Encryption
        return encryptedtext;
#endif
        //return encryptedtext;
        //Debug.Log("DecryptData:" + encryptedtext);
        Init(decryptKey);
        byte[] encryptedBytes = Convert.FromBase64String(encryptedtext);
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        CryptoStream decStream = new CryptoStream(ms, TripleDes.CreateDecryptor(), System.Security.Cryptography.CryptoStreamMode.Write);
        decStream.Write(encryptedBytes, 0, encryptedBytes.Length);
        decStream.FlushFinalBlock();

        return System.Text.Encoding.Unicode.GetString(ms.ToArray());

    }

    #endregion

}