• ASP.NET中的DES加密解密,可用于URL传参(转)


    参考:http://www.cnblogs.com/fecitsky/articles/40659.aspx(修改了一些注释)
    做网页时经常会遇到URL传输(表单提交)参数加密。
    例如:要进行一个用户帐号编辑,要传递用户的ID,URL如下:http://localhost/mysystem/editAccounts.aspx?ID=2
    但又不想让别人知道这个用户的ID为2,恶意的使用者可能还会将2修改,改为别的用户ID。
    加密传递的参数值可以解决问题。
    以下是DEC加密、解密的函数。

    /// <summary>
            /// DEC 加密过程
            /// </summary>
            /// <param name="pToEncrypt">被加密的字符串</param>
            /// <param name="sKey">密钥(只支持8个字节的密钥)</param>
            /// <returns>加密后的字符串</returns>
            public string Encrypt(string pToEncrypt, string sKey)
            {
                //访问数据加密标准(DES)算法的加密服务提供程序 (CSP) 版本的包装对象
                DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
                des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); //建立加密对象的密钥和偏移量
                des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);  //原文使用ASCIIEncoding.ASCII方法的GetBytes方法
    
                byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);//把字符串放到byte数组中
    
                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();
            }
    
           /// <summary>
            /// DEC 解密过程
           /// </summary>
            /// <param name="pToDecrypt">被解密的字符串</param>
            /// <param name="sKey">密钥(只支持8个字节的密钥,同前面的加密密钥相同)</param>
           /// <returns>返回被解密的字符串</returns>
            public string Decrypt(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();
    
                //建立StringBuild对象,createDecrypt使用的是流对象,必须把解密后的文本变成流对象
                StringBuilder ret = new StringBuilder(); 
    
                return System.Text.Encoding.Default.GetString(ms.ToArray());
            }
    

     2 具体在程序中使用加密解密算法的例子如下:

    在发送页面
    Response.Redirect("~/GridView.aspx?ID=" + Encrypt("zlh","abcdefgh"));
    
    在接受页面
    string acceptStr;
    acceptStr = Decrypt(Request.QueryString["ID"],"abcdefgh");
    

     acceptStr 的值应该就是发送过来的"zlh"

  • 相关阅读:
    python 闭包
    并行【parallel】和并发【concurrency】线程是并发还是并行,进程是并发还是并行
    生成器,送代器的区别
    深拷贝和浅拷贝的区别
    对缺省参数的理解
    对不定长参数的理解
    mysql三范式
    mysql基础查询语法
    mysql常见查询练习题
    Ubantu-Nginx部署
  • 原文地址:https://www.cnblogs.com/li-fei/p/3445490.html
Copyright © 2020-2023  润新知