Unity中實現文件加密

一:前言

常用的文件加密算法有:DES、AES、RSA、SHA-1、MD5.....
.Net自帶了安全類庫,在System.Security.Cryptography下有一些常用的加密算法
其中MD5屬於摘要算法,多用於檢查文件是否有修改


二:加密算法介紹

——對稱加密
對稱加密算法有AES、DES、3DES等
在對稱加密算法中,密鑰只有一個,加密和解密都使用相同的密鑰

——非對稱加密
非對稱加密算法有RSA、DSA、ECC等
在非對稱加密算法中,需要兩個密鑰,一個公鑰一個私鑰
如果使用公鑰對數據進行加密,只有使用對應的私鑰才能進行解密,如果使用私鑰對數據進行加密,只有使用對應的公鑰才能進行解密


——簽名加密算法(散列算法)
簽名加密算法有SHA1、MD5、HMAC等
簽名加密算法不需要密鑰,一般不可逆


三:AES算法

需要注意的是加密後獲得的bytes千萬別用UTF8去獲取字符串,不然會有信息損失,導致後面解密失敗

using System;
using System.Security.Cryptography;
using System.Text;

/// <summary>
/// AES工具
/// </summary>
public class AESUtils
{
    public const string AES_KEY = "lhwyjlyyabcdefgh";

    /// <summary>
    /// AES加密
    /// </summary>
    /// <param name="content">明文</param>
    /// <param name="key">密鑰</param>
    public static string Encrypt(string content, string key)
    {
        if (string.IsNullOrEmpty(content))
        {
            return null;
        }
        byte[] contentBytes = Encoding.UTF8.GetBytes(content);
        byte[] keyBytes = Encoding.UTF8.GetBytes(key);
        RijndaelManaged rm = new RijndaelManaged();
        rm.Key = keyBytes;
        rm.Mode = CipherMode.ECB;
        rm.Padding = PaddingMode.PKCS7;
        ICryptoTransform ict = rm.CreateEncryptor();
        byte[] resultBytes = ict.TransformFinalBlock(contentBytes, 0, contentBytes.Length);
        return Convert.ToBase64String(resultBytes, 0, resultBytes.Length);
    }

    /// <summary>
    /// AES解密
    /// </summary>
    /// <param name="str">密文</param>
    /// <param name="key">密鑰</param>
    public static string Decrypt(string content, string key)
    {
        if (string.IsNullOrEmpty(content))
        {
            return null;
        }
        byte[] contentBytes = Convert.FromBase64String(content);
        byte[] keyBytes = Encoding.UTF8.GetBytes(key);
        RijndaelManaged rm = new RijndaelManaged();
        rm.Key = keyBytes;
        rm.Mode = CipherMode.ECB;
        rm.Padding = PaddingMode.PKCS7;
        ICryptoTransform ict = rm.CreateDecryptor();
        byte[] resultBytes = ict.TransformFinalBlock(contentBytes, 0, contentBytes.Length);
        return Encoding.UTF8.GetString(resultBytes);
    }
}

四:DES算法

需要注意的是加密後獲得的bytes千萬別用UTF8去獲取字符串,不然會有信息損失,導致後面解密失敗

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

/// <summary>
/// DES工具
/// </summary>
public class DESUtils
{
    public const string DES_KEY = "lhwyjlyy";

    /// <summary>
    /// DES加密
    /// </summary>
    /// <param name="content">明文</param>
    /// <param name="key">密鑰</param>
    public static string Encrypt(string content, string key)
    {
        if (string.IsNullOrEmpty(content))
        {
            return null;
        }
        byte[] contentBytes = Encoding.UTF8.GetBytes(content);
        byte[] keyBytes = Encoding.UTF8.GetBytes(key);
        DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
        provider.Key = keyBytes;
        provider.IV = keyBytes;
        MemoryStream ms = new MemoryStream();
        CryptoStream cs = new CryptoStream(ms, provider.CreateEncryptor(), CryptoStreamMode.Write);
        cs.Write(contentBytes, 0, contentBytes.Length);
        cs.FlushFinalBlock();
        return Convert.ToBase64String(ms.ToArray());
    }

    /// <summary>
    /// DES解密
    /// </summary>
    /// <param name="content">密文</param>
    /// <param name="key">密鑰</param>
    public static string Decrypt(string content, string key)
    {
        if (string.IsNullOrEmpty(content))
        {
            return null;
        }
        byte[] contentBytes = Convert.FromBase64String(content);
        byte[] keyBytes = Encoding.UTF8.GetBytes(key);
        DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
        provider.Key = keyBytes;
        provider.IV = keyBytes;
        MemoryStream ms = new MemoryStream();
        CryptoStream cs = new CryptoStream(ms, provider.CreateDecryptor(), CryptoStreamMode.Write);
        cs.Write(contentBytes, 0, contentBytes.Length);
        cs.FlushFinalBlock();
        return Encoding.UTF8.GetString(ms.ToArray());
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章