Расшифровка файла в Node.js выдает ошибку, но может расшифровать с помощью Bouncy Castle в C # - PullRequest
0 голосов
/ 22 сентября 2018

У меня проблема с тем, что мне дали файл для расшифровки вместе с ключом, IV и методом шифрования (aes-256-ctr).Я изо всех сил пытался расшифровать это с помощью node.js и продолжаю сталкиваться с ошибкой, говорящей, что длина IV недопустима.Мне также дали метод для расшифровки файла с помощью библиотеки BouncyCaste в C #.Метод C # работает нормально, без проблем с IV.Что мне нужно сделать по-другому в узле, чем то, что делается здесь в C #, чтобы избежать этой ошибки?

Рабочая расшифровка C # (Примечание: IV в имени файла)

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;

namespace c_app
{
  class Program
  {
    static void Main(string[] args)
    {
      var baseFolder = Directory.GetCurrentDirectory();

      // Create parameters
      var myDi = new DirectoryInfo(baseFolder);
      string keyString = "xxxxxxxxxxxxx32BitKeyxxxxxxxxxxx";
      byte[] keyBytes = ASCIIEncoding.UTF8.GetBytes(keyString);
      var c = CipherUtilities.GetCipher("AES/CTR/NoPadding");
      KeyParameter sk = ParameterUtilities.CreateKeyParameter("AES", keyBytes);

      // Get the IV
      var files = myDi.GetFiles("001398.20180823.000_1966151284357350418");
      var fileInfo = files[0];
      var pathSplit = fileInfo.FullName.Split('_');
      var filePath = pathSplit[0];
      var iv = long.Parse(pathSplit[1]);

      // Decrypt the file
      var base64String = File.ReadAllText(fileInfo.FullName);
      c.Init(false, new ParametersWithIV(sk, BitConverter.GetBytes(iv)));
      var inputBytesToDecrypt = Convert.FromBase64String(base64String);
      var decryptedBytes = c.DoFinal(inputBytesToDecrypt);
      var decryptedText = ASCIIEncoding.UTF8.GetString(decryptedBytes);

      // Write file back to current directory
      File.WriteAllBytes(string.Format(@"{0}/decrypted.csv", myDi.FullName), decryptedBytes);
    }
  }
}

Myпопытка в Node.js

var crypto = require('crypto');
var fs = require('fs');

var iv = Buffer.from('1966151284357350418', 'base64'); // Experimenting with encoding types like base64
var key = Buffer.from('xxxxxxxxxxxxx32BitKeyxxxxxxxxxxx');

fs.readFile('./001398.20180823.000_1966151284357350418', (err, encryptedText) => {
  if (err) throw err;

  var decipher = crypto.createDecipheriv('aes-256-ctr', key, iv); // <--- Error thrown here
  decrypted = decipher.update(encryptedText, 'binary', 'utf8');
  decrypted += decipher.final('utf8');
  console.log(decrypted);
});

На случай, если это будет полезно, мне также дали метод шифрования файла с помощью BouncyCastle, который можно найти здесь: https://pastebin.com/PWNzDum3

...