关闭

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

标签: AESDES3DESRC2
1990人阅读 评论(0) 收藏 举报
分类:
理论上只要继承自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));
        }

0
0
查看评论

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

提供一个基于.NET SymmetricAlgorithm 类的、带私钥的加密/解密算法的包装类。使用方法:SymmCrypto de = new SymmCrypto(SymmCrypto.SymmProvEnum.DES);Response.Write(x.Decrypting(de.Encry...
  • diandian82
  • diandian82
  • 2007-03-19 16:46
  • 1772

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

一个简单的帮助类,因为后面的加密、解密算法要用到,所以这里单独写下 using System.Security.Cryptography; public class KeyGenerator { /// /// 随机生成秘钥(对称算法) ...
  • starfd
  • starfd
  • 2016-07-14 11:00
  • 2073

RSA加密、解密、签名、验签 DSA签名、验签

重要的事情说三遍,该篇文章主要是验证JAVA的RSA签名、验签的测试代码,主要代码参考 http://xw-z1985.iteye.com/blog/1837376 重要的事情说三遍,该篇文章主要是验证JAVA的RSA签名、验签的测试代码,主要代码参考 http://xw-z19...
  • starfd
  • starfd
  • 2016-07-15 15:44
  • 6501

DES算法java实现,可以用在项目中

DES算法java实现,可以用在项目中 DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒钟检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难...
  • gaowenhui2008
  • gaowenhui2008
  • 2015-05-20 14:30
  • 2646

SQLServer 数据加密解密:常用的加密解密(一)

都是基本示例,更多参考官方文档: 1. Transact-SQL 函数 2. 数据库密钥 3. 证书 4. 非对称密钥 5. 对称密钥 -- drop table EnryptTest create table EnryptTest ( id int not null primary key...
  • kk185800961
  • kk185800961
  • 2015-04-04 11:09
  • 19999

C#实现AES加解密方法

using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptography; using System.IO; namespace Csharp { ...
  • yxtyxt3311
  • yxtyxt3311
  • 2011-11-22 13:10
  • 18248

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

理论上只要继承自SymmetricAlgorithm的对称加密算法,该辅助类都支持加密解密,另外为了方便与JAVA互通,默认提供了ECB和CBC两种加密模式、填充方式均为PKCS7的静态方法 using System.Security.Cryptography; public clas...
  • starfd
  • starfd
  • 2016-07-14 14:12
  • 1990

下拉式菜单中的选项能否做超链接或怎样做

请问:下拉式菜单中的选项能否做超链接或怎样做? 下面的代码是中国微软的代码,你可以参考着写。 function load(form) {var url = form.list.options[form.list.selectedIndex].value;if (url != ""...
  • rollon
  • rollon
  • 2004-07-22 20:07
  • 129

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

公元前400年,古希腊人发明了置换密码。1881年世界上的第一个电话保密专利出现。在第二次世界大战期间,德国军方启用“恩尼格玛”密码机,密码学在战争中起着非常重要的作用。     DES   1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密...
  • joeyon
  • joeyon
  • 2015-04-07 14:01
  • 4610

[android]DES/3DES/AES加密方式

DES 支持8位加密解密,3Des支持24位,Aes支持32位。3Des是Des算法做三次。位数的单位是字节byte,不是bits。 3Des是把24位分成3组,第一组八位用来加密,第二组8位用于解密,第三组8位用于加密,所以,如果秘钥为123456781234567812345678(3组1-8)...
  • bless2015
  • bless2015
  • 2015-07-01 15:01
  • 1046
    个人资料
    • 访问:384456次
    • 积分:4090
    • 等级:
    • 排名:第8967名
    • 原创:78篇
    • 转载:4篇
    • 译文:0篇
    • 评论:132条
    文章分类
    最新评论