РЕДАКТИРОВАТЬ 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
});
РЕДАКТИРОВАТЬ 2 Ссылка , указанная в разделе комментариев, частично решает проблему.Он зашифровывает и дешифрует кроссплатформенность, но он довольно медленный из-за PBKDF2 с хэшированием SHA256.Я не могу найти способ использовать только часть AES, а не часть PKBDF2.
ОРИГИНАЛЬНЫЙ ТЕКСТ
Я использую один и тот же ключ и IV для версий Java и Javascript.Я не могу расшифровать файл в Javascript, который был зашифрован в Java, и я не могу расшифровать файл в Java, который был зашифрован в Javascript.Мне нужно, чтобы эти два были совместимы друг с другом, но я не могу понять, как я пытаюсь расшифровать файл в Javascript, который был ранее зашифрован в Java.Я успешно реализовал дешифрование и шифрование текста между ними, но когда мне нужно, например, расшифровать файл, зашифрованный на 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 можетбыть скачано здесь .
В исходном коде Java я использовал cactus.jpg в качестве файла, но можно использовать любой файл :).Кактус можно найти здесь .
Как мне расшифровать файл, зашифрованный на Java?Я попытался преобразовать содержимое BLOB-объекта в String, получить данные как ArrayBuffer и преобразовать их в String, получить их в виде текста и передать в метод расшифровки, но, похоже, ничего не работает.
Библиотека, которую я используюв Javascript есть CryptoJS , а в Java стандартные библиотеки Crypto.
Я нашел другие похожие ( 1 , 2 ) вопросы.Тем не менее, я думаю, что они слишком сильно различаются, поскольку ответ на эти вопросы касается не этой проблемы, а скорее маленькой ошибки.
Если я забыл какие-либо данные, пожалуйста, сообщите мне.