You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
3.5 KiB

using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
namespace Apewer.Internals
{
internal class Aes128Helper
{
private static RijndaelManaged Provider(byte[] argkey, byte[] argvector)
{
var vkey = argkey;
if (vkey == null) vkey = new byte[0];
if (vkey.Length != 16) vkey = HashHelper.MD5(vkey);
var viv = argvector;
if (viv == null) viv = new byte[0];
if (viv.Length != 16) viv = HashHelper.MD5(viv);
//vkey = Aes256Fill(argkey);
//viv = Aes256Fill(argvector);
var vp = new RijndaelManaged();
vp.Key = vkey;
vp.IV = viv;
vp.Mode = CipherMode.CBC;
vp.Padding = PaddingMode.PKCS7;
return vp;
}
/// <summary>对数据进行 AES-128 加密。<para>若密钥不为 128 位则以密钥 MD5 作为密钥。若向量不为 128 位则与密钥相同。</para></summary>
private static byte[] Encrypt(byte[] argData)
{
return Encrypt(argData, null, null);
}
/// <summary>对数据进行 AES-128 加密。<para>若密钥不为 128 位则以密钥 MD5 作为密钥。若向量不为 128 位则与密钥相同。</para></summary>
private static byte[] Encrypt(byte[] argData, byte[] argKey)
{
return Encrypt(argData, argKey, null);
}
/// <summary>对数据进行 AES-128 加密。<para>若密钥不为 128 位则以密钥 MD5 作为密钥。若向量不为 128 位则与密钥相同。</para></summary>
private static byte[] Encrypt(byte[] argData, byte[] argKey, byte[] argVector)
{
if (argData == null) return argData;
if (argData.Length == 0) return argData;
var vresult = Constant.EmptyBytes;
var vencryptor = Provider(argKey, argVector).CreateEncryptor();
try
{
vresult = vencryptor.TransformFinalBlock(argData, 0, argData.Length);
}
catch { }
vencryptor.Dispose();
return vresult;
}
/// <summary>对数据进行 AES-128 解密。<para>若密钥不为 128 位则以密钥 MD5 作为密钥。若向量不为 128 位则与密钥相同。</para></summary>
private static byte[] Decrypt(byte[] argdata)
{
return Decrypt(argdata, null, null);
}
/// <summary>对数据进行 AES-128 解密。<para>若密钥不为 128 位则以密钥 MD5 作为密钥。若向量不为 128 位则与密钥相同。</para></summary>
private static byte[] Decrypt(byte[] argdata, byte[] argkey)
{
return Decrypt(argdata, argkey, null);
}
/// <summary>对数据进行 AES-128 解密。<para>若密钥不为 128 位则以密钥 MD5 作为密钥。若向量不为 128 位则与密钥相同。</para></summary>
private static byte[] Decrypt(byte[] argdata, byte[] argkey, byte[] argvector)
{
if (argdata == null) return argdata;
if (argdata.Length == 0) return argdata;
var vresult = Constant.EmptyBytes;
var vdecryptor = Provider(argkey, argvector).CreateDecryptor();
try
{
vresult = vdecryptor.TransformFinalBlock(argdata, 0, argdata.Length);
}
catch { }
vdecryptor.Dispose();
return vresult;
}
}
}