潸然泪下的小飞飞

导航

NET实现RSA AES DES 字符串 加密解密以及SHA1 MD5加密

本文列举了    数据加密算法(Data Encryption Algorithm,DEA) 密码学中的高级加密标准(Advanced EncryptionStandard,AES)RSA公钥加密算法 的加密解密 .NET实现以及 安全哈希算法(Secure Hash Algorithm)和MD5的实现。

实现如下

using System;

usingSystem.Security.Cryptography;

usingSystem.IO;

usingSystem.Text;

usingSystem.Globalization;

usingSystem.Xml.Linq;

usingSystem.Collections.Generic;

 

namespaceEncriptSample

{

    /// <summary>

    /// 加密、解密

    /// </summary>

    class Encrypter

    {

        //DES默认密钥向量

        private static byte[] DES_IV = { 0x12,0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

        //AES默认密钥向量   

        public static readonly byte[] AES_IV ={ 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90,0xAB, 0xCD, 0xEF };

 

        #region MD5

        /// <summary>

        /// MD5加密为32字符长度的16进制字符串

        /// </summary>

        /// <paramname="input"></param>

        /// <returns></returns>

        public static stringEncryptByMD5(string input)

        {

            MD5 md5Hasher = MD5.Create();

            byte[] data =md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(input));

 

            StringBuilder sBuilder = newStringBuilder();

            //将每个字节转为16进制

            for (int i = 0; i < data.Length;i++)

            {

               sBuilder.Append(data[i].ToString("x2"));

            }

 

            return sBuilder.ToString();

        }

        #endregion

 

        #region SHA1

        /// <summary>

        /// SHA1加密

        /// </summary>

        /// <paramname="input"></param>

        /// <returns></returns>

        public static stringEncryptBySHA1(string input)

        {

            SHA1 sha = new SHA1CryptoServiceProvider();

            byte[] bytes =Encoding.Unicode.GetBytes(input);

            byte[] result =sha.ComputeHash(bytes);

            returnBitConverter.ToString(result);

        }

        #endregion

 

        #region DES

        /// <summary>

        /// 加密方法

        /// </summary>

        /// <paramname="input"></param>

        /// <paramname="key"></param>

        /// <returns></returns>

        public static stringEncryptByDES(string input, string key)

        {

            byte[] inputBytes =Encoding.UTF8.GetBytes(input); //Encoding.UTF8.GetBytes(input);

            byte[] keyBytes =ASCIIEncoding.UTF8.GetBytes(key);

            byte[] encryptBytes =EncryptByDES(inputBytes, keyBytes, keyBytes);

            //string result =Encoding.UTF8.GetString(encryptBytes); //无法解码,其加密结果中文出现乱码:d\"?e????(??uπ?W??-??,_?\nJn7 

            //原因:如果明文为中文,UTF8编码两个字节标识一个中文字符,但是加密后,两个字节密文,不一定还是中文字符。

            using (DES des = newDESCryptoServiceProvider())

            {

                using (MemoryStream ms = newMemoryStream())

                {

                    using (CryptoStream cs =new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))

                    {

                        using (StreamWriterwriter = new StreamWriter(cs))

                        {

                           writer.Write(inputBytes);

                        }

                    }

                }

            }

 

            string result =Convert.ToBase64String(encryptBytes);

 

            return result;

        }

        /// <summary>

        /// DES加密

        /// </summary>

        /// <paramname="inputBytes">输入byte数组</param>

        /// <param name="key">密钥,只能是英文字母或数字</param>

        /// <param name="IV">偏移向量</param>

        /// <returns></returns>

        public static byte[]EncryptByDES(byte[] inputBytes, byte[] key, byte[] IV)

        {

            DES des = newDESCryptoServiceProvider();

            //建立加密对象的密钥和偏移量

            des.Key = key;

            des.IV = IV;

            string result = string.Empty;

 

            //1、如果通过CryptoStreamMode.Write方式进行加密,然后CryptoStreamMode.Read方式进行解密,解密成功。

            using (MemoryStream ms = newMemoryStream())

            {

                using (CryptoStream cs = newCryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))

                {

                    cs.Write(inputBytes, 0,inputBytes.Length);

                }

                return ms.ToArray();

            }

            //2、如果通过CryptoStreamMode.Write方式进行加密,然后再用CryptoStreamMode.Write方式进行解密,可以得到正确结果

            //3、如果通过CryptoStreamMode.Read方式进行加密,然后再用CryptoStreamMode.Read方式进行解密,无法解密,Error:要解密的数据的长度无效。

            //4、如果通过CryptoStreamMode.Read方式进行加密,然后再用CryptoStreamMode.Write方式进行解密,无法解密,Error:要解密的数据的长度无效。

            //using (MemoryStream ms = newMemoryStream(inputBytes))

            //{

            //    using (CryptoStream cs = newCryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Read))

            //    {

            //        using (StreamReader reader = newStreamReader(cs))

            //        {

            //            result = reader.ReadToEnd();

            //            returnEncoding.UTF8.GetBytes(result);

            //        }

            //    }

            //}

        }

        /// <summary>

        /// 解密

        /// </summary>

        /// <paramname="input"></param>

        /// <paramname="key"></param>

        /// <returns></returns>

        public static stringDecryptByDES(string input, string key)

        {

            //UTF8无法解密,Error:要解密的数据的长度无效。

            //byte[] inputBytes =Encoding.UTF8.GetBytes(input);//UTF8乱码,见加密算法

            byte[] inputBytes =Convert.FromBase64String(input);

 

            byte[] keyBytes =ASCIIEncoding.UTF8.GetBytes(key);

            byte[] resultBytes = DecryptByDES(inputBytes,keyBytes, keyBytes);

 

            string result =Encoding.UTF8.GetString(resultBytes);

 

            return result;

        }

        /// <summary>

        /// 解密方法

        /// </summary>

        /// <param name="inputBytes"></param>

        /// <paramname="key"></param>

        /// <paramname="iv"></param>

        /// <returns></returns>

        public static byte[]DecryptByDES(byte[] inputBytes, byte[] key, byte[] iv)

        {

            DESCryptoServiceProvider des = newDESCryptoServiceProvider();

            //建立加密对象的密钥和偏移量,此值重要,不能修改

            des.Key = key;

            des.IV = iv;

 

            //通过write方式解密

            //using (MemoryStream ms = newMemoryStream())

            //{

           //    using (CryptoStream cs = newCryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))

            //    {

            //        cs.Write(inputBytes, 0,inputBytes.Length);

            //    }

            //    return ms.ToArray();

            //}

 

            //通过read方式解密

            using (MemoryStream ms = newMemoryStream(inputBytes))

            {

                using (CryptoStream cs = newCryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Read))

                {

                    using (StreamReader reader = newStreamReader(cs))

                    {

                        string result =reader.ReadToEnd();

                        returnEncoding.UTF8.GetBytes(result);

                    }

                }

            }

 

            //错误写法,注意哪个是输出流的位置,如果范围ms,与原文不一致。

            //using (MemoryStream ms = newMemoryStream(inputBytes))

            //{

            //    using (CryptoStream cs = newCryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Read))

            //    {

            //        cs.Read(inputBytes, 0,inputBytes.Length);

            //    }

            //    return ms.ToArray();

            //}

        }

 

        /// <summary>

        /// 加密字符串

        /// </summary>

        /// <param name="input"></param>

        /// <paramname="sKey"></param>

        /// <returns></returns>

        public static stringEncryptString(string input, string sKey)

        {

            byte[] data =Encoding.UTF8.GetBytes(input);

            using (DESCryptoServiceProvider des= new DESCryptoServiceProvider())

            {

                des.Key =ASCIIEncoding.ASCII.GetBytes(sKey);

                des.IV =ASCIIEncoding.ASCII.GetBytes(sKey);

                ICryptoTransform desencrypt = des.CreateEncryptor();

                byte[] result =desencrypt.TransformFinalBlock(data, 0, data.Length);

                returnBitConverter.ToString(result);

            }

        }

        /// <summary>

        /// 解密字符串

        /// </summary>

        /// <paramname="input"></param>

        /// <paramname="sKey"></param>

        /// <returns></returns>

        public static stringDecryptString(string input, string sKey)

        {

            string[] sInput =input.Split("-".ToCharArray());

            byte[] data = new byte[sInput.Length];

            for (int i = 0; i <sInput.Length; i++)

            {

                data[i] = byte.Parse(sInput[i],NumberStyles.HexNumber);

            }

            using (DESCryptoServiceProvider des= new DESCryptoServiceProvider())

            {

                des.Key =ASCIIEncoding.ASCII.GetBytes(sKey);

                des.IV =ASCIIEncoding.ASCII.GetBytes(sKey);

                ICryptoTransform desencrypt =des.CreateDecryptor();

                byte[] result =desencrypt.TransformFinalBlock(data, 0, data.Length);

                returnEncoding.UTF8.GetString(result);

            }

        }

        #endregion

 

        #region AES

        /// <summary>  

        /// AES加密算法  

        /// </summary>  

        /// <paramname="input">明文字符串</param>  

        /// <param name="key">密钥</param>  

        /// <returns>字符串</returns>  

        public static stringEncryptByAES(string input, string key)

        {

            byte[] keyBytes =Encoding.UTF8.GetBytes(key.Substring(0, 32));

            using (AesCryptoServiceProvideraesAlg = new AesCryptoServiceProvider())

            {

                aesAlg.Key = keyBytes;

                aesAlg.IV = AES_IV;

 

                ICryptoTransform encryptor =aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

                using (MemoryStream msEncrypt =new MemoryStream())

                {

                    using (CryptoStreamcsEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))

                    {

                        using (StreamWriterswEncrypt = new StreamWriter(csEncrypt))

                        {

                           swEncrypt.Write(input);

                        }

                        byte[] bytes =msEncrypt.ToArray();

                        //returnConvert.ToBase64String(bytes);//此方法不可用

                        returnBitConverter.ToString(bytes);

                    }

                }

            }

        }

        /// <summary>  

        /// AES解密  

        /// </summary>  

        /// <paramname="input">密文字节数组</param>  

        /// <param name="key">密钥</param>  

        /// <returns>返回解密后的字符串</returns>  

        public static stringDecryptByAES(string input, string key)

        {

            //byte[] inputBytes =Convert.FromBase64String(input); //Encoding.UTF8.GetBytes(input);

            string[] sInput =input.Split("-".ToCharArray());

            byte[] inputBytes = newbyte[sInput.Length];

            for (int i = 0; i <sInput.Length; i++)

            {

                inputBytes[i] =byte.Parse(sInput[i], NumberStyles.HexNumber);

            }

            byte[] keyBytes =Encoding.UTF8.GetBytes(key.Substring(0, 32));

            using (AesCryptoServiceProvideraesAlg = new AesCryptoServiceProvider())

            {

                aesAlg.Key = keyBytes;

                aesAlg.IV = AES_IV;

 

                ICryptoTransform decryptor =aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

                using (MemoryStream msEncrypt =new MemoryStream(inputBytes))

                {

                    using (CryptoStreamcsEncrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Read))

                    {

                        using (StreamReadersrEncrypt = new StreamReader(csEncrypt))

                        {

                            returnsrEncrypt.ReadToEnd();

                        }

                    }

                }

            }

        }

        /// <summary> 

        /// AES加密        

        /// </summary> 

        /// <param name="inputdata">输入的数据</param>         

       /// <param name="iv">向量128位</param>         

       /// <param name="strKey">加密密钥</param>         

       /// <returns></returns> 

        public static byte[]EncryptByAES(byte[] inputdata, byte[] key, byte[] iv)

        {

            ////分组加密算法 

            //Aes aes = newAesCryptoServiceProvider();          

            ////设置密钥及密钥向量 

            //aes.Key = key;

            //aes.IV = iv;

            //using (MemoryStream ms = newMemoryStream())

            //{

            //    using (CryptoStream cs = newCryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))

            //    {

            //        using (StreamWriter writer = newStreamWriter(cs))

            //        {

            //            writer.Write(inputdata);

            //        }

            //        return ms.ToArray(); 

            //    }               

            //}

 

            using (AesCryptoServiceProvideraesAlg = new AesCryptoServiceProvider())

            {

                aesAlg.Key = key;

                aesAlg.IV = iv;

 

                ICryptoTransform encryptor =aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

                using (MemoryStream msEncrypt =new MemoryStream())

                {

                    using (CryptoStreamcsEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))

                    {

                        using (StreamWriterswEncrypt = new StreamWriter(csEncrypt))

                        {

                            swEncrypt.Write(inputdata);

                        }

                        byte[] encrypted =msEncrypt.ToArray();

                        return encrypted;

                    }

                }

            }

        }

       /// <summary>         

        /// AES解密         

        /// </summary> 

       /// <param name="inputdata">输入的数据</param>               

       /// <param name="key">key</param>         

       /// <param name="iv">向量128</param> 

        /// <returns></returns> 

        public static byte[]DecryptByAES(byte[] inputBytes, byte[] key, byte[] iv)

        {

            Aes aes = newAesCryptoServiceProvider();

            aes.Key = key;

            aes.IV = iv;

            byte[] decryptBytes;

            using (MemoryStream ms = newMemoryStream(inputBytes))

            {

                using (CryptoStream cs = newCryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Read))

                {

                    using (StreamReader reader= new StreamReader(cs))

                    {

                        string result =reader.ReadToEnd();

                        decryptBytes =Encoding.UTF8.GetBytes(result);

                    }

                }

            }

 

            return decryptBytes;

        }

        #endregion

 

        #region DSA

        #endregion

 

        #region RSA

        /// <summary>

        /// RSA加密

        /// </summary>

        /// <paramname="plaintext">明文</param>

        /// <paramname="publicKey">公钥</param>

        /// <returns>密文字符串</returns>

        public static stringEncryptByRSA(string plaintext, string publicKey)

        {

            UnicodeEncoding ByteConverter = newUnicodeEncoding();

            byte[] dataToEncrypt =ByteConverter.GetBytes(plaintext);

            using (RSACryptoServiceProvider RSA= new RSACryptoServiceProvider())

            {

                RSA.FromXmlString(publicKey);

                byte[] encryptedData =RSA.Encrypt(dataToEncrypt, false);

                return Convert.ToBase64String(encryptedData);

            }

        }

        /// <summary>

        /// RSA解密

        /// </summary>

        /// <paramname="ciphertext">密文</param>

        /// <paramname="privateKey">私钥</param>

        /// <returns>明文字符串</returns>

        public static stringDecryptByRSA(string ciphertext, string privateKey)

        {

            UnicodeEncoding byteConverter = newUnicodeEncoding();

            using (RSACryptoServiceProvider RSA= new RSACryptoServiceProvider())

            {

                RSA.FromXmlString(privateKey);

                byte[] encryptedData =Convert.FromBase64String(ciphertext);

                byte[] decryptedData =RSA.Decrypt(encryptedData, false);

                returnbyteConverter.GetString(decryptedData);

            }

        }

 

        //public static string signByRSA(stringplaintext, string privateKey)

        //{

        //   UnicodeEncoding ByteConverter = new UnicodeEncoding();

        //   byte[] dataToEncrypt = ByteConverter.GetBytes(plaintext);

        //   using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())

        //   {

        //        RSA.FromXmlString(privateKey);

        //        byte[] encryptedData =RSA.SignData(dataToEncrypt,);

        //        return Convert.ToBase64String(encryptedData);

        //   }

        //}

        /// <summary>

        /// 数字签名

        /// </summary>

        /// <paramname="plaintext">原文</param>

        /// <paramname="privateKey">私钥</param>

        /// <returns>签名</returns>

        public static stringHashAndSignString(string plaintext, string privateKey)

        {

            UnicodeEncoding ByteConverter = newUnicodeEncoding();

            byte[] dataToEncrypt =ByteConverter.GetBytes(plaintext);

 

            using (RSACryptoServiceProviderRSAalg = new RSACryptoServiceProvider())

            {

               RSAalg.FromXmlString(privateKey);

                //使用SHA1进行摘要算法,生成签名

                byte[] encryptedData =RSAalg.SignData(dataToEncrypt, new SHA1CryptoServiceProvider());

                returnConvert.ToBase64String(encryptedData);

            }

        }

        /// <summary>

        /// 验证签名

        /// </summary>

        /// <paramname="plaintext">原文</param>

        /// <paramname="SignedData">签名</param>

        /// <paramname="publicKey">公钥</param>

        /// <returns></returns>

        public static bool VerifySigned(stringplaintext, string SignedData, string publicKey)

        {

            using (RSACryptoServiceProviderRSAalg = new RSACryptoServiceProvider())

            {

               RSAalg.FromXmlString(publicKey);

                UnicodeEncoding ByteConverter =new UnicodeEncoding();

                byte[] dataToVerifyBytes =ByteConverter.GetBytes(plaintext);

                byte[] signedDataBytes =Convert.FromBase64String(SignedData);

                returnRSAalg.VerifyData(dataToVerifyBytes, new SHA1CryptoServiceProvider(),signedDataBytes);

            }

        }

        /// <summary>

        /// 获取Key

        /// 键为公钥,值为私钥

        /// </summary>

        /// <returns></returns>

        public static KeyValuePair<string,string> CreateRSAKey()

        {

            RSACryptoServiceProvider RSA = newRSACryptoServiceProvider();

            string privateKey =RSA.ToXmlString(true);

            string publicKey =RSA.ToXmlString(false);

 

            return new KeyValuePair<string,string>(publicKey, privateKey);

        }

        #endregion

 

        #region other

        /// <summary>

        /// 

        /// </summary>

        /// <param name="input"></param>

        /// <returns></returns>

        public static byte[] GetBytes(stringinput)

        {

            string[] sInput =input.Split("-".ToCharArray());

            byte[] inputBytes = newbyte[sInput.Length];

            for (int i = 0; i <sInput.Length; i++)

            {

                inputBytes[i] =byte.Parse(sInput[i], NumberStyles.HexNumber);

            }

            return inputBytes;

        }

        #endregion

    }

}

 

posted on 2014-03-28 16:22  潸然泪  阅读(1916)  评论(1编辑  收藏  举报