· 7 years ago · Jun 04, 2018, 02:18 PM
1import javax.crypto.Cipher;
2import javax.crypto.SecretKey;
3import javax.crypto.spec.IvParameterSpec;
4import javax.crypto.spec.SecretKeySpec;
5import java.io.File;
6import java.io.FileInputStream;
7import java.io.FileOutputStream;
8
9public class Test {
10 private SecretKey secretKey;
11 private IvParameterSpec ivParameterSpec;
12
13 private String key = "ThisIsMyGreatKey";
14 private byte[] ivKey = "ABCDEFGHabcdefgh".getBytes();
15
16 public static void main(String[] args) {
17 try {
18 new Test().run();
19 } catch (Exception e) {
20 e.printStackTrace();
21 }
22 }
23
24 private void run() {
25 ivParameterSpec = new IvParameterSpec(ivKey);
26 secretKey = new SecretKeySpec(key.getBytes(), "AES");
27 encryptOrDecryptFile(Cipher.ENCRYPT_MODE,
28 new File("src/cactus.jpg"), new File("src/cactus-encrypted.jpg"));
29 }
30
31 private void encryptOrDecryptFile(int mode, File inputFile, File outputFile) {
32 try {
33 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
34 cipher.init(mode, secretKey, ivParameterSpec);
35
36 // Read input
37 byte[] input = new byte[(int) inputFile.length()];
38 FileInputStream inputStream = new FileInputStream(inputFile);
39 inputStream.read(input);
40
41 // Encrypt and write to output
42 byte[] output = cipher.doFinal(input);
43 FileOutputStream outputStream = new FileOutputStream(outputFile);
44 outputStream.write(output);
45
46 inputStream.close();
47 outputStream.close();
48 } catch (Exception e) {
49 e.printStackTrace();
50 }
51 }
52}
53
54<input type="file" id="file-input" onchange="handleFile(this)">
55<button onclick="useEncryptionForFile()" id="encrypt-file">Encrypt File</button>
56<button onclick="useDecryptionForFile()" id="decrypt-file">Decrypt File</button>
57<textarea id="output"></textarea>
58<img id="example">
59
60<script>
61 let key = "ThisIsMyGreatKey";
62 let iv = "ABCDEFGHabcdefgh";
63 let useEncryption, useDecryption;
64
65 let input = document.getElementById("file-input");
66 let output = document.getElementById("output");
67 let example = document.getElementById("example");
68
69 function handleFile(element) {
70 if (element.files && element.files[0]) {
71 let file = element.files[0];
72 if (useDecryption) {
73 decryptFile(file);
74 } else {
75 encryptFile(file);
76 }
77 }
78 }
79
80 function encryptFile(file) {
81 let reader = new FileReader();
82
83 reader.onload = function (e) {
84 let encrypted = CryptoJS.AES.encrypt(e.target.result, CryptoJS.enc.Utf8.parse(key), {
85 iv: CryptoJS.enc.Utf8.parse(iv),
86 mode: CryptoJS.mode.CBC,
87 padding: CryptoJS.pad.Pkcs7
88 });
89
90 output.textContent = encrypted;
91
92 let a = document.createElement("a");
93 a.setAttribute('href', 'data:application/octet-stream,' + encrypted);
94 a.setAttribute('download', file.name + '.encrypted');
95 a.click();
96 };
97
98 reader.readAsDataURL(file);
99 }
100
101 function decryptFile(file) {
102 let reader = new FileReader();
103 reader.onload = function (e) {
104 let decrypted = CryptoJS.AES.decrypt(e.target.result, CryptoJS.enc.Utf8.parse(key), {
105 iv: CryptoJS.enc.Utf8.parse(iv),
106 mode: CryptoJS.mode.CBC,
107 padding: CryptoJS.pad.Pkcs7
108 });
109
110 // Decrypted is emtpy
111 output.textContent = decrypted;
112
113 // Desperate try to get something working
114 example.src = "data:image/png;base64," + btoa(decrypted);
115
116 let a = document.createElement("a");
117 a.setAttribute('href', decrypted);
118 a.setAttribute('download', file.name.replace('encrypted', 'decrypted'));
119 a.click();
120 };
121
122 reader.readAsText(file);
123 }
124
125 function useEncryptionForFile() {
126 document.getElementById("encrypt-file").style.backgroundColor = "#757575";
127 document.getElementById("decrypt-file").style.backgroundColor = "#FFFFFF";
128 useEncryption = true;
129 useDecryption = false;
130 }
131
132 function useDecryptionForFile() {
133 document.getElementById("encrypt-file").style.backgroundColor = "#FFFFFF";
134 document.getElementById("decrypt-file").style.backgroundColor = "#757575";
135 useDecryption = true;
136 useEncryption = false;
137 }
138</script>
139
140let decrypted = CryptoJS.AES.decrypt(e.target.result, CryptoJS.enc.Utf8.parse(key), {
141 iv: CryptoJS.enc.Utf8.parse(iv),
142 mode: CryptoJS.mode.CBC,
143 padding: CryptoJS.pad.Pkcs7
144});