首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

c#怎么对TXT文档里的内容进行MD5加密和解密

2013-04-21 
c#如何对TXT文档里的内容进行MD5加密和解密比如我现在有一个TXT文档,文件名叫123.txt现在想通过C#读取它,

c#如何对TXT文档里的内容进行MD5加密和解密
比如我现在有一个TXT文档,文件名叫123.txt
现在想通过C#读取它,然后再将里面所有的内容加密。
加密结束后如果有人直接打开这个TXT文档,里面就是乱码(就是MD5加密后的所显示的结果啦)

请问怎么实现呢
最好有具体的代码
本人初学



/// <summary>
    /// DES加密解密算法
    /// </summary>
    public class DES
    {
        /// <summary>
        /// DES加密算法
        /// sKey为8位或16位
        /// </summary>
        /// <param name="pToEncrypt">需要加密的字符串</param>
        /// <param name="sKey">密钥</param>
        /// <returns></returns>
        public string DesEncrypt(string pToEncrypt, string sKey)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
            des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
            des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            StringBuilder ret = new StringBuilder();
            foreach (byte b in ms.ToArray())
            {
                ret.AppendFormat("{0:X2}", b);
            }


            ret.ToString();
            return ret.ToString();
            //return a;
        }
        /// <summary>
        /// DES解密算法
        /// sKey为8位或16位
        /// </summary>
        /// <param name="pToDecrypt">需要解密的字符串</param>
        /// <param name="sKey">密钥</param>
        /// <returns></returns>
        public string DesDecrypt(string pToDecrypt, string sKey)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            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.ASCII.GetBytes(sKey);
            des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            StringBuilder ret = new StringBuilder();
            return System.Text.Encoding.Default.GetString(ms.ToArray());
        }
    }



 /// <summary>  
    /// 对称加密解密算法类  
    /// </summary>  
    public  class Rijndael
    {
         private SymmetricAlgorithm mobjCryptoService;  
         private string Key;  
          /// <summary>  
          /// 对称加密类的构造函数  


          /// </summary>  
     public void SymmetricMethod()  
    {  
      mobjCryptoService = new RijndaelManaged();  
      Key = "Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7";  
    }
    /// <summary>  
    /// 获得密钥  
    /// </summary>  
    /// <returns>密钥</returns>  
    private byte[] GetLegalKey()
    {
        string sTemp = Key;
        mobjCryptoService.GenerateKey();
        byte[] bytTemp = mobjCryptoService.Key;
        int KeyLength = bytTemp.Length;
        if (sTemp.Length > KeyLength)
            sTemp = sTemp.Substring(0, KeyLength);
        else if (sTemp.Length < KeyLength)
            sTemp = sTemp.PadRight(KeyLength, ' ');
        return ASCIIEncoding.ASCII.GetBytes(sTemp);
    }
    /// <summary>  
    /// 获得初始向量IV  
    /// </summary>  
    /// <returns>初试向量IV</returns>  
    private byte[] GetLegalIV()
    {
        string sTemp = "EJKLjlkjljsado$%#@!^!@&#*ajke^!@#jka";     //key 随便写。。
        mobjCryptoService.GenerateIV();
        byte[] bytTemp = mobjCryptoService.IV;
        int IVLength = bytTemp.Length;
        if (sTemp.Length > IVLength)
            sTemp = sTemp.Substring(0, IVLength);
        else if (sTemp.Length < IVLength)
            sTemp = sTemp.PadRight(IVLength, ' ');
        return ASCIIEncoding.ASCII.GetBytes(sTemp);
    }
    /// <summary>  
    /// 加密方法  
    /// </summary>  
    /// <param name="Source">待加密的串</param>  
    /// <returns>经过加密的串</returns>  
    public string Encrypto(string Source)
    {
        byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
        MemoryStream ms = new MemoryStream();


        mobjCryptoService.Key = GetLegalKey();
        mobjCryptoService.IV = GetLegalIV();
        ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();
        CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
        cs.Write(bytIn, 0, bytIn.Length);
        cs.FlushFinalBlock();
        ms.Close();
        byte[] bytOut = ms.ToArray();
        return Convert.ToBase64String(bytOut);
    }
    /// <summary>  
    /// 解密方法  
    /// </summary>  
    /// <param name="Source">待解密的串</param>  
    /// <returns>经过解密的串</returns>  
    public string Decrypto(string Source)
    {
        byte[] bytIn = Convert.FromBase64String(Source);
        MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
        mobjCryptoService.Key = GetLegalKey();
        mobjCryptoService.IV = GetLegalIV();
        ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
        CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
        StreamReader sr = new StreamReader(cs);
        return sr.ReadToEnd();
    }  
 }


[解决办法]
引用:
不一定非要用什么算法,最简单的做法就是你读取文本后,给每个字符内码加一个值,,这样显示出来的内容就是乱七八糟了,而你自己再读取密文的时候,将每个字符内码减去那个值,就又恢复原文了

这个简单,对你需求不是那么严格的话,就用这个,不需要用特定的加解密算法。

热点排行