为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

GCT1015 2022-12-28 11:04:36
我想用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);
查看完整描述

1 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

在大多数语言中,将 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) {

    SecretKey key = generateKey(salt, passphrase);

    byte[] decrypted = doFinal(Cipher.DECRYPT_MODE, key, iv, base64(ciphertext));

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


查看完整回答
反对 回复 2022-12-28
  • 1 回答
  • 0 关注
  • 206 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号