Rfc2898DeriveBytes to crypto.pbkdf2 - PullRequest
       2

Rfc2898DeriveBytes to crypto.pbkdf2

0 голосов
/ 03 ноября 2018

Я не получаю те же результаты при переключении с C # на JS:

Преобразование из этого:

Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(
passPhrase,
Encoding.UTF8.GetBytes(saltValue)
);
MemoryStream ms = new MemoryStream();
Aes aes = new AesManaged();
aes.Key = pdb.GetBytes(aes.KeySize / 8);
aes.IV = pdb.GetBytes(aes.BlockSize / 8);
CryptoStream cs = new CryptoStream(ms,
aes.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(input, 0, input.Length);
cs.Close();
ms.Close();
aes.Clear();
return ms.ToArray();

К этому:

crypto.pbkdf2(Buffer.from(pass), Buffer.from(salt, 'hex'), 1000, 256 / 8, null, function (err, key) {
   console.log("Key:" + key);
   crypto.pbkdf2(Buffer.from(pass), Buffer.from(salt, 'hex'), 1000, 128 / 8, null, function (err, key) {
        console.log("VID:" + key);
   }
}

Но по какой-то причине это не работает

Я пробовал Buffer.from (pass, 'utf8') и так далее, но я никогда не получаю тот же результат.

Я знаю, что что-то не так, но понятия не имею, как работает pbkdf2

1 Ответ

0 голосов
/ 03 ноября 2018

Для тех, у кого такая же проблема, как и у меня, это эквивалентный код

var pass = 'password';
var salt = 'salt';
var keyLen = keylen; // aes.KeySize / 8 where KeySize is 256
var IVLen = ivlen; // aes.BlockSize / 8 where BlockSize is 128

var nodeCrypto = crypto.pbkdf2Sync(pass, salt, 1000, keyLen + IVLen, 'sha1');

// Output same values as C# Bytes
var aesKey = [], aesIV = [];

for (var i = 0; i < nodeCrypto.length; i++) {
    if (i < keyLen)
        aesKey[i] = nodeCrypto[i];
    else
        aesIV[i - keyLen] = nodeCrypto[i];
}

console.log(aesKey);
console.log(aesIV);

// How to use it to decrypt
var r = fs.createReadStream(path);
var decrypt = crypto.createDecipheriv('aes-256-cbc', nodeCrypto.slice(0, keyLen), nodeCrypto.slice(keyLen, keyLen + IVLen));
var w = fs.createWriteStream(output);
r.pipe(decrypt).pipe(w);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...