AES復号化NodeJs内のファイル

アミールサリーム:

私は、Windowsオペレーティングシステム上でExcelファイルのAES暗号化を行うJavaコードを持っています。私はNodeJSを使ってMacOSのオペレーティングシステム上で同じファイルを復号化します。私は私に次のエラーを与えている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);
});

}

テリー・レノックス:

私は、暗号化と復号化ファイルするJavaおよびNode.jsの両方でいくつかの例を作成しました。コードは、ノード・コードは、Java、およびその逆の出力を復号化するであろうと言うことである、長く同じキーおよびIV値が使用されるように互換性があります。

今、私はここで、入力としてテキストファイルを使用していますが、あなたは、入力として任意のファイルタイプを使用することができます。

私はECBモードで128ビットのAESを使用するように更新しました。

それは長い128ビットでなければならないので、私は下に与えられたキー(16のバイト/ 128ビット)を使用しましたので、主は、「1234」にすることはできません。

ジャワ

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");

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=375109&siteId=1