2013-06-25 232 views
2

我想加密Mono C#中的一些數據,將它發送到NodeJS服務器並在那裏解密它。我試圖找出用什麼算法來匹配這兩個。AES在.NET中加密並使用Node.js加密解密?

我發送用base64編碼的加密字符串。所以,我做這樣的事情在Javascript中,在那裏我知道這是用來在我的C#應用​​程序中的加密數據的密鑰:

var decipher = crypto.createDecipher('aes192',binkey, biniv); 
var dec = decipher.update(crypted,'base64','utf8'); 
dec += decipher.final('utf8'); 
console.log("dec", dec); 

在單創建我的Cypher與:

using System.Security.Cryptography; 
using (Aes aesAlg = Aes.Create("aes192")) 

我需要將正確的字符串傳遞給Aes.Create()以使其使用相同的算法,但我無法找到它應該是什麼。 「aes192」看起來不正確。

我不需要aes192這只是一個試用。如果有意義,建議使用不同的加密方式。安全不是一個問題。

通過以下鏈接可.NET和文檔的NodeJS: http://msdn.microsoft.com/en-us/library/system.security.cryptography.aes.aspx http://nodejs.org/api/crypto.html

+0

你在什麼樣的情況下保護?我認爲在這種情況下使用TLS可能會更好。 – ntoskrnl

+0

由於你的問題似乎是.NET,而不是JS。如何開始與AES然後HMac或AES-GCM在C#http://stackoverflow.com/a/10366194/637783然後找出你的JS。 – jbtule

+0

@ntoskrnl我正在將此用於許可證激活的質詢響應模式。 –

回答

1

此代碼爲我的Node.js的一面,但請更換靜態IV,otherwhise AES加密將是無用的。

var crypto = require('crypto'); 

function encrypt(data, key) { 
    key = key || new Buffer(Core.config.crypto.cryptokey, 'binary'), 
     cipher = crypto.createCipheriv('aes-256-cbc', key.toString('binary'), str_repeat('\0', 16)); 
    cipher.update(data.toString(), 'utf8', 'base64'); 
    return cipher.final('base64'); 
} 

function decipher(data, key) { 
    key = key || new Buffer(Core.config.crypto.cryptokey, 'binary'), 
     decipher = crypto.createDecipheriv('aes-256-cbc', key.toString('binary'), str_repeat('\0', 16)); 
    decipher.update(data, 'base64', 'utf8'); 
    return decipher.final('utf8'); 
} 

function str_repeat(input, multiplier) { 
    var y = ''; 
    while (true) { 
     if (multiplier & 1) { 
      y += input; 
     } 
     multiplier >>= 1; 
     if (multiplier) { 
      input += input; 
     } else { 
      break; 
     } 
    } 
    return y; 
} 

我希望這對你有幫助。

注意:您需要提供265位aka 32字符密鑰才能使此算法工作。

可能的.NET解決方案:這可能會幫助你Example

+0

太棒了!自從我嘗試這樣做以來已經有一段時間了,但我仍然需要回到這個:) –

+0

不錯,它幫助你。 –

0

你只要簡單地寫new AesManaged()
您無需致電Create()

然後,您需要設置KeyIV,然後調用CreateDecryptor()並把它放在一個CryptoStream

+0

好,那麼你可以用不同的方式編寫代碼,但我知道如何使用密鑰和IV進行加密。我的問題是如何選擇AES風格,所以我可以在Node.js中進行匹配解密。或者我錯過了什麼? –

+0

在此期間,我已經知道這個數字是關鍵字的大小,並且您可以使用KeySize從c#中的aes對象查詢它,結果是256字節。仍然當我在nodejs中嘗試「aes-256-cbc」或「aes-256」時,出現TypeError錯誤:錯誤:0606506D:數字包絡例程:EVP_DecryptFinal_ex:錯誤的最終塊長度。進一步調查... –

+0

@ 0x80您需要匹配操作模式和雙方的填充。它有助於明確指定它們,以便不依賴實現特定的行爲。 – ntoskrnl

0

原來是一個愚蠢的錯誤。我認爲Node.js中的創建函數可能需要一個可變參數。原來你需要調用createDecipheriv()來代替。

爲了記錄,您可以通過查看Aes對象中的這些屬性來輕鬆檢查填充和模式。默認值是CBC和PKCS7。該填充也用於nodejs加密。因此,一個爲128密鑰大小我的代碼解密base64編碼字符串將是:

var crypto = require('crypto'); 
var binkey = new Buffer(key, 'base64'); 
var biniv = new Buffer(iv, 'base64'); 
var decipher = crypto.createDecipheriv('aes-128-cbc', binkey, biniv); 
var decrypted = decipher.update(crypted,'base64','utf8'); 
decrypted += decipher.final('utf8'); 
console.log("decrypted", decrypted);