AES расшифровывает файл в NodeJs - PullRequest
2 голосов
/ 31 марта 2020

У меня есть код JAVA, который выполняет шифрование AES файла Excel в операционной системе Windows. Я хочу расшифровать тот же файл в операционной системе MacOs, используя NodeJS. Я написал функцию расшифровки в NodeJs, которая дает мне следующую ошибку

error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt

Вот код JAVA

import java.security.Key;
import java.io.OutputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class fileEncrypter {
   try {
     final SecretKeySpec key = new SecretKeySpec("1234".getBytes(), "AES");
     final Cipher instance = Cipher.getInstance("AES/ECB/PKCS5Padding");
     final BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(name));
     final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(name2));
     instance.init(1, key);
     final byte[] b = new byte[4096];
     for (int i = bufferedInputStream.read(b); i > -1; i = bufferedInputStream.read(b)) {
        final byte[] update = instance.update(b, 0, I);
        bufferedOutputStream.write(update, 0, update.length);
     }
     bufferedInputStream.close();
     final byte[] doFinal = instance.doFinal();
     bufferedOutputStream.write(doFinal, 0, doFinal.length);
     bufferedOutputStream.flush();
     bufferedOutputStream.close();
     return "success";
   } catch(Exception obj) {
     System.err.println("Exception occured while encryption:" + obj);
     obj.printStackTrace();
     return obj.toString();
   }
}

Здесь это код NodeJs для расшифровки

function Decrypt_AES() {

const ALGORITHM = 'aes-128-ecb';
const ENCRYPTION_KEY = "1234";

var decipher = crypto.createDecipher(ALGORITHM, ENCRYPTION_KEY);
decipher.setAutoPadding(true);
var input = fs.createReadStream('test.enc');
var output = fs.createWriteStream('test_copy.xls');

input.pipe(decipher).pipe(output);

output.on('finish', function () {
    console.log('Encrypted file written to disk!');
});
output.on('error', function (e) {
    console.log(e);
});

}

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Я создал несколько примеров в Java и Node.js, которые будут шифровать и дешифровать файлы. Код будет совместим до тех пор, пока используются те же значения ключа и IV, то есть код узла будет расшифровывать выходные данные из Java и наоборот.

Теперь я использую текст файлы в качестве входных данных, но вы можете использовать любой тип файлов в качестве входных данных.

Я обновил использовать 128-битный AES в режиме ECB.

Ключ не может быть "1234", так как он должно быть длиной 128 бит, поэтому я использовал ключ, указанный ниже (16 байт / 128 бит).

Java

import java.io.*;
import javax.crypto.*;
import java.security.*;
import javax.crypto.spec.*;

public class fileEncrypter {

  private static final String key = "0123456789ABDCEF";

  public static void main(String[] args)
  {
      encryptFile(key, "java-input.txt", "java-output.txt");
      decryptFile(key, "java-output.txt", "java-decrypted.txt");
  }

  public static void encryptFile(String secret, String inputFile, String outputFile) 
  {
      try 
      {
          Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
          cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(secret.getBytes(), "AES"));

          byte[] inputData = readFile(inputFile);
          byte[] outputData = cipher.doFinal(inputData);
          writeToFile(outputFile, outputData);  
      } 
      catch (Exception e) 
      {
          System.out.println("Error while encrypting: " + e.toString());
      }
  }

  public static void decryptFile(String secret, String inputFile, String outputFile) 
    {
        try 
        {
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secret.getBytes(), "AES"));

            byte[] inputData = readFile(inputFile);
            byte[] outputData = cipher.doFinal(inputData);
            writeToFile(outputFile, outputData);  
        } 
        catch (Exception e) 
        {
            System.out.println("Error while decrypting: " + e.toString());
        }
    }

    private static byte[] readFile(String fileName) throws IOException {
        byte[] data = new byte[(int) new File(fileName).length()];
        DataInputStream dis = new DataInputStream(new FileInputStream(fileName));
        dis.readFully(data);
        dis.close();
        return data;
    }

    private static void writeToFile(String fileName, byte[] data) throws IOException {
        final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(fileName));
        bufferedOutputStream.write(data, 0, data.length);
        bufferedOutputStream.close();
    }
}

Node.js

const crypto = require("crypto");
const Algorithm = "aes-128-ecb";
const fs = require("fs");

function encryptFile(key, inputFile, outputFile) {
    const inputData = fs.readFileSync(inputFile);
    const cipher = crypto.createCipheriv(Algorithm, key, Buffer.alloc(0));
    const output = Buffer.concat([cipher.update(inputData) , cipher.final()]);
    fs.writeFileSync(outputFile, output);
}

function decryptFile(key, inputFile, outputFile) {
    const inputData = fs.readFileSync(inputFile);
    const cipher = crypto.createDecipheriv(Algorithm, key, Buffer.alloc(0));
    const output = Buffer.concat([cipher.update(inputData) , cipher.final()]);
    fs.writeFileSync(outputFile, output);
}

const KEY = Buffer.from("0123456789ABDCEF", "utf8");

encryptFile(KEY, "node-input.txt", "node-output.txt");
decryptFile(KEY, "node-output.txt", "node-decrypted.txt");
1 голос
/ 31 марта 2020

Я решил эту проблему с помощью Терри Леннокс . Сначала большое ему спасибо.

Первая ошибка:

error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt

Это была проблема заполнения, по умолчанию nodeJs использует заполнение PKCS, поэтому мне пришлось установить автоматическое заполнение на false с помощью decipher.setAutoPadding(false);

Это решило первую ошибку

Во-вторых, я использовал crypto.createDecipher(ALGORITHM, ENCRYPTION_KEY), который обрабатывает ключ перед его использованием. Чтобы решить эту проблему, я изменил функцию на crypto.createDecipheriv(ALGORITHM, ENCRYPTION_KEY, null)

Это приводило меня к ошибке, поскольку мы не можем передать null вместо значения IV.

Поскольку ECB не требует никакого IV, и мы не можем передать значение NULL вместо IV. Мне пришлось установить значение IV для этого Buffer.alloc(0)

. Этот код работал для меня

function Decrypt_AES() {

    const ALGORITHM = 'aes-128-ecb';
    const key = "1234";
    const ENCRYPTION_KEY = key;

    var IV = Buffer.alloc(0);
    var decipher = crypto.createDecipheriv(ALGORITHM, ENCRYPTION_KEY, IV);
    decipher.setAutoPadding(false);
    var input = fs.createReadStream('test.enc');
    var output = fs.createWriteStream('test_copy.xls');

    input.pipe(decipher).pipe(output);

    output.on('finish', function () {
        console.log('Decrypted file written to disk!');
    });
    output.on('error', function (e) {
        console.log(e);
     });

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...