gpt4 book ai didi

javascript - Java 和 Javascript 之间的加密和解密将不起作用

转载 作者:太空狗 更新时间:2023-10-29 22:47:30 25 4
gpt4 key购买 nike

编辑 1

在decryptFile方法中,解密部分不会输出任何东西..

let decrypted = CryptoJS.AES.decrypt(e.target.result, CryptoJS.enc.Utf8.parse(key), {
iv: CryptoJS.enc.Utf8.parse(iv),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});


编辑 2link评论部分给出的部分解决了问题。它确实跨平台加密和解密,但由于 PBKDF2 和 SHA256 哈希,它相当慢。我找不到只使用 AES 部分而不使用 PKBDF2 部分的方法。


原文

我对 Java 和 Javascript 版本使用相同的 key 和 IV。我无法解密已用 Java 加密的 Javascript 文件,也无法解密已用 Javascript 加密的 Java 文件。我需要这两个相互兼容,但我不知道如何我正在尝试解密以前用 Java 加密的 Javascript 文件。我已经成功地实现了两者之间的解密和加密文本,但是当我想解密一个用 Java 加密的文件时,它就无法工作。

用 Java 加密/解密文件:

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Test {
private SecretKey secretKey;
private IvParameterSpec ivParameterSpec;

private String key = "ThisIsMyGreatKey";
private byte[] ivKey = "ABCDEFGHabcdefgh".getBytes();

public static void main(String[] args) {
try {
new Test().run();
} catch (Exception e) {
e.printStackTrace();
}
}

private void run() {
ivParameterSpec = new IvParameterSpec(ivKey);
secretKey = new SecretKeySpec(key.getBytes(), "AES");
encryptOrDecryptFile(Cipher.ENCRYPT_MODE,
new File("src/cactus.jpg"), new File("src/cactus-encrypted.jpg"));
}

private void encryptOrDecryptFile(int mode, File inputFile, File outputFile) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(mode, secretKey, ivParameterSpec);

// Read input
byte[] input = new byte[(int) inputFile.length()];
FileInputStream inputStream = new FileInputStream(inputFile);
inputStream.read(input);

// Encrypt and write to output
byte[] output = cipher.doFinal(input);
FileOutputStream outputStream = new FileOutputStream(outputFile);
outputStream.write(output);

inputStream.close();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

在 Javascript 中加密/解密

<input type="file" id="file-input" onchange="handleFile(this)">
<button onclick="useEncryptionForFile()" id="encrypt-file">Encrypt File</button>
<button onclick="useDecryptionForFile()" id="decrypt-file">Decrypt File</button>
<textarea id="output"></textarea>
<img id="example">

<script>
let key = "ThisIsMyGreatKey";
let iv = "ABCDEFGHabcdefgh";
let useEncryption, useDecryption;

let input = document.getElementById("file-input");
let output = document.getElementById("output");
let example = document.getElementById("example");

function handleFile(element) {
if (element.files && element.files[0]) {
let file = element.files[0];
if (useDecryption) {
decryptFile(file);
} else {
encryptFile(file);
}
}
}

function encryptFile(file) {
let reader = new FileReader();

reader.onload = function (e) {
let encrypted = CryptoJS.AES.encrypt(e.target.result, CryptoJS.enc.Utf8.parse(key), {
iv: CryptoJS.enc.Utf8.parse(iv),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});

output.textContent = encrypted;

let a = document.createElement("a");
a.setAttribute('href', 'data:application/octet-stream,' + encrypted);
a.setAttribute('download', file.name + '.encrypted');
a.click();
};

reader.readAsDataURL(file);
}

function decryptFile(file) {
let reader = new FileReader();
reader.onload = function (e) {
let decrypted = CryptoJS.AES.decrypt(e.target.result, CryptoJS.enc.Utf8.parse(key), {
iv: CryptoJS.enc.Utf8.parse(iv),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});

// Decrypted is emtpy
output.textContent = decrypted;

// Desperate try to get something working
example.src = "data:image/png;base64," + btoa(decrypted);

let a = document.createElement("a");
a.setAttribute('href', decrypted);
a.setAttribute('download', file.name.replace('encrypted', 'decrypted'));
a.click();
};

reader.readAsText(file);
}

function useEncryptionForFile() {
document.getElementById("encrypt-file").style.backgroundColor = "#757575";
document.getElementById("decrypt-file").style.backgroundColor = "#FFFFFF";
useEncryption = true;
useDecryption = false;
}

function useDecryptionForFile() {
document.getElementById("encrypt-file").style.backgroundColor = "#FFFFFF";
document.getElementById("decrypt-file").style.backgroundColor = "#757575";
useDecryption = true;
useEncryption = false;
}
</script>

我还做了一个Fiddle如果您更喜欢 :),Java 源代码可以是 downloaded here .

在 Java 源代码中,我使用 cactus.jpg 作为文件,但可以使用任何文件 :)。仙人掌可以找到here .

Java加密后的文件如何解密?我已尝试将 blob 内容转换为字符串,将数据检索为 ArrayBuffer 并将其转换为字符串,将其作为文本接收并将其传递给解密方法,但似乎没有任何效果。

我在 Javascript 中使用的库是 CryptoJS ,以及 Java 中的标准加密库。

我发现了其他类似的( 1 , 2 )问题。但是,我认为它们相差太多,因为这些问题的答案与这个问题无关,而是一个小错误。

如果我忘记了任何数据,请告诉我。

最佳答案

问题是您将解密结果解释为 UTF8 字符串。这不是它的工作原理。文件只是任意字节,它们不一定组成 UTF8 字符串。如果您只是不尝试将其解释为 UTF8,那么您的解密结果是正确的。

关于javascript - Java 和 Javascript 之间的加密和解密将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50439315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com