· 6 years ago · Feb 26, 2019, 10:32 PM
1import java.io.FileInputStream;
2import java.io.File;
3import java.io.FileOutputStream;
4import java.io.InputStream;
5import java.security.*;
6import javax.crypto.*;
7import javax.crypto.spec.IvParameterSpec;
8import javax.crypto.spec.SecretKeySpec;
9
10public class Main {
11
12 FileInputStream fis; //file stream for encrypted file
13 FileOutputStream fos; //file outputstream for decrypted file
14 SecretKey theKey; //
15 Key key;
16 byte[] message; //bytestream for text in encrypted file
17 byte[] encKey1; //for key one
18 byte[] iv; //for initial vector
19 byte[] encKey2; //For key one
20 byte[] decKey2; //decrypted key 2
21 byte[] decKey1; //decrypted key 1
22 byte[] decIv; //decrypted initial vector
23 private FileOutputStream fos2;
24
25
26 public static void main(String[] args) {
27 // TODO Auto-generated method stub
28 Main main = new Main();
29 main.readEncryptionFile(); //method to read encrypted file
30 main.loadkey(); //method to get key from key storage
31 main.decryptKeys(); //method to get decrypted keys and iv
32 main.decryptText(); //get decrypted text and output it to file
33 }
34
35 public void readEncryptionFile() {
36 //the encrypted file is separated in 4 sectors
37 //the three sectors are keys and the iv
38 encKey1=new byte[128];
39 iv= new byte[128];
40 encKey2= new byte[128];
41 message = new byte[1424]; //the text that is encrypted
42 File f = new File("ciphertext.enc"); //get encrypted file
43 System.out.println(f.length()); //print out file size in bytes
44 try {
45 fis = new FileInputStream(f);
46 fis.read(encKey1); //read 128 bytes, set it to encKey1
47 System.out.println(encKey1.toString());
48 fis.read(iv); //read 128 bytes, set it to initial vector
49 System.out.println(iv.toString());
50 fis.read(encKey2); //read 128 bytes, set it to encKey2
51 System.out.println(encKey2.toString());
52 fis.read(message); //read rest of bytes to message
53 System.out.println(message.toString());
54 } catch (Exception e) {
55 // TODO Auto-generated catch block
56 e.printStackTrace();
57 }
58 }
59 public void loadkey() {
60 String storePass = "lab1StorePass"; //password to storage
61 char[] storePassArray = storePass.toCharArray(); //convert string to char array
62 String keyPass = "lab1KeyPass"; //password to key
63 char[] keyPassArray = keyPass.toCharArray(); //convert string to char array
64 KeyStore ks;
65 try {
66 ks = KeyStore.getInstance("JKS"); //get storage of JKS type
67 InputStream readStream = new FileInputStream("lab1Store");
68 ks.load(readStream, storePassArray); //load storage
69 key = ks.getKey("lab1EncKeys", keyPassArray); //get key
70 System.out.println(key.getEncoded());
71 readStream.close(); //close inputStream
72 } catch (Exception e) {
73 // TODO Auto-generated catch block
74 e.printStackTrace();
75 }
76
77 }
78 public void decryptKeys() {
79 try {
80 Cipher cipher = Cipher.getInstance("RSA"); //cipher instance object of RSA
81 cipher.init(Cipher.DECRYPT_MODE, key); //decrypt with decryptmode and the key from storage
82 decKey1 = cipher.doFinal(encKey1); //decrypt key 1
83 decKey2 = cipher.doFinal(encKey2); //decrypt key 2
84 decIv = cipher.doFinal(iv); //decrypt initial vector
85 System.out.println(decKey1.toString());
86 } catch (Exception ex) {
87 ex.printStackTrace();
88 }
89 }
90
91 public void decryptText() {
92
93 try {
94 //get cipher object of type AES, provider CBC and PKCS5 padding
95 Cipher cipher2 = Cipher.getInstance("AES/CBC/PKCS5Padding");
96 //use SecretKeyspec to get key from bytearray with type AES
97 SecretKeySpec keySpec = new SecretKeySpec(decKey1, "AES");
98 //use IvParameterSPec to get iv from bytearray
99 IvParameterSpec ivspec= new IvParameterSpec(decIv);
100 cipher2.init(Cipher.DECRYPT_MODE, keySpec,ivspec);
101 //decrypt message with key and iv
102 byte [] message2 = cipher2.doFinal(message);
103 System.out.println(message2.toString());
104 //output byte array message to new file
105 File f = new File("plaintext2.txt");
106 fos2 = new FileOutputStream(f);
107 fos2.write(message2);
108 } catch (Exception e) {
109 // TODO Auto-generated catch block
110 e.printStackTrace();
111 }
112
113 }
114}