2013-11-01 241 views
0

我需要使用AES CBC techinque在純文本上進行加密,但在JavaScript端。基本上我需要加密URL 並通過ajax調用啓動該URL。 URL將要解密的系統是用c#編寫的。所以我必須回覆他們的 用c#編寫的加密方法。我需要在我的JavaScript使用相同的邏輯,這樣的方式就可以很容易地在C#cryptojs在加密後不返回真正的base64字符串

Javascript代碼

var Base64encodedandencryptedtext = "username=abc|password=xyz" 
// have a password need to hash on that and then pass into aes encryption function 
var hash = CryptoJS.SHA512("234-234-1231"); //password key 
var finalhash = hash.toString((CryptoJS.enc.Base64)); 
Base64encodedandencryptedtext = CryptoJS.AES.encrypt(Base64encodedandencryptedtext ,finalhash) 

var Base64encodedkey = Base64.encode("encodedkey"); 
var baseURL = "https://www.xyz.com/" 
var DHINquery = baseURL+"?key="+Base64encodedkey+"&value="+Base64encodedandencryptedtext; 

//launch via ajax 

    $.ajax({ 
      type : 'GET', 
      async : true, 
      url : DHINquery, 
      dataType : 'html', 
      data : {},   
      success : function (htmlcontent) { 
       $("#htmlpage").html(htmlcontent)     
      }, // end success 
      complete : function (htmlcontent) { 

      }, // end complete 
      error : function (htmlcontent) { 
      alert("error") 
      } 
     }); 

C#加密進行解密就在自己身邊

string Base64encodedandencryptedtext = "username=abc|password=xyz" 
Encrypt(Base64encodedandencryptedtext ,passwordkey, "AES") // call that function 

public static string Encrypt(string text, string keyguid, string cryptoService) 
    { 
     ICryptoTransform transform; 
     string text1 = keyguid; 
     UTF8Encoding enc = new UTF8Encoding(); 
     byte[] bytes = enc.GetBytes(text); 
     string str = CalculateHashToBase64String(text1, enc, "SHA512"); 
     string s = str.Substring(4, 24); 
     string str3 = str.Substring(0, 4) + str.Substring(0x1c, 4); 
     string str4 = str.Substring(0, 4) + str.Substring(28, 12); 
     string str5 = str.Substring(0, 4) + str.Substring(0x1c, 20); 
     byte[] rgbKey = enc.GetBytes(s); 
     string str7 = cryptoService; 
     byte[] buffer3 = enc.GetBytes(str4); 
     AesCryptoServiceProvider provider2 = new AesCryptoServiceProvider(); 
     provider2.Padding = PaddingMode.PKCS7; 
     provider2.Mode = CipherMode.CBC; 
     provider2.KeySize = 0x100; 
     transform = provider2.CreateEncryptor(rgbKey, buffer3); 
     return Convert.ToBase64String(Transform(bytes, transform)); // return the base64 string 
    } 
    private static byte[] Transform(byte[] input, ICryptoTransform CryptoTransform) 
    { 
     byte[] buffer; 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      using (CryptoStream stream2 = new CryptoStream(stream, CryptoTransform, CryptoStreamMode.Write)) 
      { 
       stream2.Write(input, 0, input.Length); 
       stream2.FlushFinalBlock(); 
       stream.Position = 0L; 
       buffer = stream.ToArray(); 
      } 
     } 
     return buffer; 
    } 

雖然做調試運行JavaScript的側加密後,我仍然得到base64string,但c#加密base64string和javascript 加密base64string看起來不同。出於這個原因,webservice不能成功地返回數據。

我想知道我正在使用的aes插件沒有做到他們正在做的事情在c#端。

有人知道爲什麼嗎?任何幫助將是一個偉大的投入。

+0

這可能與以下事實有關:_JavaScript_在內部使用_UTF-16_,與頁面的字符編碼無關。另外,_CryptoJS的Base64_二進制安全嗎? –

+0

我們正在研究JavaScript方面。所以我們沒有其他的加密選擇。 – user2920587

+0

有人有什麼想法嗎? – user2920587

回答

0

我看到了兩個計算密鑰之間的相當多的顯着差異。在JS中,您正在哈希一個密碼密鑰,然後將該哈希的二進制數據表示爲base64。而在你的C#代碼中,它看起來像是代表哈希的二進制數據庫base64,然後獲取該base64字符串的子字符串,然後獲取base64字符的UTF8字節。這些是一些非常重要的差異。 JS端可以簡化一點,C#端可以簡化很多。在雙方,採取密碼鍵的散列,並使用該散列本身作爲關鍵。不要將散列轉換爲base64。不要做任何其他操作。

**實際上使用像PBKDF2這樣的東西會更好,但讓我們先讓雙方同步。

**實際上,由於數據是通過ajax發送的,如果您可以使用HTTPS,那將是最好的選擇。

相關問題