增加加密组件,并完成测试
This commit is contained in:
parent
cbdbf24839
commit
3d26b46c69
82
Falcon.Extend/AESCryptoService.cs
Normal file
82
Falcon.Extend/AESCryptoService.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
27
Falcon.Extend/ICryptoService.cs
Normal file
27
Falcon.Extend/ICryptoService.cs
Normal 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);
|
||||
}
|
||||
}
|
28
Falcon.ExtendTests/AESCryptoServiceTests.cs
Normal file
28
Falcon.ExtendTests/AESCryptoServiceTests.cs
Normal 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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user