diff --git a/Falcon.Extend/AESCryptoService.cs b/Falcon.Extend/AESCryptoService.cs new file mode 100644 index 0000000..78d330c --- /dev/null +++ b/Falcon.Extend/AESCryptoService.cs @@ -0,0 +1,82 @@ +using System; +using System.IO; +using System.Security.Cryptography; +using System.Text; + +namespace Falcon.Extend +{ + /// + /// AES加密服务 + /// + public class AESCryptoService:ICryptoService + { + /// + /// 用AES加密字符串 + /// + /// 明文 + /// 关键字 + /// 密文 + 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); + } + } + } + } + /// + /// AES解密 + /// + /// 密文 + /// 关键字 + /// 明文 + 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; + } + } + } + + /// + /// 格式化加密key长度 + /// + /// 加密用的key + /// 格式化长度 + /// 加密key字节数组 + 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; + } + } +} diff --git a/Falcon.Extend/ICryptoService.cs b/Falcon.Extend/ICryptoService.cs new file mode 100644 index 0000000..ff4f7e9 --- /dev/null +++ b/Falcon.Extend/ICryptoService.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Falcon.Extend +{ + /// + /// 数据加密解密接口 + /// + public interface ICryptoService + { + /// + /// 使用指定的key加密内容 + /// + /// 要加密的明文 + /// 加密key + /// 加密后的密文 + string Encrypt(string content,string key); + /// + /// 使用指定的key解密内容 + /// + /// 要解密的密文 + /// key + /// 解密后的明文 + string Decrypt(string content,string key); + } +} diff --git a/Falcon.ExtendTests/AESCryptoServiceTests.cs b/Falcon.ExtendTests/AESCryptoServiceTests.cs new file mode 100644 index 0000000..a0d3b84 --- /dev/null +++ b/Falcon.ExtendTests/AESCryptoServiceTests.cs @@ -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}"); + } + } + } + } +} \ No newline at end of file