C# UrlEngine(加密/解密)

URL是一种类DES的加密/解密算法 URLEncode主要是把Not ASC字符以及特殊字符

以%X / Hex处理链接后返回新的字符串、

        public static string UrlEncode(string URIstring, Encoding URIEncoding)
        {
            StringBuilder str = new StringBuilder();
            byte[] buf = URIEncoding.GetBytes(URIstring);
            for (int i = 0; i < buf.Length; i++)
                str.Append("%" + Convert.ToString(buf[i], 16));
            return Convert.ToString(str);
        }

上面的代码是很多人再C#中使用的一种办法,但是它却并不是标准的UrlEncode

那么我们看看它加密出的结果与另一种加密不同之处、

已更新的定义 / Wow

       上面的代码: %d2%d1%b8%fc%d0%c2%b5%c4%b6%a8%d2%e5%20%2f%20%57%6f%77

       另一种代码: %d2%d1%b8%fc%d0%c2%b5%c4%b6%a8%d2%e5%20/%20Wow

很简单你在百度或谷歌内搜索词条的时候,你可以尝试上面的词条 你一定会发现

加密出的结果不会是 上面的代码 加密出的结果、那虽然用不会有太大问题 但代码

加密不标准是无法被隐藏的、不应转换的它却转换了凭白让电脑在解密时多做操作、

下面我们看看正确的URL加密代码

        [DllImport("kernel32.dll", SetLastError = true)]
        private unsafe static extern sbyte* SetHandleCount(byte[] value);

        private unsafe static int strlen(sbyte* ptr)
        {
            int i = 0;
            while (*(ptr++) != 0) i++;
            return i;
        }
        private unsafe static string UrlEncode(string URIstring, Encoding URIEncoding)
        {
            string eax, str = string.Empty;
            sbyte* ptr = SetHandleCount(URIEncoding.GetBytes(URIstring));
            for (int i = 0, len = strlen(ptr); i < len; i++, ptr++)
            {
                int asc = *ptr < 0 ? 256 + *ptr : *ptr;
                if (asc < 42 || asc == 43 || asc > 57 && asc < 64 || asc > 90 && asc < 95 || asc == 96 || asc > 122)
                {
                    eax = Convert.ToString(asc, 16);
                    str += eax.Length < 2 ? "%0" + eax : "%" + eax;
                }
                else
                    str += (char)asc;
            }
            return str;
        }

是不是感到一下复杂了很多 但它是标准的一个URL加密方法

被多个语言采取类似、加密相同 有些URL解密代码是不支持

不标准URL加密后的字符串的虽然几率很小但不代表没有、

上面的加密大家还可以在优化一下,我只是不想定义byte[]的

变量、声明变量过多本人是很讨厌的

使用上述代码时,需要你在项目属性中打勾 允许不安全代码

否则你无法进行编译于调试,因为代码中包含本地代码部分

public static string UrlDecode(string URIstring, Encoding encoding)
        {
            ArrayList str = new ArrayList();
            for (int i = 0; i < URIstring.Length; i++)
            {
                if (URIstring[i] == '%')
                {
                    string eax = URIstring.Substring(++i, 2);
                    str.Add(Convert.ToByte(eax, 16));  i++;
                }
                else
                    str.Add(Convert.ToByte(URIstring[i]));
            }
            return encoding.GetString((byte[])str.ToArray(typeof(byte)));
        }

上面是URL解密方法部分、它可以支持不标准的URL加密后

的字符串 其核心主要是根据URL编码时以Not ASC字符以及

特殊字符从Hex换回字节 存放进BUF中 最终在到文本返回、


 


 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用 C# 语言写的 AES 加密/解密代码示例: ``` using System; using System.Security.Cryptography; using System.Text; class AES { static void Main() { string text = "Hello, world!"; // 待加密的文本 string key = "MY_KEY_123456"; // 加密用的密钥 string iv = "MY_IV_654321"; // 加密用的 IV byte[] encrypted = Encrypt(text, key, iv); // 加密文本 string encryptedText = Convert.ToBase64String(encrypted); // 将加密后的字节数组转换为 Base64 编码的字符串 Console.WriteLine("加密后的文本:{0}", encryptedText); string decryptedText = Decrypt(encrypted, key, iv); // 解密文本 Console.WriteLine("解密后的文本:{0}", decryptedText); } static byte[] Encrypt(string text, string key, string iv) { byte[] textBytes = Encoding.UTF8.GetBytes(text); using (Aes aes = Aes.Create()) { aes.Key = Encoding.UTF8.GetBytes(key); aes.IV = Encoding.UTF8.GetBytes(iv); using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write)) { cs.Write(textBytes, 0, textBytes.Length); } return ms.ToArray(); } } } static string Decrypt(byte[] data, string key, string iv) { using (Aes aes = Aes.Create()) { aes.Key = Encoding.UTF8.GetBytes(key); aes.IV = Encoding.UTF8.GetBytes(iv); using (MemoryStream ms = new MemoryStream(data)) { using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Read)) { using (StreamReader sr = new StreamReader(cs)) { return sr.ReadToEnd(); } } } } } } ``` 上述代码中,Encrypt 方法用于加密文本,Decrypt 方法用于解密文本,具体实现方式使用 Aes.Create 方法创建了一个 AES 实例,并使用指定的密钥和 IV 来进行加密解密。 其中,加密过程中,我们首先将待加密的文本转换为字节数组,然后创建一个 MemorySteram 对象,使用 CryptoStream 对象实例化时指定加密模式加密加密的字节数组,最后调用 CryptoStream 对象的 Write 方法将加密后的字节数组写入 MemorySteram 中,并返回 MemorySteram 中的字节数组。 解密过程中,我们接收一个加密过的字节数组,同样先创建一个 AES 实例,设置加密用的密钥和 IV,然后从加密过的字节数组创建一个 MemoryStream 对象,在这个对象上使用 CryptoStream 对象实例化时指定解密模式对加密过的字节数组进行解密,最后使用 StreamReader 对象从 CryptoStream 中读取出解密后的文本并返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值