2011-06-02 111 views
0

我使用base64加密html标签,因为解决了我的代码回发问题。我的html标签包含符号,如+, - ,/或*。虽然解密加密字符串即时通讯得到以下错误:是否可以包含像+,*,/和 - 以base64格式编码的符号?

无效的Base-64字符数组的长度。

有人可以在这里提出一个解决方法吗?

JavaScript从aspx页面调用。

var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 

    function encode64(input) { 
     var output = ""; 
     var chr1, chr2, chr3; 
     var enc1, enc2, enc3, enc4; 
     var i = 0; 

     while (i < input.length) { 
      chr1 = input.charCodeAt(i++); 
      chr2 = input.charCodeAt(i++); 
      chr3 = input.charCodeAt(i++); 

      enc1 = chr1 >> 2; 
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 
      enc4 = chr3 & 63; 

      if (isNaN(chr2)) { 
       enc3 = enc4 = 64; 
      } 

      else if (isNaN(chr3)) { 
       enc4 = 64; 
      } 

      output += keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4); 
     } 

     return output; 
    } 

C#代码来解码字符串@页面加载:可以通过给含有任何我所提到的符号,甚至空格字符的一个简单的字符串来生成

public string DecodeBase64String(string encodedData) 
    { 
     byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData); 
     string returnValue = System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes); 

     return returnValue; 
    } 

错误。

HTML字符串:

"<tbody id=\"selectedColumnsTbody\">\n     <tr style=\"cursor: move;\" id=\"ExprCountryMasterID10\"><td></td><td><input id=\"chk\" checked=\"checked\" class=\"textChangeClass\" type=\"checkbox\"></td><td>CountryMaster.ID + 10</td><td><input id=\"aliastextCountryMasterID10\" class=\"aliasTextChangeClass\" value=\"\" type=\"text\"></td>><td><input id=\"hiddenIDSortCountryMasterID10\" value=\"\" type=\"hidden\"></td></tr></tbody>\n   

调用从CS页解密方法:

保护无效的Page_Load(对象发件人,EventArgs的) {

 //HtmlTextWriter htmlTable = new HtmlTextWriter(); 

     //htmlTable.InnerHtml = htmlContent; 
     //Master.FindControl("ContentPlaceHolder1").Controls.Add(htmlTable); 
     if (Session["HtmlTable"] != null) 
     { 

      htmlContent = Session["HtmlTable"].ToString(); 
      //htmlContent = htmlContent.Replace(" ", "+"); 
      htmlContent = DecodeBase64String(htmlContent); 
      htmlTable = new HtmlGenericControl(); 
      ContentPlaceHolder contentPlaceHolder = (ContentPlaceHolder)this.Master.FindControl("ContentPlaceHolder1"); 
      if (contentPlaceHolder != null) 
      { 
       htmlContent = "<table cellspacing=\"0\" cellpadding=\"0\" id=\"selectedColumns\" width=\"100%\">" + htmlContent + "</table>"; 
       htmlTable.InnerHtml = htmlContent; 
       test.InnerHtml = htmlContent; 
      } 
     } 

}

的Javascript即时通讯htmlEncode 功能StoreSessionForHtml(htmlContent){

 //   var encodedObject = htmlEncode(htmlContent); 
     //   var decodedObject = htmlDecode(encodedObject); 
     //htmlContent = htmlContent.replace(/ /g, "+"); 


     var encodedObject = encode64(htmlContent); 

     var requesthtmlContentParameter = '{' + 
         'htmlContentToServer:"' + encodedObject + '"}'; 

     $.ajax({ 
      type: "POST", 
      url: "Webtop.aspx/HTMLTableContent", 
      data: requesthtmlContentParameter, 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function(msg) { 
       //alert("Success", msg.d); 
      }, //Event that'll be fired on Success 
      error: function() { 
       // alert("Try Again"); 

      } //Event that'll be fired on Error 
     }); 
     $("#<%= HiddenHtmlContainer.ClientID %>").val(encodedObject); 
    } 
+0

请添加更多的细节,如果您添加代码,它会很好。 – BreakHead 2011-06-02 11:59:54

+0

请添加你在做什么/你怎么做的代码片段 – mkilmanas 2011-06-02 11:59:56

+0

另外,如果你想让我们知道你的代码中的一些值是什么(例如,你正在编码的字符串和它编码的内容),那么我们可能能够如果下面的答案不够,请进行更多的调试。 – Chris 2011-06-02 12:37:33

回答

0

为什么不使用HttpUtility.HtmlEncode Method

防止攻击

+0

因为他用javascript编码,而不是.net语言。 – Chris 2011-06-02 12:15:37

+0

加密在客户端完成。有什么类似的,我可以使用客户端? – NewBie 2011-06-02 12:19:38

+0

@newBie:http://stackoverflow.com/questions/246801/how-can-you-encode-to-base64-using-javascript。这似乎表明,你正在做的就像你正在使用的功能一样。 :) – Chris 2011-06-02 12:25:42

0

不应该有,因为你没有编码字符编码与任何字符的任何问题,你正在编码字节。

你会得到的错误我会假设是由于你的base64编码字符串的第十一个不正确。 Base 64编码有效地将三个字节的组变成四个字符的组。这意味着解码器需要一个字符串来解码,它是四个字符的倍数。这是通过使用特殊字符“=”来填充的。这使解码器知道那些字节不存在(而不是仅仅是空白或者确实缺少)。

由于您正在解码的字符串中的字符数很可能是您有问题。

http://base64encode.org/可能有助于验证您生成的字符串,以检查您的问题是否与编码或解码有关。

+0

它的工作在那里http://base64encode.org/。什么不见​​了? – NewBie 2011-06-02 12:41:11

+0

是的,他的脚本与其他在线资源相同。我一直在用控制台应用程序和HTML文件进行测试,似乎无法打破它。 @NewBie,有没有办法确保你的绳子在运输过程中不会受到损坏? – GalacticCowboy 2011-06-02 12:49:34

+0

它对纯文本很好,我通过编码单个空格字符来确定它,并引发错误。 – NewBie 2011-06-02 12:52:31

相关问题