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

理论上只要继承自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));
        }

时间: 2024-09-29 02:13:58

SymmetricAlgorithmHelper对称加密辅助类,支持DES,3DES,AES,RC2的相关文章

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

转载请注明出处:http://blog.csdn.net/smartbetter/article/details/54017759 有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了算法和数据结构,你就把一切都失掉了. 2)编程就是算法和数据结构,算法和数据结构是编程的灵魂. 注意,这可不是我说的,是无数程序员总结的,话说的很实在也很精辟,若想长久可持续发展,多研究算法还是很有必要的,今天我给大家说说加密算法中的对称加密算法,并且这里将教会大家对称加密算法的编程使用.包含

java密码学学习整理--对称加密(着重描述3des)

1.对称加密要点 对称加密算法的核心是加密和解密操作使用同一套密钥.加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要.因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题. 2.des(参考自:http://baike.baidu.com/view/878529.htm?from_id=210508&type=syn&fromtitle=DES&fr=aladdin) DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位(每组的

C# 加密解密(DES,3DES,MD5,Base64) 类

原文:C# 加密解密(DES,3DES,MD5,Base64) 类 保存! public sealed class EncryptUtils { #region Base64加密解密 /// <summary> /// Base64加密 /// </summary> /// <param name="input">需要加密的字符串</param> /// <returns></returns> public sta

java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4

概述 信息安全基本概念: DES(Data Encryption Standard,数据加密标准) 3DES(Triple DES,三重数据加密算法(TDEA,Triple Data Encryption Algorithm)) AES(Advanced Encryption Standard,高级加密标准) Blowfish RC2 RC4 DES DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定

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

DES 支持8位加密解密,3Des支持24位,Aes支持32位.3Des是Des算法做三次.位数的单位是字节byte.不是bits. 3Des是把24位分成3组.第一组八位用来加密,第二组8位用于解密,第三组8位用于加密,所以.假设秘钥为123456781234567812345678(3组1-8),则相当于做了一次12345678的Des加密.比如:第一次用12345678秘钥对123进行加密得到 "LDiFUdf0iew=",然后用第二组的12345678对其进行解密(逆向加密过程

go加密算法:CBC对称加密(一)--3DES/AES

其实对称加密中的:DES\3DES\AES 采取的加解密步骤一致,只是小的细节不太一样.大家多看看就能写出来了 // rsao1.go package main import ( "bytes" "crypto/aes" "crypto/cipher" "crypto/des" "fmt" ) /* 明文加密的分组操作 .分组的长度 = 密钥的长度 //key = 64bit/8 .将每组数据和密钥进行位运

java-信息安全(七)-基于非对称加密,对称加密等理解HTTPS

概述 java-信息安全(一)-BASE64,MD5,SHA,HMAC java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4 java-信息安全(四)-数据签名.数字证书 java-信息安全(五)-非对称加密算法RSA 如果想要理解好https,请尽量了解好以上信息等. 参看文章: http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html https://cattail.me/tech/2

java和c++中的DES\3DES\Base64

首先来看一段java中对字符串加解密的代码: //密钥 private String key = "123456789012345678901234"; //解密过程,先用Base64进行解密,然后再用3DES进行第二次解密,得到明文 public String decryptThreeDESECB(String src) throws Exception { DESedeKeySpec dks = new DESedeKeySpec(key.getBytes(charSet)); S

对称加密php

/** * 常用对称加密算法类 * 支持密钥:64/128/256 bit(字节长度8/16/32) * 支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bit AES:128/256bit) * 支持模式:CBC/ECB/OFB/CFB * 密文编码:base64字符串/十六进制字符串/二进制字符串流 * 填充方式: PKCS5Padding(DES) * * @author: linvo * @version: 1.0.0 * @date: 2013/1/10 */ clas