增加加密组件,并完成测试

This commit is contained in:
falcon 2020-04-01 15:54:46 +08:00
parent cbdbf24839
commit 3d26b46c69
3 changed files with 137 additions and 0 deletions

View File

@ -0,0 +1,82 @@
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace Falcon.Extend
{
/// <summary>
/// AES加密服务
/// </summary>
public class AESCryptoService:ICryptoService
{
/// <summary>
/// 用AES加密字符串
/// </summary>
/// <param name="content">明文</param>
/// <param name="key">关键字</param>
/// <returns>密文</returns>
public string Encrypt(string content,string key) {
var encryptKey = GetDecryptKey(key);
using(var aesAlg = Aes.Create()) {
using(var encryptor = aesAlg.CreateEncryptor(encryptKey,aesAlg.IV)) {
using(var msEncrypt = new MemoryStream()) {
using(var csEncrypt = new CryptoStream(msEncrypt,encryptor,CryptoStreamMode.Write))
using(var swEncrypt = new StreamWriter(csEncrypt)) {
swEncrypt.Write(content);
}
var iv = aesAlg.IV;
var decryptedContent = msEncrypt.ToArray();
var result = new byte[iv.Length + decryptedContent.Length];
Buffer.BlockCopy(iv,0,result,0,iv.Length);
Buffer.BlockCopy(decryptedContent,0,result,iv.Length,decryptedContent.Length);
return Convert.ToBase64String(result);
}
}
}
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="content">密文</param>
/// <param name="key">关键字</param>
/// <returns>明文</returns>
public string Decrypt(string content,string key) {
var fullCipher = Convert.FromBase64String(content);
var iv = new byte[16];
var cipher = new byte[fullCipher.Length - iv.Length];
Buffer.BlockCopy(fullCipher,0,iv,0,iv.Length);
Buffer.BlockCopy(fullCipher,iv.Length,cipher,0,fullCipher.Length - iv.Length);
var decryptKey = GetDecryptKey(key);
using(var aesAlg = Aes.Create()) {
using(var decryptor = aesAlg.CreateDecryptor(decryptKey,iv)) {
string result;
using(var msDecrypt = new MemoryStream(cipher)) {
using(var csDecrypt = new CryptoStream(msDecrypt,decryptor,CryptoStreamMode.Read)) {
using(var srDecrypt = new StreamReader(csDecrypt)) {
result = srDecrypt.ReadToEnd();
}
}
}
return result;
}
}
}
/// <summary>
/// 格式化加密key长度
/// </summary>
/// <param name="key">加密用的key</param>
/// <param name="keyLength">格式化长度</param>
/// <returns>加密key字节数组</returns>
protected byte[] GetDecryptKey(string key,int keyLength = 32) {
var buf = new byte[keyLength];
var ek = Encoding.UTF8.GetBytes(key);
var len = keyLength > ek.Length ? ek.Length : buf.Length;
for(var i = 0;i < len;i++) {
buf[i] = ek[i];
}
return buf;
}
}
}

View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Falcon.Extend
{
/// <summary>
/// 数据加密解密接口
/// </summary>
public interface ICryptoService
{
/// <summary>
/// 使用指定的key加密内容
/// </summary>
/// <param name="content">要加密的明文</param>
/// <param name="key">加密key</param>
/// <returns>加密后的密文</returns>
string Encrypt(string content,string key);
/// <summary>
/// 使用指定的key解密内容
/// </summary>
/// <param name="content">要解密的密文</param>
/// <param name="key">key</param>
/// <returns>解密后的明文</returns>
string Decrypt(string content,string key);
}
}

View File

@ -0,0 +1,28 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Falcon.Extend;
using System;
using System.Collections.Generic;
using System.Text;
namespace Falcon.Extend.Tests
{
[TestClass()]
public class AESCryptoServiceTests
{
[TestMethod()]
public void EncryptTest() {
ICryptoService service = new AESCryptoService();
var mw = new string[] { "abc","123","中文明文","中英文混编123abc","+-*/ _=-`~!@#$%^&*()" };
var keys = new string[] { Guid.NewGuid().ToString("N"),"123","0123456789012345678901234567890123456789" };
for(int i = 0;i < mw.Length;i++) {
for(int y = 0;y < keys.Length;y++) {
var mwn = mw[i];
var k = keys[y];
var miw = service.Encrypt(mwn,k);
var mwn1 = service.Decrypt(miw,k);
Assert.AreEqual(mwn,mwn1,$"明文有变化{k}_{mwn}{mwn1}");
}
}
}
}
}