您的位置:知识库 » .NET技术

谈谈数据加密的处理--提供各种算法处理

作者: 伍华聪  来源: 博客园  发布时间: 2010-10-14 07:16  阅读: 2948 次  推荐: 0   原文链接   [收藏]  

  3、  Base64加密解密算法

        #region Base64加密解密
        /// <summary>
        
/// Base64是一種使用64基的位置計數法。它使用2的最大次方來代表僅可列印的ASCII 字元。
        
/// 這使它可用來作為電子郵件的傳輸編碼。在Base64中的變數使用字元A-Z、a-z和0-9 ,
        
/// 這樣共有62個字元,用來作為開始的64個數字,最後兩個用來作為數字的符號在不同的
        
/// 系統中而不同。
        
/// Base64加密
        
/// </summary>
        
/// <param name="str"></param>
        
/// <returns></returns>
        public static string Base64Encrypt(string str)
        {
            
byte[] encbuff = System.Text.Encoding.UTF8.GetBytes(str);
            
return Convert.ToBase64String(encbuff);
        }

        
/// <summary>
        
/// Base64解密
        
/// </summary>
        
/// <param name="str"></param>
        
/// <returns></returns>
        public static string Base64Decrypt(string str)
        {
            
byte[] decbuff = Convert.FromBase64String(str);
            
return System.Text.Encoding.UTF8.GetString(decbuff);
        } 
        
#endregion

  4、 MD5加密及验证

  MD5的加密处理应用还是比较多,由于破解难度很大,基本上大型网站或者软件商,密码加密一般采用这种方式居多。而MD5可以用来获得32、 16、8等全部部分内容加密内容,也可以获取其加密后的哈希值。        

       /// <summary>
      
/// 获得32位的MD5加密
        
/// </summary>
        
/// <param name="input"></param>
        
/// <returns></returns>
        public static string GetMD5_32(string input)
        {
            System.Security.Cryptography.MD5 md5 
= System.Security.Cryptography.MD5.Create();
            
byte[] data = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(input));
            StringBuilder sb 
= new StringBuilder();
            
for (int i = 0; i < data.Length; i++)
            {
                sb.Append(data[i].ToString(
"x2"));
            }
            
return sb.ToString();
        }

        
/// <summary>
        
/// 获得16位的MD5加密
        
/// </summary>
        
/// <param name="input"></param>
        
/// <returns></returns>
        public static string GetMD5_16(string input)
        {
            
return GetMD5_32(input).Substring(816);
        }
        
/// <summary>
        
/// 获得8位的MD5加密
        
/// </summary>
        
/// <param name="input"></param>
        
/// <returns></returns>
        public static string GetMD5_8(string input)
        {
            
return GetMD5_32(input).Substring(88);
        }
        
/// <summary>
        
/// 获得4位的MD5加密
        
/// </summary>
        
/// <param name="input"></param>
        
/// <returns></returns>
        public static string GetMD5_4(string input)
        {
            
return GetMD5_32(input).Substring(84);
        }

        
public static string MD5EncryptHash(String input)
        {
            MD5 md5 
= new MD5CryptoServiceProvider();
            
//the GetBytes method returns byte array equavalent of a string
            byte[] res = md5.ComputeHash(Encoding.Default.GetBytes(input), 0, input.Length);
            
char[] temp = new char[res.Length];
            
//copy to a char array which can be passed to a String constructor
            Array.Copy(res, temp, res.Length);
            
//return the result as a string
            return new String(temp);
        }

  5、 对文件添加MD5标签及验证

  这种方式比较有趣,我也是最近才发现其中的奥妙,其实我们为了防止文件被修改,可以采用这种方式预先添加MD5码,然后在程序代码中进行验证,这样至少可以减少部分篡改的行为吧,因为只要文件有些少的修改,Md5码将会发生变化的,呵呵。

        #region MD5签名验证
        /// <summary>
        
/// 对给定文件路径的文件加上标签
        
/// </summary>
        
/// <param name="path">要加密的文件的路径</param>
        
/// <returns>标签的值</returns>
        public static bool AddMD5(string path)
        {
            
bool IsNeed = true;

            
if (CheckMD5(path))                                  //已进行MD5处理
                IsNeed = false;

            
try
            {
                FileStream fsread 
= new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
                
byte[] md5File = new byte[fsread.Length];
                fsread.Read(md5File, 
0, (int)fsread.Length);                               // 将文件流读取到Buffer中
                fsread.Close();

                
if (IsNeed)
                {
                    
string result = MD5Buffer(md5File, 0, md5File.Length);             // 对Buffer中的字节内容算MD5
                    byte[] md5 = System.Text.Encoding.ASCII.GetBytes(result);       // 将字符串转换成字节数组以便写人到文件中
                    FileStream fsWrite = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
                    fsWrite.Write(md5File, 
0, md5File.Length);                               // 将文件,MD5值 重新写入到文件中。
                    fsWrite.Write(md5, 0, md5.Length);
                    fsWrite.Close();
                }
                
else
                {
                    FileStream fsWrite 
= new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
                    fsWrite.Write(md5File, 
0, md5File.Length);
                    fsWrite.Close();
                }
            }
            
catch
            {
                
return false;
            }

            
return true;
        }

        
/// <summary>
        
/// 对给定路径的文件进行验证
        
/// </summary>
        
/// <param name="path"></param>
        
/// <returns>是否加了标签或是否标签值与内容值一致</returns>
        public static bool CheckMD5(string path)
        {
            
try
            {
                FileStream get_file 
= new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
                
byte[] md5File = new byte[get_file.Length];                                      // 读入文件
                get_file.Read(md5File, 0, (int)get_file.Length);
                get_file.Close();

                
string result = MD5Buffer(md5File, 0, md5File.Length - 32);             // 对文件除最后32位以外的字节计算MD5,这个32是因为标签位为32位。
                string md5 = System.Text.Encoding.ASCII.GetString(md5File, md5File.Length - 3232);   //读取文件最后32位,其中保存的就是MD5值
                return result == md5;
            }
            
catch
            {
                
return false;
            }
        }

        
/// <summary>
        
/// 计算文件的MD5值
        
/// </summary>
        
/// <param name="MD5File">MD5签名文件字符数组</param>
        
/// <param name="index">计算起始位置</param>
        
/// <param name="count">计算终止位置</param>
        
/// <returns>计算结果</returns>
        private static string MD5Buffer(byte[] MD5File, int index, int count)
        {
            System.Security.Cryptography.MD5CryptoServiceProvider get_md5 
= new System.Security.Cryptography.MD5CryptoServiceProvider();
            
byte[] hash_byte = get_md5.ComputeHash(MD5File, index, count);
            
string result = System.BitConverter.ToString(hash_byte);

            result 
= result.Replace("-""");
            
return result;
        } 
        
#endregion

  6、 SHA256加密算法

        /// <summary>
        /// SHA256函数
        
/// </summary>
        
/// <param name="str">原始字符串</param>
        
/// <returns>SHA256结果(返回长度为44字节的字符串)</returns>
        public static string SHA256(string str)
        {
            
byte[] SHA256Data = Encoding.UTF8.GetBytes(str);
            SHA256Managed Sha256 
= new SHA256Managed();
            
byte[] Result = Sha256.ComputeHash(SHA256Data);
            
return Convert.ToBase64String(Result);  //返回长度为44字节的字符串
        }

 

0
0
标签:.NET 加密

.NET技术热门文章

    .NET技术最新文章

      最新新闻

        热门新闻