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

一个简单的帮助类,因为后面的加密、解密算法要用到,所以这里单独写下
    using System.Security.Cryptography;
    public class KeyGenerator
    {
        /// 
        /// 随机生成秘钥(对称算法)
        /// 
        /// 秘钥(base64格式)
        /// iv向量(base64格式)
        /// 要生成的KeySize,每8个byte是一个字节,注意每种算法支持的KeySize均有差异,实际可通过输出LegalKeySizes来得到支持的值
        public static void CreateSymmetricAlgorithmKey(out string key, out string iv, int keySize)
            where T : SymmetricAlgorithm, new()
        {
            using (T t = new T())
            {
#if DEBUG
                Console.WriteLine(string.Join("", t.LegalKeySizes.Select(k => string.Format("MinSize:{0} MaxSize:{1} SkipSize:{2}", k.MinSize, k.MaxSize, k.SkipSize))));
#endif
                t.KeySize = keySize;
                t.GenerateIV();
                t.GenerateKey();
                iv = Convert.ToBase64String(t.IV);
                key = Convert.ToBase64String(t.Key);
            }
        }
        /// 
        /// 随机生成秘钥(非对称算法)
        /// 
        /// 
        /// 公钥(Xml格式)
        /// 私钥(Xml格式)
        /// 用于生成秘钥的非对称算法实现类,因为非对称算法长度需要在构造函数传入,所以这里只能传递算法类
        public static void CreateAsymmetricAlgorithmKey(out string publicKey, out string privateKey, T provider = null)
            where T : AsymmetricAlgorithm, new()
        {
            if (provider == null)
            {
                provider = new T();
            }
            using (provider)
            {
#if DEBUG
                Console.WriteLine(string.Join("", provider.LegalKeySizes.Select(k => string.Format("MinSize:{0} MaxSize:{1} SkipSize:{2}", k.MinSize, k.MaxSize, k.SkipSize))));
#endif
                publicKey = provider.ToXmlString(false);
                privateKey = provider.ToXmlString(true);
            }
        }
    }
测试代码如下,这里分别用3DES和RSA做例子
            string key, iv;
            KeyGenerator.CreateSymmetricAlgorithmKey(out key, out iv, 128);
            Console.WriteLine(key.Length);
            KeyGenerator.CreateSymmetricAlgorithmKey(out key, out iv, 192);
            Console.WriteLine(key.Length);

            string privateKey, publicKey;
            for (var i = 800; i < 2000; i += 8)
            {
                using (RSACryptoServiceProvider provider = new RSACryptoServiceProvider(i))
                {
                    KeyGenerator.CreateAsymmetricAlgorithmKey(out publicKey, out privateKey, provider);
                    Console.WriteLine(privateKey.Length);
                }
            }

你可能感兴趣的:(C#,加密解密,加密,解密,c#)