增加DES加密方法,并完成测试
This commit is contained in:
		
							parent
							
								
									aad7cb83f2
								
							
						
					
					
						commit
						2733612bce
					
				
							
								
								
									
										77
									
								
								Falcon.SugarApi.Test/Encryption/EncryptionTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								Falcon.SugarApi.Test/Encryption/EncryptionTest.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,77 @@
 | 
			
		||||
using Falcon.SugarApi.Encryption;
 | 
			
		||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace Falcon.SugarApi.Test.Encryption
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// RSA测试类
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    [TestClass]
 | 
			
		||||
    public class EncryptionTest
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 测试公钥、秘钥生成,加密解密
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [TestMethod]
 | 
			
		||||
        public void RSATest() {
 | 
			
		||||
            var config = new RSAConfig() {
 | 
			
		||||
                BlockSize = 1024
 | 
			
		||||
            };
 | 
			
		||||
            IRSAEncryption r = new RSAProvider(config);
 | 
			
		||||
            var k = r.GenerateKey();
 | 
			
		||||
 | 
			
		||||
            var p = new RSAProvider(config);
 | 
			
		||||
            var mingw = " /// <summary>\r\n        /// 测试公钥、秘钥生成,加密解密\r\n        /// </summary>\r\n        [TestMethod]\r\n        public void EncryptionRSA() {\r\n            var config = new RSAConfig();\r\n            var r = new RSAProvider(config);";
 | 
			
		||||
            var miwen = p.Encrypt(mingw, k.PublicKey);
 | 
			
		||||
 | 
			
		||||
            var p1 = new RSAProvider(config);
 | 
			
		||||
            var mingw1 = p1.Decrypt(miwen, k.PrivateKey);
 | 
			
		||||
 | 
			
		||||
            Assert.AreEqual(mingw, mingw1, "解密后明文不同");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 测试公钥、秘钥生成,加密解密
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [TestMethod("DES测试")]
 | 
			
		||||
        public void DESTest() {
 | 
			
		||||
            var config = new DESConfig() { };
 | 
			
		||||
            IDESEncryption r = new DESProvider(config);
 | 
			
		||||
            var k = r.GenerateKey();
 | 
			
		||||
 | 
			
		||||
            //var bs = Encoding.UTF8.GetBytes(mingw);
 | 
			
		||||
            //var a1 = Convert.ToBase64String(bs);
 | 
			
		||||
            //var a2 = Convert.FromBase64String(a1);
 | 
			
		||||
            //Assert.AreEqual(bs.Length, a2.Length);
 | 
			
		||||
 | 
			
		||||
            for (int i = 0; i < 1000; i++) {
 | 
			
		||||
                var mingw = GenerateStr();
 | 
			
		||||
                Console.WriteLine(mingw);
 | 
			
		||||
                var p = new DESProvider(config);
 | 
			
		||||
                var miwen = p.Encrypt(k, mingw);
 | 
			
		||||
 | 
			
		||||
                var p1 = new DESProvider(config);
 | 
			
		||||
                var mingw1 = p1.Decrypt(k, miwen);
 | 
			
		||||
 | 
			
		||||
                Assert.AreEqual(mingw, mingw1, "解密后明文不同");
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 生成随机长度,由字符表内字符组成的字符串
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        private string GenerateStr() {
 | 
			
		||||
            var chars = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789,.!/*\";
 | 
			
		||||
            var r = new Random();
 | 
			
		||||
            var len = r.Next(100);
 | 
			
		||||
            var sb = new StringBuilder(len);
 | 
			
		||||
            for (int i = 0; i < len; i++) {
 | 
			
		||||
                sb.Append(chars[r.Next(0, chars.Length)]);
 | 
			
		||||
            }
 | 
			
		||||
            return sb.ToString();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										32
									
								
								Falcon.SugarApi/Encryption/DESConfig.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								Falcon.SugarApi/Encryption/DESConfig.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,32 @@
 | 
			
		||||
using Microsoft.Extensions.Options;
 | 
			
		||||
using System.Security.Cryptography;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace Falcon.SugarApi.Encryption
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// DES加密配置
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public class DESConfig:IOptions<DESConfig>
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 加解密编码方式
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public Encoding Encoding { get; set; } = Encoding.UTF8;
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 填充方式
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public PaddingMode Padding { get; set; } = PaddingMode.PKCS7;
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 加密模式
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public CipherMode Mode { get; set; } = CipherMode.CBC;
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 加密用的IV
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public byte[] IV { get; set; } = { 123, 221, 221, 111, 4, 6, 7, 22 };
 | 
			
		||||
 | 
			
		||||
        /// <inheritdoc/>
 | 
			
		||||
        public DESConfig Value => this;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										83
									
								
								Falcon.SugarApi/Encryption/DESProvider.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								Falcon.SugarApi/Encryption/DESProvider.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,83 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Security.Cryptography;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace Falcon.SugarApi.Encryption
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// DES对称加密
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public class DESProvider : IEncryption, IDESEncryption
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 配置文件
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public DESConfig Config { get; set; }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 通过提供配置创建DES提供程序
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="config"></param>
 | 
			
		||||
        public DESProvider(DESConfig config) {
 | 
			
		||||
            Config = config;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 创建加解密提供程序
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="key">加密用的key</param>
 | 
			
		||||
        /// <returns>加解密提供器</returns>
 | 
			
		||||
        private DESCryptoServiceProvider createProvider(string key) {
 | 
			
		||||
            if (key.Length < 8) {
 | 
			
		||||
                throw new Exception("加密用的key长度为8位");
 | 
			
		||||
            }
 | 
			
		||||
            byte[] bKey = this.Config.Encoding.GetBytes(key.Substring(0, 8));
 | 
			
		||||
            return new DESCryptoServiceProvider() {
 | 
			
		||||
                Padding = Config.Padding,
 | 
			
		||||
                Mode = Config.Mode,
 | 
			
		||||
                IV=Config.IV,
 | 
			
		||||
                Key = bKey,
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <inheritdoc/>
 | 
			
		||||
        public string GenerateKey() {
 | 
			
		||||
            var p = new DESCryptoServiceProvider() {
 | 
			
		||||
                Padding = Config.Padding,
 | 
			
		||||
                Mode = Config.Mode,
 | 
			
		||||
                IV = Config.IV,
 | 
			
		||||
            };
 | 
			
		||||
            p.GenerateKey();
 | 
			
		||||
            return Convert.ToBase64String(p.Key);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <inheritdoc/>
 | 
			
		||||
        public string Decrypt(string key, string str) {
 | 
			
		||||
            var bStr = Convert.FromBase64String(str);
 | 
			
		||||
            var desc = createProvider(key);
 | 
			
		||||
            using (var mStream = new MemoryStream()) {
 | 
			
		||||
                using (var cStream = new CryptoStream(mStream, desc.CreateDecryptor(), CryptoStreamMode.Write)) {
 | 
			
		||||
                    cStream.Write(bStr, 0, bStr.Length);
 | 
			
		||||
                    cStream.FlushFinalBlock();
 | 
			
		||||
                    var bs = mStream.ToArray();
 | 
			
		||||
                    return this.Config.Encoding.GetString(bs);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <inheritdoc/>
 | 
			
		||||
        public string Encrypt(string key, string str) {
 | 
			
		||||
            byte[] bStr = this.Config.Encoding.GetBytes(str);
 | 
			
		||||
            var desc = createProvider(key);
 | 
			
		||||
            using (var mStream = new MemoryStream()) {
 | 
			
		||||
                using (var cStream = new CryptoStream(mStream, desc.CreateEncryptor(), CryptoStreamMode.Write)) {
 | 
			
		||||
                    cStream.Write(bStr, 0, bStr.Length);
 | 
			
		||||
                    cStream.FlushFinalBlock();
 | 
			
		||||
                    var bs = mStream.ToArray();
 | 
			
		||||
                    return Convert.ToBase64String(bs);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										38
									
								
								Falcon.SugarApi/Encryption/EncryptionProviderRegirst.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								Falcon.SugarApi/Encryption/EncryptionProviderRegirst.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,38 @@
 | 
			
		||||
using Microsoft.Extensions.DependencyInjection;
 | 
			
		||||
using System;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace Falcon.SugarApi.Encryption
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// 安全组件注册
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public static class EncryptionProviderRegirst
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 注册DES加密提供程序,通过IEncryption或IDESEncryption获取注册程序。
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="services">服务集合</param>
 | 
			
		||||
        /// <param name="config">配置方法</param>
 | 
			
		||||
        /// <returns>服务集合</returns>
 | 
			
		||||
        public static IServiceCollection AddDesProvider(this IServiceCollection services, Action<DESConfig> config) {
 | 
			
		||||
            var defConfig = new DESConfig();
 | 
			
		||||
            config(defConfig);
 | 
			
		||||
            services.AddSingleton<IEncryption>(new DESProvider(defConfig));
 | 
			
		||||
            services.AddSingleton<IDESEncryption>(new DESProvider(defConfig));
 | 
			
		||||
            return services;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 使用默认配置注册DES加密提供程序,通过IEncryption或IDESEncryption获取注册程序。
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="services">服务集合</param>
 | 
			
		||||
        /// <returns>服务集合</returns>
 | 
			
		||||
        public static IServiceCollection AddDesProvider(this IServiceCollection services) {
 | 
			
		||||
            var defConfig = new DESConfig();
 | 
			
		||||
            services.AddSingleton<IEncryption>(new DESProvider(defConfig));
 | 
			
		||||
            services.AddSingleton<IDESEncryption>(new DESProvider(defConfig));
 | 
			
		||||
            return services;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								Falcon.SugarApi/Encryption/IDESEncryption.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Falcon.SugarApi/Encryption/IDESEncryption.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
namespace Falcon.SugarApi.Encryption
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// DES加密算法接口
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public interface IDESEncryption : IEncryption { }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										28
									
								
								Falcon.SugarApi/Encryption/IEncryption.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								Falcon.SugarApi/Encryption/IEncryption.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
			
		||||
namespace Falcon.SugarApi.Encryption
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// 基础加密解密接口
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public interface IEncryption
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 通过key解密字符串
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="key">key</param>
 | 
			
		||||
        /// <param name="str">密文</param>
 | 
			
		||||
        /// <returns>明文</returns>
 | 
			
		||||
        string Decrypt(string key, string str);
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 通过key加密字符串
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="key">key</param>
 | 
			
		||||
        /// <param name="str">明文</param>
 | 
			
		||||
        /// <returns>密文</returns>
 | 
			
		||||
        string Encrypt(string key, string str);
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 生成加密key
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <returns>key</returns>
 | 
			
		||||
        string GenerateKey();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user