DES的两个简单的加密、解密函数(C#中使用)

来源:互联网 发布:大淘客cms偷单吗 编辑:程序博客网 时间:2024/04/29 10:34

本周我做的网站屡出问题,最后找出问题,但中途考虑的安全问题也随之进入我的禁戒线内

故花了今天半天学习C#中的加密算法

    在中途中找到2种,一种是不可逆的MD5算法,另一种是DES对称加密算法

    MD5加密适合做登录等重要、敏感信息中使用,数据库插入的为加密后的MD5值,即使被黑客攻入数据库,看见的也只是一些MD5值,MD5又是不可逆的。但是也有很大的缺点,管理员无法看到用户的信息。所以非非常重要的不建议使用。

    第二种为DES算法。虽然黑客能够得到DES值后逆算回原文本,但是即使按现在计算机的速度也需要使用较多的时间。一般一个黑客不会花那么多时间去整理,而且运算速度也较快。

    其实还有更多更安全的加密方法 可以参考http://baike.baidu.com/view/155969.htm?fr=ala0_1_1

    但是对大多数企业网站或是个人网站,我觉得MD5,DES,3DES就足够了

下面来看看源代码:

sing System;
using System.Security.Cryptography;
using System.Text;
using System.Web.Security;

namespace PublicHelper
{
    /// <summary>
    /// 数据加密解密
    /// </summary>
    public class DEncryptHelper
    {
        /// <summary>
        /// 生成MD5摘要
        /// </summary>
        /// <param name="original"></param>
        /// <returns></returns>
        public static byte[] MakeMD5(byte[] original)
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            byte[] keyhash = hashmd5.ComputeHash(original);
            hashmd5 = null;
            byte[] bytes = Encoding.UTF8.GetBytes("ss");
            return keyhash;
        }

        /// <summary>
        /// 数据加密
        /// </summary>
        /// <param name="original">数据源</param>
        /// <param name="key">密钥</param>
        /// <returns>密文</returns>
        public static byte[] Encrypt(byte[] original, byte[] key)
        {
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
            des.Key = MakeMD5(key);
            des.Mode = CipherMode.ECB;
            return des.CreateEncryptor().TransformFinalBlock(original, 0, original.Length);
        }
     
       
        /// <summary>
        /// 数据加密
        /// </summary>
        /// <param name="original">数据源</param>
        /// <param name="key">密钥</param>
        /// <returns>密文</returns>
        public static string Encrypt(string original, string key)
        {
            byte[] buff = System.Text.Encoding.Default.GetBytes(original);
            byte[] kb = System.Text.Encoding.Default.GetBytes(key);
            return Convert.ToBase64String(Encrypt(buff, kb));
        }

        /// <summary>
        /// 使用给定密钥解密数据
        /// </summary>
        /// <param name="encrypted">密文</param>
        /// <param name="key">密钥</param>
        /// <returns>明文</returns>
        public static byte[] Decrypt(byte[] encrypted, byte[] key)
        {
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
            des.Key = MakeMD5(key);
            des.Mode = CipherMode.ECB;

            return des.CreateDecryptor().TransformFinalBlock(encrypted, 0, encrypted.Length);
        }

        /// <summary>
        /// 使用给定密钥字符串解密string,返回指定编码方式明文
        /// </summary>
        /// <param name="encrypted">密文</param>
        /// <param name="key">密钥</param>
        /// <param name="encoding">字符编码方案</param>
        /// <returns>明文</returns>
        public static string Decrypt(string encrypted, string key, Encoding encoding)
        {
            byte[] buff = Convert.FromBase64String(encrypted);
            byte[] kb = System.Text.Encoding.Default.GetBytes(key);
            return encoding.GetString(Decrypt(buff, kb));
        }

        /// <summary>
        /// 使用给定密钥字符串解密string
        /// </summary>
        /// <param name="encrypted">密文</param>
        /// <param name="key">密钥</param>
        /// <returns>明文</returns>
        public static string Decrypt(string encrypted, string key)
        {
            return Decrypt(encrypted, key, Encoding.Default);
        }

        /// <summary>
        /// 数据加密
        /// </summary>
        /// <param name="original">数据源</param>
        /// <param name="encryptFormat">0:SHA1,1:MD5</param>
        /// <returns></returns>
        public static string Encrypt(string original, int encryptFormat)
        {
            string ciphertext = "";
            switch (encryptFormat)
            {
                case 0:
                    ciphertext = FormsAuthentication.HashPasswordForStoringInConfigFile(original, "SHA1");
                    break;
                case 1:
                    ciphertext = FormsAuthentication.HashPasswordForStoringInConfigFile(original, "MD5");
                    break;
            }
            return ciphertext;
        }

        /// <summary>
        /// 生成MD5码,生成的数据同Encrypt(original,1)
        /// </summary>
        /// <param name="original"></param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static string MakeMD5(string original, string encoding)
        {
            MD5 hashmd5 = new MD5CryptoServiceProvider();
            byte[] byteOriginal = hashmd5.ComputeHash(Encoding.GetEncoding(encoding).GetBytes(original));
            StringBuilder ciphertext = new StringBuilder(32);
            for (int i = 0; i < byteOriginal.Length; i++)
            {
                ciphertext.Append(byteOriginal[i].ToString("x").PadLeft(2, '0'));
            }
            return ciphertext.ToString();
        }

 


    }
}

1:public static string MakeMD5(string original, string encoding)   使用MD5算法将original使用encoding编码方式加密

2:public static string Encrypt(string original, string key)  使用可逆的算法(难道是des)将original加密,密匙为key

3:public static string Decrypt(string encrypted, string key)  使用可逆的算法(难道是des)将original还原,密匙为key

4:public static string Encrypt(string original, int encryptFormat)  使用sha1或则MD5算法加密original,int为case条件

 这个类中用到的就这4个方法,其实第四个已经包含第一个。

此类提供者:Mr Zheng, a person who taught me

原创粉丝点击