SymmetricAlgorithmHelper对称加密辅助类,支持DES,3DES,AES,RC2

原创 2016年07月14日 14:12:53
理论上只要继承自SymmetricAlgorithm的对称加密算法,该辅助类都支持加密解密,另外为了方便与JAVA互通,默认提供了ECB和CBC两种加密模式、填充方式均为PKCS7的静态方法
    using System.Security.Cryptography;
    public class SymmetricAlgorithmHelper<T>
        where T : SymmetricAlgorithm, new()
    {
        /// <summary>
        /// 加密 ECB PKCS7模式
        /// </summary>
        /// <param name="str">要加密的数据</param>
        /// <param name="key">秘钥(base64格式)</param>
        /// <returns>加密后的结果(base64格式)</returns>
        public static string EncryptWithECB(string str, string key)
        {
            return EncryptWithECB(str, Convert.FromBase64String(key));
        }
        /// <summary>
        /// 加密 ECB PKCS7模式
        /// </summary>
        /// <param name="str">要加密的数据</param>
        /// <param name="key">秘钥</param>
        /// <returns>加密后的结果(base64格式)</returns>
        public static string EncryptWithECB(string str, byte[] key)
        {
            var toEncryptArray = Encoding.UTF8.GetBytes(str);
            return Convert.ToBase64String(Encrypt(toEncryptArray, key, null, CipherMode.ECB, PaddingMode.PKCS7));
        }
        /// <summary>
        /// 解密 ECB PKCS7模式
        /// </summary>
        /// <param name="str">要解密的数据(base64格式)</param>
        /// <param name="key">秘钥(base64格式)</param>
        /// <returns>utf-8编码返回解密后得数据</returns>
        public static string DecryptWithECB(string str, string key)
        {
            return DecryptWithECB(str, Convert.FromBase64String(key));
        }
        /// <summary>
        ///  3DES 解密 ECB PKCS7模式
        /// </summary>
        /// <param name="str">要解密的数据(base64格式)</param>
        /// <param name="key">秘钥</param>
        /// <returns>utf-8编码返回解密后得数据</returns>
        public static string DecryptWithECB(string str, byte[] key)
        {
            var toDecryptArray = Convert.FromBase64String(str);
            return Encoding.UTF8.GetString(Decrypt(toDecryptArray, key, null, CipherMode.ECB, PaddingMode.PKCS7));
        }
        /// <summary>
        /// 加密 CBC PKCS7模式
        /// </summary>
        /// <param name="str">要加密的数据</param>
        /// <param name="key">秘钥(base64格式)</param>
        /// <param name="iv">向量(base64格式)</param>
        /// <returns>加密后的结果(base64格式)</returns>
        public static string EncryptWithCBC(string str, string key, string iv)
        {
            return EncryptWithCBC(str, Convert.FromBase64String(key), Convert.FromBase64String(iv));
        }
        /// <summary>
        /// 加密 CBC PKCS7模式
        /// </summary>
        /// <param name="str">要加密的数据</param>
        /// <param name="key">秘钥</param>
        /// <param name="iv">向量</param>
        /// <returns>加密后的结果(base64格式)</returns>
        public static string EncryptWithCBC(string str, byte[] key, byte[] iv)
        {
            var toEncryptArray = Encoding.UTF8.GetBytes(str);
            return Convert.ToBase64String(Encrypt(toEncryptArray, key, iv, CipherMode.CBC, PaddingMode.PKCS7));
        }
        /// <summary>
        /// 解密 CBC PKCS7模式
        /// </summary>
        /// <param name="str">要解密的数据(base64格式)</param>
        /// <param name="key">秘钥(base64格式)</param>
        /// <param name="iv">向量(base64格式)</param>
        /// <returns>utf-8编码返回解密后得数据</returns>
        public static string DecryptWithCBC(string str, string key, string iv)
        {
            return DecryptWithCBC(str, Convert.FromBase64String(key), Convert.FromBase64String(iv));
        }
        /// <summary>
        ///  解密 CBC PKCS7模式
        /// </summary>
        /// <param name="str">要解密的数据(base64格式)</param>
        /// <param name="key">秘钥</param>
        /// <param name="iv">向量</param>
        /// <returns>utf-8编码返回解密后得数据</returns>
        public static string DecryptWithCBC(string str, byte[] key, byte[] iv)
        {
            var toDecryptArray = Convert.FromBase64String(str);
            return Encoding.UTF8.GetString(Decrypt(toDecryptArray, key, iv, CipherMode.CBC, PaddingMode.PKCS7));
        }
        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="data">要加密的数据</param>
        /// <param name="key">秘钥</param>
        /// <param name="iv">向量</param>
        /// <param name="cipherMode">块模式</param>
        /// <param name="paddingMode">填充模式</param>
        /// <returns>加密后得到的数组</returns>
        public static byte[] Encrypt(byte[] data, byte[] key, byte[] iv, CipherMode cipherMode, PaddingMode paddingMode)
        {
            return Transform(data, cipherMode, paddingMode, algorithm => algorithm.CreateEncryptor(key, iv));
        }
        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="data">要解密的数据</param>
        /// <param name="key">秘钥</param>
        /// <param name="iv">向量</param>
        /// <param name="cipherMode">块模式</param>
        /// <param name="paddingMode">填充模式</param>
        /// <returns>解密后的到的数组</returns>
        public static byte[] Decrypt(byte[] data, byte[] key, byte[] iv, CipherMode cipherMode, PaddingMode paddingMode)
        {
            return Transform(data, cipherMode, paddingMode, algorithm => algorithm.CreateDecryptor(key, iv));
        }
        private static byte[] Transform(byte[] data, CipherMode cipherMode, PaddingMode paddingMode, Func<T, ICryptoTransform> func)
        {
            using (T algorithm = new T
            {
                Mode = cipherMode,
                Padding = paddingMode
            })
            {
                using (ICryptoTransform cTransform = func(algorithm))
                {
                    return cTransform.TransformFinalBlock(data, 0, data.Length);
                }
            }
        }
        /// <summary>
        /// 生成秘钥
        /// </summary>
        /// <param name="key">秘钥(base64格式)</param>
        /// <param name="iv">iv向量(base64格式)</param>
        /// <param name="keySize">要生成的KeySize</param>
        public static void Create(out string key, out string iv, int keySize)
        {
            KeyGenerator.CreateSymmetricAlgorithmKey<T>(out key, out iv, keySize);
        }
    }
    public class TripleDESHelper : SymmetricAlgorithmHelper<TripleDESCryptoServiceProvider>
    {
        /// <summary>
        /// 生成秘钥
        /// </summary>
        /// <param name="key">秘钥(base64格式)</param>
        /// <param name="iv">iv向量(base64格式)</param>
        /// <param name="keySize">要生成的KeySize,只支持128、192</param>
        public static new void Create(out string key, out string iv, int keySize = 192)
        {
            KeyGenerator.CreateSymmetricAlgorithmKey<TripleDESCryptoServiceProvider>(out key, out iv, keySize);
        }
    }
    public class AESHelper : SymmetricAlgorithmHelper<AesCryptoServiceProvider>//RijndaelManaged
    {
        /// <summary>
        /// 生成秘钥
        /// </summary>
        /// <param name="key">秘钥(base64格式)</param>
        /// <param name="iv">iv向量(base64格式)</param>
        /// <param name="keySize">要生成的KeySize,只支持128、192、256,java一般生成的秘钥长度为128,所以这里默认也采用128</param>
        public static new void Create(out string key, out string iv, int keySize = 128)
        {
            KeyGenerator.CreateSymmetricAlgorithmKey<AesCryptoServiceProvider>(out key, out iv, keySize);
        }
    }
    public class DESHelper : SymmetricAlgorithmHelper<DESCryptoServiceProvider>
    {
        /// <summary>
        /// 生成秘钥
        /// </summary>
        /// <param name="key">秘钥(base64格式)</param>
        /// <param name="iv">iv向量(base64格式)</param>
        /// <param name="keySize">要生成的KeySize,DES只支持64,所以此处切勿传其它值</param>
        public static new void Create(out string key, out string iv, int keySize = 64)
        {
            KeyGenerator.CreateSymmetricAlgorithmKey<DESCryptoServiceProvider>(out key, out iv, keySize);
        }
    }
    public class RC2Helper : SymmetricAlgorithmHelper<RC2CryptoServiceProvider>
    {
        /// <summary>
        /// 生成秘钥
        /// </summary>
        /// <param name="key">秘钥(base64格式)</param>
        /// <param name="iv">iv向量(base64格式)</param>
        /// <param name="keySize">要生成的KeySize,支持的MinSize:40 MaxSize:128 SkipSize:8</param>
        public static new void Create(out string key, out string iv, int keySize = 96)
        {
            KeyGenerator.CreateSymmetricAlgorithmKey<RC2CryptoServiceProvider>(out key, out iv, keySize);
        }
    }
因为每种加密方式对Key长度的支持不一样,所以除SymmetricAlgorithmHelper外,还通过继承的方式覆盖了创建秘钥的Create方法,分别为TripleDESHelper、AESHelper、DESHelper、RC2Helper,KeyGenerator的代码在这里,而测试代码如下
        static void SymmetricAlgorithmDemo<T>(int keySize = 128)
            where T : SymmetricAlgorithm, new()
        {
            string key, iv;
            SymmetricAlgorithmHelper<T>.Create(out key, out iv, keySize);
            Console.WriteLine("Key:" + key);
            Console.WriteLine("IV:" + iv);
            SymmetricAlgorithmDemo<T>(key, iv);
        }
        static void SymmetricAlgorithmDemo<T>(string key, string iv)
            where T : SymmetricAlgorithm, new()
        {
            string content = "测试数据";
            string name = typeof(T).Name;
            string encTxt = SymmetricAlgorithmHelper<T>.EncryptWithECB(content, key);
            Console.WriteLine(name + " ECB PKCS7加密结果:" + encTxt);
            Console.WriteLine(name + " ECB PKCS7解密结果:" + SymmetricAlgorithmHelper<T>.DecryptWithECB(encTxt, key));
            encTxt = SymmetricAlgorithmHelper<T>.EncryptWithCBC(content, key, iv);
            Console.WriteLine(name + " CBC PKCS7加密结果:" + encTxt);
            Console.WriteLine(name + " CBC PKCS7解密结果:" + SymmetricAlgorithmHelper<T>.DecryptWithCBC(encTxt, key, iv));
            encTxt = Convert.ToBase64String(SymmetricAlgorithmHelper<T>.Encrypt(Encoding.UTF8.GetBytes(content), Convert.FromBase64String(key), Convert.FromBase64String(iv), CipherMode.CFB, PaddingMode.Zeros));
            Console.WriteLine(name + " CFB Zeros加密结果:" + encTxt);
            Console.WriteLine(name + " CFB Zeros解密结果:" + Encoding.UTF8.GetString(SymmetricAlgorithmHelper<T>.Decrypt(Convert.FromBase64String(encTxt), Convert.FromBase64String(key), Convert.FromBase64String(iv), CipherMode.CFB, PaddingMode.Zeros)));
        }

        static void Main(string[] args)
        {
            SymmetricAlgorithmDemo<TripleDESCryptoServiceProvider>();
            SymmetricAlgorithmDemo<AesCryptoServiceProvider>();
            SymmetricAlgorithmDemo<RijndaelManaged>();//AES
            SymmetricAlgorithmDemo<DESCryptoServiceProvider>(64);
            SymmetricAlgorithmDemo<RC2CryptoServiceProvider>();

            string key, iv;
            SymmetricAlgorithmHelper<RijndaelManaged>.Create(out key, out iv, 256);
            Console.WriteLine("Key:" + key);
            Console.WriteLine("IV:" + iv);
            //验证AesCryptoServiceProvider和RijndaelManaged加密结果是否一致
            SymmetricAlgorithmDemo<AesCryptoServiceProvider>(key, iv);
            SymmetricAlgorithmDemo<RijndaelManaged>(key, iv);//AES
            //测试AESHelper加密结果是否与上面一致
            string encTxt = AESHelper.EncryptWithECB("测试数据", key);
            Console.WriteLine("AESHelper ECB PKCS7加密结果:" + encTxt);
            Console.WriteLine("AESHelper ECB PKCS7解密结果:" + AESHelper.DecryptWithECB(encTxt, key));
        }

版权声明:本文为starfd原创文章,未经博主允许不得转载。

相关文章推荐

提供一个基于.NET SymmetricAlgorithm 类的、带私钥的加密/解密算法的包装类

提供一个基于.NET SymmetricAlgorithm 类的、带私钥的加密/解密算法的包装类。使用方法:SymmCrypto de = new SymmCrypto(SymmCrypto.Symm...

C#下对称算法、非对称算法生成秘钥

一个简单的帮助类,因为后面的加密、解密算法要用到,所以这里单独写下 using System.Security.Cryptography; public class KeyGenerat...
  • starfd
  • starfd
  • 2016年07月14日 11:00
  • 1676

【LeetCode-面试算法经典-Java实现】【101-Symmetric Tree(对称树)】

【101-Symmetric Tree(对称树)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a binary tree, check whether it...

C/C++中产生随机数(rand,srand用法)

原帖地址:http://zhangjunhd.blog.51cto.com/113473/197020计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机...

C++如何修改文件中的特定行

最近要处理一些数据集文件,转换为图像的格式,但是这种文件的格式并不是非常的确定,因此在处理的过程中遇到了种种bug,其中有一个bug的原因就是文件末尾的回车少了,我需要把这种文件的这些行分别加上回车。...

Java利用DES/3DES/AES这三种算法分别实现对称加密

转载地址:http://blog.csdn.net/smartbetter/article/details/54017759 有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉...

DES/3DES/AES区别 (对称加密)

公元前400年,古希腊人发明了置换密码。1881年世界上的第一个电话保密专利出现。在第二次世界大战期间,德国军方启用“恩尼格玛”密码机,密码学在战争中起着非常重要的作用。     D...
  • joeyon
  • joeyon
  • 2015年04月07日 14:01
  • 4083

DES/3DES/AES区别 (对称加密)

公元前400年,古希腊人发明了置换密码。1881年世界上的第一个电话保密专利出现。在第二次世界大战期间,德国军方启用“恩尼格玛”密码机,密码学在战争中起着非常重要的作用。     DES   ...

对称加密----AES和DES加密、解密

目前主流的加密方式有:(对称加密)AES、DES        (非对称加密)RSA、DSA 调用AES/DES加密算法包最精要的就是下面两句话: Cipher cipher = Cipher.g...

对称加密----AES和DES加密、解密

目前主流的加密方式有:(对称加密)AES、DES        (非对称加密)RSA、DSA 调用AES/DES加密算法包最精要的就是下面两句话: Cipher cipher = Cipher.g...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SymmetricAlgorithmHelper对称加密辅助类,支持DES,3DES,AES,RC2
举报原因:
原因补充:

(最多只允许输入30个字)