簡體   English   中英

AES在.NET中加密並使用Node.js加密解密?

[英]AES encrypt in .NET and decrypt with Node.js crypto?

我正在嘗試加密Mono C#中的一些數據,將其發送到NodeJS服務器並在那里解密。 我正在試圖弄清楚用什么算法來匹配這兩者。

我發送用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

這段代碼適用於我的Node.js端,但是請替換靜態iv,否則加密將是無用的。

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位的32位字符密鑰才能使此算法正常工作。

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

你應該簡單地編寫new AesManaged()
您不需要調用Create()

然后,您需要設置KeyIV ,然后調用CreateDecryptor()並將其放入CryptoStream

結果證明這是一個愚蠢的錯誤。 我認為Node.js中的create函數可以采用變量參數計數。 事實證明你需要調用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM