猿问

在 Javascript 中加密并在 Java 中解密 Zip 文件

我想用javascript加密本地zip文件,然后用java解密。


我使用了此链接中的代码https://www.devglan.com/corejava/aes-encryption-javascript-and-decryption-in-java


在javascript中加密


var AesUtil = function (keySize, iterationCount) {

    this.keySize = keySize / 32;

    this.iterationCount = iterationCount;

};


AesUtil.prototype.generateKey = function (salt, passPhrase) {

    var key = CryptoJS.PBKDF2(

        passPhrase,

        CryptoJS.enc.Hex.parse(salt),

        {keySize: this.keySize, iterations: this.iterationCount});

    return key;

};


AesUtil.prototype.encrypt = function (salt, iv, passPhrase, plainText) {

    var key = this.generateKey(salt, passPhrase);

    var encrypted = CryptoJS.AES.encrypt(

        plainText,

        key,

        {iv: CryptoJS.enc.Hex.parse(iv)});

    return encrypted.ciphertext.toString(CryptoJS.enc.Base64);

};


AesUtil.prototype.decrypt = function (salt, iv, passPhrase, cipherText) {

    var key = this.generateKey(salt, passPhrase);

    var cipherParams = CryptoJS.lib.CipherParams.create({

        ciphertext: CryptoJS.enc.Base64.parse(cipherText)

    });

    var decrypted = CryptoJS.AES.decrypt(

        cipherParams,

        key,

        {iv: CryptoJS.enc.Hex.parse(iv)});

    return decrypted.toString(CryptoJS.enc.Utf8);



};


var CryptoJS = require('crypto-js'),

    fs = require('fs');


var data = fs.readFileSync("C:\\<my_path>\\scripts.zip");


var passPhrase = "123456789123456789";

var iv = "a145525c53eafb0258999612b13d9d3e"; //CryptoJS.lib.WordArray.random(128 / 8).toString(CryptoJS.enc.Hex);

var salt = "ca70e17a698096cfb42047926713dd62";// CryptoJS.lib.WordArray.random(128 / 8).toString(CryptoJS.enc.Hex);


var aesUtil = new AesUtil(128, 1000);

var ciphertext = aesUtil.encrypt(salt, iv, passPhrase, data.toString());


fs.writeFileSync('C:/Output.encrypted', ciphertext);


GCT1015
浏览 277回答 1
1回答

萧十郎

在大多数语言中,将 Zip 文件之类的二进制内容视为字符串通常是一个大错误。在 Javascript 方面,CryptoJS 期望提供任意字节序列作为CryptoJS.lib.WordArray参数。所以,而不是var ciphertext = aesUtil.encrypt(salt, iv, passPhrase, data.toString());你应该有var ciphertext = aesUtil.encrypt(salt, iv, passPhrase, CryptoJS.lib.WordArray.create(data));在 Java 端,将函数 decrypt 更改为返回一个byte[].public byte[] decrypt(String salt, String iv, String passphrase, String ciphertext) {&nbsp; &nbsp; SecretKey key = generateKey(salt, passphrase);&nbsp; &nbsp; byte[] decrypted = doFinal(Cipher.DECRYPT_MODE, key, iv, base64(ciphertext));&nbsp; &nbsp; return decrypted;}在 中main,将代码更改为类似于String fileString = new String(Files.readAllBytes(Paths.get(encryptedPath)));byte [] decryptedText = aesUtil.decrypt(salt, iv, keyString, fileString);Files.write(Paths.get(decryptedPath), decryptedText);
随时随地看视频慕课网APP

相关分类

Java
我要回答