簡體   English   中英

連接和對字符串進行Url編碼時,Base-64字符串中的無效字符

[英]Invalid character in a Base-64 string when Concatenating and Url encoding a string

我正在嘗試編寫一些通過Url傳遞的加密代碼。 為了解決這個問題,我排除了數據的實際加密,只顯示了導致問題的代碼。

我取一個鹽值,將其轉換為字節數組,然后將其轉換為base64字符串。 我將此字符串連接到另一個base64字符串(以前是字節數組)。

然后對這兩個base64字符串進行Url編碼。 這是我的代碼...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;
using System.Web;

class RHEncryption
{
    private static readonly Encoding ASCII_ENCODING = new System.Text.ASCIIEncoding();
    private static readonly string SECRET_KEY = "akey";
    private static string md5(string text)
    {
        return BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(ASCII_ENCODING.GetBytes(text))).Replace("-", "").ToLower();
    }

    public string UrlEncodedData;

    public RHEncryption()
    {
        // encryption object
        RijndaelManaged aes192 = new RijndaelManaged();
        aes192.KeySize = 192;
        aes192.BlockSize = 192;            
        aes192.Mode = CipherMode.CBC;
        aes192.Key = ASCII_ENCODING.GetBytes(md5(SECRET_KEY));
        aes192.GenerateIV();

        // convert Ivector to base64 for sending            
        string base64IV = Convert.ToBase64String(aes192.IV);

        // salt value
        string s = "maryhadalittlelamb";
        string salt = s.Substring(0, 8);
        // convert to byte array
        // and base64 for sending
        byte[] saltBytes = ASCII_ENCODING.GetBytes(salt.TrimEnd('\0'));
        string base64Salt = Convert.ToBase64String(saltBytes);

        //url encode concatenated base64 strings
        UrlEncodedData = HttpUtility.UrlEncode(base64Salt + base64IV, ASCII_ENCODING);
    }

    public string UrlDecodedData()
    {
        // decode the url encode string
        string s = HttpUtility.UrlDecode(UrlEncodedData, ASCII_ENCODING);

        // convert back from base64
        byte[] base64DecodedBytes = null;
        try
        {
            base64DecodedBytes = Convert.FromBase64String(s);
        }
        catch (FormatException e)
        {
            Console.WriteLine(e.Message.ToString());
            Console.ReadLine();
        }
        return s;
    }
}

如果再調用UrlDecodedData方法, 則會得到一個

Base-64字符串中的無效字符

例外。 這是因為base64Salt變量包含無效字符(我猜是行終止符),但似乎無法將其剝離。

更新1

自發布以來我發現的一件事是,如果我更改要編碼的字符串的順序,則不會引發異常。 因此,從更改以下代碼

UrlEncodedData = HttpUtility.UrlEncode(base64Salt + base64IV, ASCII_ENCODING);

UrlEncodedData = HttpUtility.UrlEncode(base64IV + base64Salt, ASCII_ENCODING);

似乎可以正常工作,很遺憾,由於此信息已傳遞給第三方組件,因此我無法重新排序。

這是您的問題:

UrlEncodedData = HttpUtility.UrlEncode(base64Salt + base64IV, ASCII_ENCODING);
...
string s = HttpUtility.UrlDecode(UrlEncodedData, ASCII_ENCODING);
base64DecodedBytes = Convert.FromBase64String(s);

您要連接兩個Base64編碼的字符串,然后嘗試對組合進行Base64解碼。 僅當base64Salt是6位的倍數base64Salt有效,在您的情況下不是6位的倍數。 不是這么多的數據將以結尾的'='字符進行Base64編碼,將其連接起來會將'='放在字符串的中間,這不是有效的Base64字符串。

您必須先對原始數據進行分類,然后再對其進行編碼。 僅當您知道原始數據長度時,這才起作用。 如果不這樣做,則必須分別對salt和vector進行編碼,然后將它們分類為URL; 例如http:// yoursite / yourPage?salt = mcMDaw%20VUsZX&iv = VUsZXyg6n61e6SavmMrtAWa0A

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM