分享

关于DES 过程密钥和密钥分散

 精髓_感知力 2015-09-21

http://www./?uid-205133-action-viewspace-itemid-176742

http://hzhlu./blog/830670
public class GF_Encrypt

    {

        /// <summary>

        /// DES加密

        /// </summary>

        /// <param name="pToEncrypt">加密字符串</param>

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

        /// <returns></returns>

        public static string string_Encrypt(string pToEncrypt, string sKey)

        {

            if (pToEncrypt == "") return "";

            if (sKey.Length < 8) sKey = sKey + "xuE29xWp";

            if (sKey.Length > 8) sKey = sKey.Substring(0, 8);

            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            //把字符串放到byte数组中  

            //原来使用的UTF8编码,我改成Unicode编码了,不行  

            byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);

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

            //原文使用ASCIIEncoding.ASCII方法的GetBytes方法  

            //使得输入密码必须输入英文文本  

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

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

            MemoryStream ms = new MemoryStream();

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

            //Write  the  byte  array  into  the  crypto  stream  

            //(It  will  end  up  in  the  memory  stream)  

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

            cs.FlushFinalBlock();

            //Get  the  data  back  from  the  memory  stream,  and  into  a  string  

            StringBuilder ret = new StringBuilder();

            foreach (byte b in ms.ToArray())

            {

                //Format  as  hex  

                ret.AppendFormat("{0:X2}", b);

            }

            ret.ToString();

            return ret.ToString();

        }



        /// <summary>

        /// DES解密

        /// </summary>

        /// <param name="pToDecrypt">解密字符串</param>

        /// <param name="sKey">解密密钥</param>

        /// <param name="outstr">返回值</param>

        /// <returns></returns> 

        public static bool string_Decrypt(string pToDecrypt, string sKey, out string outstr)

        {

            if (pToDecrypt == "")

            {

                outstr = "";

                return true;

            };

            if (sKey.Length < 8) sKey = sKey + "xuE29xWp";

            if (sKey.Length > 8) sKey = sKey.Substring(0, 8);

            try

            {

                DESCryptoServiceProvider des = new DESCryptoServiceProvider();

                //Put  the  input  string  into  the  byte  array  

                byte[] inputByteArray = new byte[pToDecrypt.Length / 2];

                for (int x = 0; x < pToDecrypt.Length / 2; x++)

                {

                    int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));

                    inputByteArray[x] = (byte)i;

                }

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

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

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

                MemoryStream ms = new MemoryStream();

                CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);

                //Flush  the  data  through  the  crypto  stream  into  the  memory  stream  

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

                cs.FlushFinalBlock();

                //Get  the  decrypted  data  back  from  the  memory  stream  

                //建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象  

                StringBuilder ret = new StringBuilder();

                outstr = System.Text.Encoding.Default.GetString(ms.ToArray());

                return true;

            }

            catch

            {

                outstr = "";

                return false;

            }

        }

 

 

public class DES

        {

            //默认密钥向量

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



            /// <summary>

            /// DES加密字符串

            /// </summary>

            /// <param name="encryptString">待加密的字符串</param>

            /// <param name="encryptKey">加密密钥,要求为8位</param>

            /// <returns>加密成功返回加密后的字符串,失败返回源串</returns>

            public static string Encode(string encryptString, string encryptKey)

            {

                encryptKey = GF_GET.GetSubString(encryptKey, 8, "");

                encryptKey = encryptKey.PadRight(8, ' ');

                byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));

                byte[] rgbIV = Keys;

                byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);

                DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();

                MemoryStream mStream = new MemoryStream();

                CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);

                cStream.Write(inputByteArray, 0, inputByteArray.Length);

                cStream.FlushFinalBlock();

                return Convert.ToBase64String(mStream.ToArray());



            }



            /// <summary>

            /// DES解密字符串

            /// </summary>

            /// <param name="decryptString">待解密的字符串</param>

            /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>

            /// <returns>解密成功返回解密后的字符串,失败返源串</returns>

            public static string Decode(string decryptString, string decryptKey)

            {

                try

                {

                    decryptKey = GF_GET.GetSubString(decryptKey, 8, "");

                    decryptKey = decryptKey.PadRight(8, ' ');

                    byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);

                    byte[] rgbIV = Keys;

                    byte[] inputByteArray = Convert.FromBase64String(decryptString);

                    DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();



                    MemoryStream mStream = new MemoryStream();

                    CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);

                    cStream.Write(inputByteArray, 0, inputByteArray.Length);

                    cStream.FlushFinalBlock();

                    return Encoding.UTF8.GetString(mStream.ToArray());

                }

                catch

                {

                    return "";

                }

            }

        }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约