2016-04-07 97 views
2

我試圖使用來自AES的AES librery進行角度加密。在javascript中加密並在C#中使用AES算法進行解密

我使用AES的CryptoJS.AES.encrypt()方法對字符串進行加密。

這裏我的代碼:

var txtloginKod = 'Some String...'; 
    var key = CryptoJS.enc.Utf8.parse('8080808080808080'); 
    var iv = CryptoJS.enc.Utf8.parse('8080808080808080'); 
    var encryptedlogin = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(txtloginKod), key, 
    { 
     keySize: 128/8, 
     iv: iv, 
     mode: CryptoJS.mode.CBC, 
     padding: CryptoJS.pad.Pkcs7 
    }); 

的方法CryptoJS.AES.encrypt()返回一個對象,以我的encryptedlogin變量。

我不知道如何在C#這個對象發送到我的WCF Web服務器

當我嘗試發送孔對象(和定義Web服務方法期望獲得C#對象) - 我得到這個錯誤:

「轉換圓形結構,以JSON」

+1

這是https協議的用途。 – dbugger

+0

我的答案有問題嗎?如果沒有,它解決了你的問題,你可以[接受](http://meta.stackexchange.com/q/5234/266187)它。 –

回答

0

你會需要自己序列化的密文。有很多方法可以做到這一點。

如果密鑰不是一個字符串,而是一個WordArray(如你的情況),那麼簡單的encryptedlogin.toString()將產生一個只包含密文的Base64編碼的字符串。請記住,您需要包含enc-base64.js源文件。

如果「密鑰」(實際上是密碼)是一個字符串,則會應用與OpenSSL兼容的密鑰派生。在這種情況下,encryptedlogin.toString()將是一個Base64編碼的字符串,其中包含「Salted__」字符串,8字節隨機鹽和密文。

如果你只想得到密文,那麼encryptedlogin.ciphertext.toString()會給你一個十六進制編碼的字符串,其中只包含密文,而encryptedlogin.iv.toString()會給你一個十六進制編碼的IV。您可以用這種方式生成Base64編碼的字符串encryptedlogin.ciphertext.toString(CryptoJS.enc.Base64)

請記住,爲了提供語義安全性,IV必須隨機選擇用於每種加密。它不必是保密的,所以你可以將它和密文一起發送。

在服務器端,您將解碼值(Base64或Hex,取決於您在加密過程中使用的值),並將它們與AesCryptoServiceProvider類(或類似的)一起用於解密密文。


請記住,您還需要驗證您的密文以檢測(惡意)操作。這可以通過具有像HMAC-SHA256這樣的強MAC的加密然後MAC方案來完成。此外,如果密鑰與密文一起傳輸或通過不安全的通道傳輸,那麼這基本上只是數據混淆,並不提供真正的安全性。查看更多:Javascript Cryptography Considered Harmful

-1

檢查請https://social.msdn.microsoft.com/Forums/vstudio/en-US/47800a60-4461-4f8e-a8d1-751fa62c7884/aes-encrypt-in-javascript-and-decrypt-in-c?forum=csharpgeneral

此外,你應該使用CryptoJS V3.1.2 AES實現使用它。你可以在這裏下載:https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/crypto-js/CryptoJS%20v3.1.2.zip

Js的代碼,你可以在這裏找到:jsfiddle。net/aEKw5/22/

因此,使用上面的信息可以在C#端進行編碼,並在js上進行解碼。或相反亦然。

相關問題