我試圖從閃存(客戶端)的JavaScript發送加密數據(如運行在ASP的JScript)在服務器端。如何使用AES解密ECB加密JS
有幾個JavaScript的AES庫,但他們幾乎沒有證件。我正在嘗試加密-js,但不能讓代碼工作。下面的例子生成一個空輸出,它應該生成「6bc1bee22e409f96e93d7e117393172a」。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/rollups/aes.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/components/mode-ecb.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/components/pad-nopadding.js"></script>
<script>
var key = CryptoJS.enc.Hex.parse('2b7e151628aed2a6abf7158809cf4f3c');
var data = CryptoJS.enc.Hex.parse('3ad77bb40d7a3660a89ecaf32466ef97');
var decrypted3 = CryptoJS.AES.decrypt(data, key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding });
document.write("<br /> dec3: " + decrypted3.toString());
</script>
</body>
</html>
我參加了一個記錄工作密鑰和加密的數據從http://www.inconteam.com/software-development/41-encryption/55-aes-test-vectors
我使用歐洲央行,因爲它不需要靜脈輸液或鹽的唯一版本,因爲服務器不會知道IV或鹽在客戶端使用,所以無法解密數據。
沒有人有任何線索,爲什麼上面的失敗,對數據進行解密,或者知道任何文檔?
更新:經過幾個小時的反覆試驗,我想出了一個產生輸出的組合:7c121d95a84573b6120ada2ffff1ce3118561eba40555c0b但是,這仍然是不正確的。產生這種變化是:
var decrypted3 = CryptoJS.AES.decrypt('3ad77bb40d7a3660a89ecaf32466ef97', key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding });
即,我以十六進制字符串的形式傳遞了數據,該數據不是正確的,但至少會產生輸出。
下一個問題將是填充的問題。在客戶端上,我使用AS3 hurlant庫,它只提供兩種填充策略:NONE和PKCS#5。在crypto-js中,可用的策略是:
Pkcs7 (the default)
Iso97971
AnsiX923
Iso10126
ZeroPadding
NoPadding
這是否意味着在兩個庫之間不會有每次解密數據的機會?在我必須編寫自己的填充黑客(在AS3和java之間)之前,要添加或刪除尾隨數據,但是這需要花費數天的時間對二進制數據進行反覆試驗 - 必須有更簡單的方法從客戶端發送單個加密字符串到服務器。
SSL不是一個選項作爲客戶端,用戶可以簡單地使用查爾斯代理或類似的看,並與未加密的數據篡改。
我正在嘗試同樣的事情,它似乎沒有工作。我用ECB使用Crypto.JS進行加密,然後嘗試使用CryptoJS和ECB進行解密,CryptoJS生成的是相同的哈希,但它不起作用。我設法得到了一個輸出,但這是錯誤的。我覺得有些東西不適合圖書館。唯一可行的是給加密到解密器的CryptoJS返回的整個對象。這很愚蠢,因爲我想把它發送給其他人解密。 –
不要使用ECB模式,它不安全,請參閱[ECB模式](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29),向下滾動到企鵝。 取而代之的是將CBC模式與隨機IV一起使用,只是將加密數據與IV一起用於解密。 – zaph