Showing
17 changed files
with
1107 additions
and
0 deletions
.gitignore
0 → 100644
1 | +/DLPonUSB/DLPonUSB.iml |
DLPonUSB/.idea/.gitignore
0 → 100644
DLPonUSB/.idea/misc.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<project version="4"> | ||
3 | + <component name="ProjectRootManager" version="2" languageLevel="JDK_14" project-jdk-name="14" project-jdk-type="JavaSDK"> | ||
4 | + <output url="file://$PROJECT_DIR$/out" /> | ||
5 | + </component> | ||
6 | +</project> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
DLPonUSB/.idea/modules.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<project version="4"> | ||
3 | + <component name="ProjectModuleManager"> | ||
4 | + <modules> | ||
5 | + <module fileurl="file://$PROJECT_DIR$/DLPonUSB.iml" filepath="$PROJECT_DIR$/DLPonUSB.iml" /> | ||
6 | + </modules> | ||
7 | + </component> | ||
8 | +</project> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
DLPonUSB/.idea/vcs.xml
0 → 100644
DLPonUSB/LICENSE
0 → 100644
1 | +MIT License | ||
2 | + | ||
3 | +Copyright (c) 2019 stephan-t | ||
4 | + | ||
5 | +Permission is hereby granted, free of charge, to any person obtaining a copy | ||
6 | +of this software and associated documentation files (the "Software"), to deal | ||
7 | +in the Software without restriction, including without limitation the rights | ||
8 | +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
9 | +copies of the Software, and to permit persons to whom the Software is | ||
10 | +furnished to do so, subject to the following conditions: | ||
11 | + | ||
12 | +The above copyright notice and this permission notice shall be included in all | ||
13 | +copies or substantial portions of the Software. | ||
14 | + | ||
15 | +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
16 | +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
17 | +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
18 | +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
19 | +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
20 | +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
21 | +SOFTWARE. |
DLPonUSB/README.md
0 → 100644
1 | +# Cryptor | ||
2 | + | ||
3 | +## Description | ||
4 | +Command-line tool for encrypting/decrypting files with the AES-256 block cipher operating in CBC mode. The secret key is derived from a user-provided password using the PBKDF2 key derivation function. The SHA-512 cryptographic hash function is used to generate an HMAC for password and data integrity verification. | ||
5 | + | ||
6 | +## Usage | ||
7 | +With command-line arguments: | ||
8 | + | ||
9 | +`java cryptor.Main -encrypt plaintext ciphertext password` | ||
10 | + | ||
11 | +`java cryptor.Main -decrypt ciphertext plaintext password` | ||
12 | + | ||
13 | +With command prompts: | ||
14 | + | ||
15 | +`java cryptor.Main` |
DLPonUSB/src/cryptor/Authenticator.java
0 → 100644
1 | +package cryptor; | ||
2 | + | ||
3 | +import javax.crypto.Mac; | ||
4 | +import javax.crypto.SecretKey; | ||
5 | +import java.io.IOException; | ||
6 | +import java.io.InputStream; | ||
7 | +import java.security.GeneralSecurityException; | ||
8 | +import java.util.Arrays; | ||
9 | + | ||
10 | +/** | ||
11 | + * Provides authenticated encryption/decryption using an MAC and secret key. | ||
12 | + * An Encrypt-then-MAC (EtM) approach is used, where the plaintext is encrypted | ||
13 | + * and an MAC is generated from the resulting ciphertext. | ||
14 | + */ | ||
15 | +class Authenticator { | ||
16 | + | ||
17 | + private static final String MAC_ALGORITHM = "HmacSHA512"; | ||
18 | + private static final int MAC_SIZE = 64; | ||
19 | + | ||
20 | + /** | ||
21 | + * Generates a MAC based on a given secret key and ciphertext. | ||
22 | + * @param key the secret key used in the hash algorithm. | ||
23 | + * @param bytes the ciphertext bytes used to generate a MAC. | ||
24 | + * @return the generated MAC bytes. | ||
25 | + */ | ||
26 | + static byte[] generateMac(SecretKey key, byte[] bytes) | ||
27 | + throws GeneralSecurityException { | ||
28 | + // Generate and prepend a MAC for authentication | ||
29 | + Mac mac = Mac.getInstance(MAC_ALGORITHM); | ||
30 | + mac.init(key); | ||
31 | + return mac.doFinal(bytes); | ||
32 | + } | ||
33 | + | ||
34 | + /** | ||
35 | + * Retrieves a prepended MAC from an input stream of bytes. | ||
36 | + * @param in the input stream to retrieve the MAC from. | ||
37 | + * @return the prepended MAC bytes. | ||
38 | + */ | ||
39 | + static byte[] getMac(InputStream in) throws IOException { | ||
40 | + return in.readNBytes(MAC_SIZE); | ||
41 | + } | ||
42 | + | ||
43 | + /** | ||
44 | + * | ||
45 | + * @param prepended the prepended MAC bytes from the ciphertext. | ||
46 | + * @param generated the generated MAC bytes from the ciphertext. | ||
47 | + * @return <code>true</code> if both MACs match; throws exception otherwise. | ||
48 | + * @throws GeneralSecurityException if there is a mismatch between the | ||
49 | + * prepended and generated MACs. | ||
50 | + */ | ||
51 | + static boolean verifyMAC(byte[] prepended, byte[] generated) | ||
52 | + throws GeneralSecurityException { | ||
53 | + if (Arrays.equals(prepended, generated)) { | ||
54 | + return true; | ||
55 | + } else { | ||
56 | + throw new GeneralSecurityException("Password is invalid" + | ||
57 | + " and/or data integrity check failed"); | ||
58 | + } | ||
59 | + } | ||
60 | +} |
DLPonUSB/src/cryptor/Cryptor.java
0 → 100644
1 | +package cryptor; | ||
2 | + | ||
3 | +import javax.crypto.Cipher; | ||
4 | +import javax.crypto.SecretKey; | ||
5 | +import javax.crypto.spec.IvParameterSpec; | ||
6 | +import java.io.*; | ||
7 | +import java.security.GeneralSecurityException; | ||
8 | +import java.security.SecureRandom; | ||
9 | + | ||
10 | +/** | ||
11 | + * Encrypts or decrypts a file using AES and a PBKDF2 derived cipher key. | ||
12 | + */ | ||
13 | +class Cryptor { | ||
14 | + | ||
15 | + private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; | ||
16 | + private static final int IV_SIZE = 16; | ||
17 | + | ||
18 | + /** | ||
19 | + * Encrypts an input file with password and writes to an output file | ||
20 | + * @param inFile the input plaintext file. | ||
21 | + * @param outFile the output ciphertext file. | ||
22 | + * @param password the password used for encryption. | ||
23 | + */ | ||
24 | + static void encrypt(String inFile, String outFile, char[] password) | ||
25 | + throws IOException, GeneralSecurityException { | ||
26 | + try (InputStream in = new FileInputStream(inFile); | ||
27 | + OutputStream out = new FileOutputStream(outFile)) { | ||
28 | + // Derive key from password | ||
29 | + SecretKey key = KeyGenerator.deriveKey(password, out); | ||
30 | + | ||
31 | + // Generate initialization vector and prepend to output | ||
32 | + SecureRandom random = new SecureRandom(); | ||
33 | + byte[] ivBytes = new byte[IV_SIZE]; | ||
34 | + random.nextBytes(ivBytes); | ||
35 | + IvParameterSpec iv = new IvParameterSpec(ivBytes); | ||
36 | + out.write(ivBytes); | ||
37 | + | ||
38 | + // Encrypt file | ||
39 | + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); | ||
40 | + cipher.init(Cipher.ENCRYPT_MODE, key, iv); | ||
41 | + byte[] outBytes = cipher.doFinal(in.readAllBytes()); | ||
42 | + | ||
43 | + // Generate and prepend a MAC | ||
44 | + byte[] macBytes = Authenticator.generateMac(key, outBytes); | ||
45 | + out.write(macBytes); | ||
46 | + | ||
47 | + out.write(outBytes); | ||
48 | + } | ||
49 | + } | ||
50 | + | ||
51 | + /** | ||
52 | + * Decrypts an input file with password and writes to an output file | ||
53 | + * @param fileIn the input ciphertext file. | ||
54 | + * @param fileOut the output plaintext file. | ||
55 | + * @param password the password used for decryption. | ||
56 | + */ | ||
57 | + static void decrypt(String fileIn, String fileOut, char[] password) | ||
58 | + throws IOException, GeneralSecurityException { | ||
59 | + try (InputStream in = new FileInputStream(fileIn)) { | ||
60 | + // Derive key from password | ||
61 | + SecretKey key = KeyGenerator.deriveKey(password, in); | ||
62 | + | ||
63 | + // Get prepended initialization vector from input | ||
64 | + byte[] ivBytes = in.readNBytes(IV_SIZE); | ||
65 | + IvParameterSpec iv = new IvParameterSpec(ivBytes); | ||
66 | + | ||
67 | + // Get prepended MAC from input | ||
68 | + byte[] tagMacBytes = Authenticator.getMac(in); | ||
69 | + | ||
70 | + // Generate MAC from ciphertext and compare with prepended MAC | ||
71 | + byte[] inBytes = in.readAllBytes(); | ||
72 | + byte[] genMacBytes = Authenticator.generateMac(key, inBytes); | ||
73 | + | ||
74 | + // Decrypt file if both MACs match | ||
75 | + if (Authenticator.verifyMAC(tagMacBytes, genMacBytes)) { | ||
76 | + try (OutputStream out = new FileOutputStream(fileOut)) { | ||
77 | + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); | ||
78 | + cipher.init(Cipher.DECRYPT_MODE, key, iv); | ||
79 | + byte[] outBytes = cipher.doFinal(inBytes); | ||
80 | + out.write(outBytes); | ||
81 | + } | ||
82 | + } | ||
83 | + } | ||
84 | + } | ||
85 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
DLPonUSB/src/cryptor/DecryptWindow.java
0 → 100644
1 | +package cryptor; | ||
2 | + | ||
3 | +import javax.swing.*; | ||
4 | +import javax.swing.filechooser.FileView; | ||
5 | +import java.awt.*; | ||
6 | +import java.awt.event.ActionEvent; | ||
7 | +import java.awt.event.ActionListener; | ||
8 | +import java.io.File; | ||
9 | +import java.io.FileNotFoundException; | ||
10 | +import java.io.FileOutputStream; | ||
11 | +import java.io.IOException; | ||
12 | +import java.security.GeneralSecurityException; | ||
13 | +import java.text.SimpleDateFormat; | ||
14 | +import java.util.Date; | ||
15 | + | ||
16 | +class DecryptWindow extends Frame { | ||
17 | + Label lpwd; | ||
18 | + | ||
19 | + Label lmod; | ||
20 | + | ||
21 | + TextField tfId; | ||
22 | + | ||
23 | + TextField tfPwd; | ||
24 | + | ||
25 | + TextField tfMod; | ||
26 | + | ||
27 | + Button ok; | ||
28 | + | ||
29 | + String fileIn; | ||
30 | + | ||
31 | + String fileName; | ||
32 | + | ||
33 | + String userId; | ||
34 | + | ||
35 | + String userPW; | ||
36 | + | ||
37 | + | ||
38 | + DecryptWindow(String title, String ID, String PW){ | ||
39 | + | ||
40 | + //Frame(String title)을 호출한다. | ||
41 | + | ||
42 | + super(title); | ||
43 | + | ||
44 | + userId = ID; | ||
45 | + userPW = PW; | ||
46 | + | ||
47 | + //Label의 text정렬을 오른쪽으로 | ||
48 | + String folderDir = ".\\" + userId + "\\Encrypted"; | ||
49 | + | ||
50 | + final File dirToLock = new File(folderDir); | ||
51 | + JFileChooser jfc = new JFileChooser(dirToLock); | ||
52 | + jfc.setFileView(new FileView() { | ||
53 | + @Override | ||
54 | + public Boolean isTraversable(File f) { | ||
55 | + return dirToLock.equals(f); | ||
56 | + } | ||
57 | + }); | ||
58 | + | ||
59 | + jfc.showOpenDialog(null); | ||
60 | + fileIn = jfc.getSelectedFile().getAbsolutePath(); | ||
61 | + fileName = jfc.getSelectedFile().getName(); | ||
62 | + | ||
63 | + lpwd = new Label("Enter password: ",Label.RIGHT); | ||
64 | + | ||
65 | + lmod = new Label("열람 목적: ",Label.RIGHT); | ||
66 | + | ||
67 | + | ||
68 | + //약 10개의 글자를 입력할 수 있는 TextField 생성. | ||
69 | + | ||
70 | + tfPwd = new TextField(10); | ||
71 | + | ||
72 | + tfMod = new TextField(10); | ||
73 | + //입력한 값 대신 '*'이 보이게 한다. | ||
74 | + | ||
75 | + | ||
76 | + | ||
77 | + ok = new Button("OK"); | ||
78 | + | ||
79 | + //OK버튼과 TextField에 이벤트처리를 위한 Listener를 추가해준다. | ||
80 | + | ||
81 | + tfPwd.addActionListener(new EventHandler()); | ||
82 | + | ||
83 | + tfMod.addActionListener(new EventHandler()); | ||
84 | + | ||
85 | + ok.addActionListener(new EventHandler()); | ||
86 | + | ||
87 | + | ||
88 | + | ||
89 | + //LayoutManager를 FlowLayout으로 | ||
90 | + | ||
91 | + setLayout(new FlowLayout()); | ||
92 | + | ||
93 | + //생성한 component들을 Frame에 포함시킨다. | ||
94 | + | ||
95 | + add(lpwd); | ||
96 | + | ||
97 | + add(tfPwd); | ||
98 | + | ||
99 | + add(lmod); | ||
100 | + | ||
101 | + add(tfMod); | ||
102 | + | ||
103 | + add(ok); | ||
104 | + | ||
105 | + setSize(450,65); | ||
106 | + | ||
107 | + //화면이 보이게 한다. | ||
108 | + | ||
109 | + setVisible(true); | ||
110 | + | ||
111 | + } | ||
112 | + | ||
113 | + public static void main(String args[]){ | ||
114 | + | ||
115 | + DecryptWindow f = new DecryptWindow("Login", "user1", "12345678"); | ||
116 | + | ||
117 | + } | ||
118 | + | ||
119 | + | ||
120 | + | ||
121 | + class EventHandler implements ActionListener{ | ||
122 | + | ||
123 | + public void actionPerformed(ActionEvent e){ | ||
124 | + | ||
125 | + //tfId에 입력되어있는 text를 얻어온다. | ||
126 | + | ||
127 | + dispose(); | ||
128 | + | ||
129 | + String passwd = userId + ' ' + tfPwd.getText(); | ||
130 | + char[] password = passwd.toCharArray(); | ||
131 | + String passwd2 = userId + ' ' + userPW; | ||
132 | + char[] password2 = passwd2.toCharArray(); | ||
133 | + | ||
134 | + String modeIn = tfMod.getText(); | ||
135 | + | ||
136 | + String dir = ".\\" + userId + "\\logs\\" + fileName + ".txt"; | ||
137 | + File file = new File(dir); | ||
138 | + file.getParentFile().mkdir(); | ||
139 | + try { | ||
140 | + file.createNewFile(); | ||
141 | + } catch (IOException ioException) { | ||
142 | + ioException.printStackTrace(); | ||
143 | + } | ||
144 | + | ||
145 | + dir = ".\\" + userId + "\\Decrypted\\" + fileName; | ||
146 | + file = new File(dir); | ||
147 | + file.getParentFile().mkdir(); | ||
148 | + | ||
149 | + try { | ||
150 | + Cryptor.decrypt(fileIn, dir, password); | ||
151 | + } catch (IOException ioException) { | ||
152 | + ioException.printStackTrace(); | ||
153 | + } catch (GeneralSecurityException generalSecurityException) { | ||
154 | + generalSecurityException.printStackTrace(); | ||
155 | + } | ||
156 | + | ||
157 | + dir = ".\\" + userId + "\\logs\\" + fileName + ".txt"; | ||
158 | + String dir2 = ".\\" + userId + "\\logs\\" + fileName + ".log"; | ||
159 | + try { | ||
160 | + Cryptor.decrypt(dir2, dir, password2); | ||
161 | + } catch (IOException ioException) { | ||
162 | + ioException.printStackTrace(); | ||
163 | + } catch (GeneralSecurityException generalSecurityException) { | ||
164 | + generalSecurityException.printStackTrace(); | ||
165 | + } | ||
166 | + | ||
167 | + FileOutputStream fos = null; | ||
168 | + try { | ||
169 | + fos = new FileOutputStream(dir,true); | ||
170 | + } catch (FileNotFoundException fileNotFoundException) { | ||
171 | + fileNotFoundException.printStackTrace(); | ||
172 | + } | ||
173 | + SimpleDateFormat format1 = new SimpleDateFormat( "yyyy-MM-dd HH:mm"); | ||
174 | + | ||
175 | + Date time = new Date(); | ||
176 | + | ||
177 | + String time1 = format1.format(time); | ||
178 | + String toWrite = "열람\t" + time1 + '\t' + modeIn + '\n'; | ||
179 | + byte[] b = toWrite.getBytes(); | ||
180 | + try { | ||
181 | + fos.write(b); | ||
182 | + } catch (IOException ioException) { | ||
183 | + ioException.printStackTrace(); | ||
184 | + } | ||
185 | + try { | ||
186 | + fos.flush(); | ||
187 | + } catch (IOException ioException) { | ||
188 | + ioException.printStackTrace(); | ||
189 | + } | ||
190 | + try { | ||
191 | + fos.close(); | ||
192 | + } catch (IOException ioException) { | ||
193 | + ioException.printStackTrace(); | ||
194 | + } | ||
195 | + | ||
196 | + try { | ||
197 | + Cryptor.encrypt(dir, dir2, password2); | ||
198 | + } catch (IOException ioException) { | ||
199 | + ioException.printStackTrace(); | ||
200 | + } catch (GeneralSecurityException generalSecurityException) { | ||
201 | + generalSecurityException.printStackTrace(); | ||
202 | + } | ||
203 | + | ||
204 | + file = new File(dir); | ||
205 | + file.delete(); | ||
206 | + | ||
207 | + String folderDir = ".\\" + userId + "\\Decrypted"; | ||
208 | + | ||
209 | + final File dirToLock = new File(folderDir); | ||
210 | + JFileChooser jfc = new JFileChooser(dirToLock); | ||
211 | + jfc.setFileView(new FileView() { | ||
212 | + @Override | ||
213 | + public Boolean isTraversable(File f) { | ||
214 | + return dirToLock.equals(f); | ||
215 | + } | ||
216 | + }); | ||
217 | + | ||
218 | + jfc.showOpenDialog(null); | ||
219 | + fileIn = jfc.getSelectedFile().getAbsolutePath(); | ||
220 | + file = new File(fileIn); | ||
221 | + | ||
222 | + try { | ||
223 | + Desktop.getDesktop().open(file); | ||
224 | + } catch (IOException ioException) { | ||
225 | + ioException.printStackTrace(); | ||
226 | + } | ||
227 | + } | ||
228 | + | ||
229 | + } | ||
230 | + | ||
231 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
DLPonUSB/src/cryptor/DeleteEncypted.java
0 → 100644
1 | +package cryptor; | ||
2 | + | ||
3 | +import javax.swing.*; | ||
4 | +import javax.swing.filechooser.FileView; | ||
5 | +import java.awt.*; | ||
6 | +import java.awt.event.ActionEvent; | ||
7 | +import java.awt.event.ActionListener; | ||
8 | +import java.io.File; | ||
9 | +import java.io.IOException; | ||
10 | +import java.security.GeneralSecurityException; | ||
11 | + | ||
12 | +class DeleteEncypted extends Frame { | ||
13 | + | ||
14 | + String fileIn; | ||
15 | + | ||
16 | + String fileName; | ||
17 | + | ||
18 | + String userId; | ||
19 | + | ||
20 | + String userPW; | ||
21 | + | ||
22 | + | ||
23 | + DeleteEncypted(String title, String ID, String PW){ | ||
24 | + | ||
25 | + //Frame(String title)을 호출한다. | ||
26 | + | ||
27 | + super(title); | ||
28 | + | ||
29 | + userId = ID; | ||
30 | + userPW = PW; | ||
31 | + | ||
32 | + //Label의 text정렬을 오른쪽으로 | ||
33 | + String folderDir = ".\\" + userId + "\\Encrypted"; | ||
34 | + | ||
35 | + final File dirToLock = new File(folderDir); | ||
36 | + JFileChooser jfc = new JFileChooser(dirToLock); | ||
37 | + jfc.setFileView(new FileView() { | ||
38 | + @Override | ||
39 | + public Boolean isTraversable(File f) { | ||
40 | + return dirToLock.equals(f); | ||
41 | + } | ||
42 | + }); | ||
43 | + | ||
44 | + jfc.showOpenDialog(null); | ||
45 | + fileIn = jfc.getSelectedFile().getAbsolutePath(); | ||
46 | + | ||
47 | + File file = new File(fileIn); | ||
48 | + | ||
49 | + if(file.exists()) | ||
50 | + { | ||
51 | + file.deleteOnExit(); | ||
52 | + } | ||
53 | + } | ||
54 | + | ||
55 | + public static void main(String args[]){ | ||
56 | + | ||
57 | + DeleteEncypted f = new DeleteEncypted("Login", "user1", "12345678"); | ||
58 | + | ||
59 | + } | ||
60 | + | ||
61 | + | ||
62 | + | ||
63 | + class EventHandler implements ActionListener{ | ||
64 | + | ||
65 | + public void actionPerformed(ActionEvent e){ | ||
66 | + dispose(); | ||
67 | + } | ||
68 | + | ||
69 | + } | ||
70 | + | ||
71 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
DLPonUSB/src/cryptor/EncryptWindow.java
0 → 100644
1 | +package cryptor; | ||
2 | + | ||
3 | +import javax.swing.*; | ||
4 | +import java.awt.*; | ||
5 | +import java.awt.event.*; | ||
6 | +import java.io.*; | ||
7 | +import java.security.GeneralSecurityException; | ||
8 | +import java.text.SimpleDateFormat; | ||
9 | +import java.util.Date; | ||
10 | + | ||
11 | +class EncryptWindow extends Frame { | ||
12 | + | ||
13 | + Label lid; | ||
14 | + | ||
15 | + Label lpwd; | ||
16 | + | ||
17 | + Label lmod; | ||
18 | + | ||
19 | + TextField tfId; | ||
20 | + | ||
21 | + TextField tfPwd; | ||
22 | + | ||
23 | + TextField tfMod; | ||
24 | + | ||
25 | + Button ok; | ||
26 | + | ||
27 | + String fileIn; | ||
28 | + | ||
29 | + String fileName; | ||
30 | + | ||
31 | + String userId; | ||
32 | + | ||
33 | + String userPW; | ||
34 | + | ||
35 | + | ||
36 | + EncryptWindow(String title, String ID, String PW){ | ||
37 | + | ||
38 | + //Frame(String title)을 호출한다. | ||
39 | + | ||
40 | + super(title); | ||
41 | + | ||
42 | + userId = ID; | ||
43 | + userPW = PW; | ||
44 | + | ||
45 | + //Label의 text정렬을 오른쪽으로 | ||
46 | + JFileChooser jfc = new JFileChooser(); | ||
47 | + | ||
48 | + jfc.showOpenDialog(null); | ||
49 | + fileIn = jfc.getSelectedFile().getAbsolutePath(); | ||
50 | + fileName = jfc.getSelectedFile().getName(); | ||
51 | + | ||
52 | + lpwd = new Label("Enter password: ",Label.RIGHT); | ||
53 | + | ||
54 | + lmod = new Label("사용 목적: ",Label.RIGHT); | ||
55 | + | ||
56 | + | ||
57 | + //약 10개의 글자를 입력할 수 있는 TextField 생성. | ||
58 | + | ||
59 | + tfPwd = new TextField(10); | ||
60 | + | ||
61 | + tfMod = new TextField(10); | ||
62 | + //입력한 값 대신 '*'이 보이게 한다. | ||
63 | + | ||
64 | + | ||
65 | + | ||
66 | + ok = new Button("OK"); | ||
67 | + | ||
68 | + //OK버튼과 TextField에 이벤트처리를 위한 Listener를 추가해준다. | ||
69 | + | ||
70 | + tfPwd.addActionListener(new EventHandler()); | ||
71 | + | ||
72 | + tfMod.addActionListener(new EventHandler()); | ||
73 | + | ||
74 | + ok.addActionListener(new EventHandler()); | ||
75 | + | ||
76 | + | ||
77 | + | ||
78 | + //LayoutManager를 FlowLayout으로 | ||
79 | + | ||
80 | + setLayout(new FlowLayout()); | ||
81 | + | ||
82 | + //생성한 component들을 Frame에 포함시킨다. | ||
83 | + add(lpwd); | ||
84 | + | ||
85 | + add(tfPwd); | ||
86 | + | ||
87 | + add(lmod); | ||
88 | + | ||
89 | + add(tfMod); | ||
90 | + | ||
91 | + add(ok); | ||
92 | + | ||
93 | + setSize(450,65); | ||
94 | + | ||
95 | + //화면이 보이게 한다. | ||
96 | + | ||
97 | + setVisible(true); | ||
98 | + | ||
99 | + } | ||
100 | + | ||
101 | + public static void main(String args[]){ | ||
102 | + | ||
103 | + EncryptWindow f = new EncryptWindow("Login", "user1", "12345678"); | ||
104 | + | ||
105 | + } | ||
106 | + | ||
107 | + | ||
108 | + | ||
109 | + class EventHandler implements ActionListener{ | ||
110 | + | ||
111 | + public void actionPerformed(ActionEvent e){ | ||
112 | + | ||
113 | + dispose(); | ||
114 | + | ||
115 | + String passwd = userId + ' ' + tfPwd.getText(); | ||
116 | + char[] password = passwd.toCharArray(); | ||
117 | + String passwd2 = userId + ' ' + userPW; | ||
118 | + char[] password2 = passwd2.toCharArray(); | ||
119 | + | ||
120 | + String modeIn = tfMod.getText(); | ||
121 | + | ||
122 | + String dir = ".\\" + userId + "\\logs\\" + fileName + ".txt"; | ||
123 | + String dir2 = ".\\" + userId + "\\logs\\" + fileName + ".log"; | ||
124 | + File f = new File(dir2); | ||
125 | + if(f.exists()) | ||
126 | + { | ||
127 | + try { | ||
128 | + Cryptor.decrypt(dir2, dir, password2); | ||
129 | + } catch (IOException ioException) { | ||
130 | + ioException.printStackTrace(); | ||
131 | + } catch (GeneralSecurityException generalSecurityException) { | ||
132 | + generalSecurityException.printStackTrace(); | ||
133 | + } | ||
134 | + } | ||
135 | + | ||
136 | + File file = new File(dir); | ||
137 | + file.getParentFile().getParentFile().mkdir(); | ||
138 | + file.getParentFile().mkdir(); | ||
139 | + try { | ||
140 | + file.createNewFile(); | ||
141 | + } catch (IOException ioException) { | ||
142 | + ioException.printStackTrace(); | ||
143 | + } | ||
144 | + | ||
145 | + dir = ".\\" + userId + "\\Encrypted\\" + fileName; | ||
146 | + file = new File(dir); | ||
147 | + file.getParentFile().mkdir(); | ||
148 | + | ||
149 | + try { | ||
150 | + Cryptor.encrypt(fileIn, dir, password); | ||
151 | + } catch (IOException ioException) { | ||
152 | + ioException.printStackTrace(); | ||
153 | + } catch (GeneralSecurityException generalSecurityException) { | ||
154 | + generalSecurityException.printStackTrace(); | ||
155 | + } | ||
156 | + | ||
157 | + dir = ".\\" + userId + "\\logs\\" + fileName + ".txt"; | ||
158 | + FileOutputStream fos = null; | ||
159 | + try { | ||
160 | + fos = new FileOutputStream(dir,true); | ||
161 | + } catch (FileNotFoundException fileNotFoundException) { | ||
162 | + fileNotFoundException.printStackTrace(); | ||
163 | + } | ||
164 | + SimpleDateFormat format1 = new SimpleDateFormat( "yyyy-MM-dd HH:mm"); | ||
165 | + | ||
166 | + Date time = new Date(); | ||
167 | + | ||
168 | + String time1 = format1.format(time); | ||
169 | + String toWrite = "등록\t" + time1 + '\t' + modeIn + '\n'; | ||
170 | + byte[] b = toWrite.getBytes(); | ||
171 | + try { | ||
172 | + fos.write(b); | ||
173 | + } catch (IOException ioException) { | ||
174 | + ioException.printStackTrace(); | ||
175 | + } | ||
176 | + try { | ||
177 | + fos.flush(); | ||
178 | + } catch (IOException ioException) { | ||
179 | + ioException.printStackTrace(); | ||
180 | + } | ||
181 | + try { | ||
182 | + fos.close(); | ||
183 | + } catch (IOException ioException) { | ||
184 | + ioException.printStackTrace(); | ||
185 | + } | ||
186 | + | ||
187 | + try { | ||
188 | + Cryptor.encrypt(dir, dir2, password2); | ||
189 | + } catch (IOException ioException) { | ||
190 | + ioException.printStackTrace(); | ||
191 | + } catch (GeneralSecurityException generalSecurityException) { | ||
192 | + generalSecurityException.printStackTrace(); | ||
193 | + } | ||
194 | + | ||
195 | + file = new File(dir); | ||
196 | + file.delete(); | ||
197 | + } | ||
198 | + } | ||
199 | + | ||
200 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
DLPonUSB/src/cryptor/KeyGenerator.java
0 → 100644
1 | +package cryptor; | ||
2 | + | ||
3 | +import javax.crypto.SecretKey; | ||
4 | +import javax.crypto.SecretKeyFactory; | ||
5 | +import javax.crypto.spec.PBEKeySpec; | ||
6 | +import javax.crypto.spec.SecretKeySpec; | ||
7 | +import java.io.IOException; | ||
8 | +import java.io.InputStream; | ||
9 | +import java.io.OutputStream; | ||
10 | +import java.security.GeneralSecurityException; | ||
11 | +import java.security.SecureRandom; | ||
12 | +import java.security.spec.KeySpec; | ||
13 | + | ||
14 | +/** | ||
15 | + * Generates a PBKDF2 derived key for use in a cipher or hash algorithm. | ||
16 | + */ | ||
17 | +class KeyGenerator { | ||
18 | + | ||
19 | + private static final String KEY_ALGORITHM = "PBKDF2WithHmacSHA512"; | ||
20 | + private static final String CIPHER_ALGORITHM = "AES"; | ||
21 | + private static final int SALT_SIZE = 16; | ||
22 | + private static final int ITERATIONS = 10000; | ||
23 | + private static final int KEY_SIZE = 256; | ||
24 | + | ||
25 | + /** | ||
26 | + * Derives a key from the provided password using PBKDF2 | ||
27 | + * @param password the password to derive a key from. | ||
28 | + * @param stream the stream used to prepend or retrieve the salt. | ||
29 | + * An <code>InputStream</code> is used for decryption, while an | ||
30 | + * <code>OutputStream</code> is used for encryption. | ||
31 | + * @return the password derived key. | ||
32 | + * @throws IOException if the salt has not been fully read. | ||
33 | + * @throws GeneralSecurityException if <code>stream</code> is not of type | ||
34 | + * <code>InputStream</code> or <code>OutputStream</code>. | ||
35 | + */ | ||
36 | + static SecretKey deriveKey(char[] password, Object stream) | ||
37 | + throws IOException, GeneralSecurityException { | ||
38 | + // Add salt | ||
39 | + SecureRandom random = new SecureRandom(); | ||
40 | + byte[] salt = new byte[SALT_SIZE]; | ||
41 | + if (stream instanceof OutputStream) { | ||
42 | + // Generate salt and prepend to output | ||
43 | + random.nextBytes(salt); | ||
44 | + ((OutputStream) stream).write(salt); | ||
45 | + } else if (stream instanceof InputStream) { | ||
46 | + // Get prepended salt from input | ||
47 | + salt = ((InputStream) stream).readNBytes(SALT_SIZE); | ||
48 | + } else { | ||
49 | + throw new IllegalArgumentException("Argument stream must be of type" + | ||
50 | + " InputStream or OutputStream"); | ||
51 | + } | ||
52 | + | ||
53 | + // Derive key | ||
54 | + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM); | ||
55 | + KeySpec spec = new PBEKeySpec(password, salt, ITERATIONS, KEY_SIZE); | ||
56 | + SecretKey key = keyFactory.generateSecret(spec); | ||
57 | + | ||
58 | + return new SecretKeySpec(key.getEncoded(), CIPHER_ALGORITHM); | ||
59 | + } | ||
60 | +} |
DLPonUSB/src/cryptor/LogWindow.java
0 → 100644
1 | +package cryptor; | ||
2 | + | ||
3 | +import javax.swing.*; | ||
4 | +import javax.swing.filechooser.FileView; | ||
5 | +import java.awt.*; | ||
6 | +import java.awt.event.ActionEvent; | ||
7 | +import java.awt.event.ActionListener; | ||
8 | +import java.io.File; | ||
9 | +import java.io.FileNotFoundException; | ||
10 | +import java.io.FileOutputStream; | ||
11 | +import java.io.IOException; | ||
12 | +import java.security.GeneralSecurityException; | ||
13 | +import java.text.SimpleDateFormat; | ||
14 | +import java.util.Date; | ||
15 | + | ||
16 | +class LogWindow extends Frame { | ||
17 | + | ||
18 | + String fileIn; | ||
19 | + | ||
20 | + String fileName; | ||
21 | + | ||
22 | + String userId; | ||
23 | + | ||
24 | + String userPW; | ||
25 | + | ||
26 | + | ||
27 | + LogWindow(String title, String ID, String PW){ | ||
28 | + | ||
29 | + //Frame(String title)을 호출한다. | ||
30 | + | ||
31 | + super(title); | ||
32 | + | ||
33 | + userId = ID; | ||
34 | + userPW = PW; | ||
35 | + | ||
36 | + //Label의 text정렬을 오른쪽으로 | ||
37 | + String folderDir = ".\\" + userId + "\\logs"; | ||
38 | + | ||
39 | + final File dirToLock = new File(folderDir); | ||
40 | + JFileChooser jfc = new JFileChooser(dirToLock); | ||
41 | + jfc.setFileView(new FileView() { | ||
42 | + @Override | ||
43 | + public Boolean isTraversable(File f) { | ||
44 | + return dirToLock.equals(f); | ||
45 | + } | ||
46 | + }); | ||
47 | + | ||
48 | + jfc.showOpenDialog(null); | ||
49 | + fileIn = jfc.getSelectedFile().getAbsolutePath(); | ||
50 | + fileName = jfc.getSelectedFile().getName(); | ||
51 | + | ||
52 | + String passwd2 = userId + ' ' + userPW; | ||
53 | + char[] password2 = passwd2.toCharArray(); | ||
54 | + | ||
55 | + String dir = fileIn.substring(0, fileIn.lastIndexOf('.')) + ".txt"; | ||
56 | + File file = new File(dir); | ||
57 | + file.getParentFile().mkdir(); | ||
58 | + try { | ||
59 | + file.createNewFile(); | ||
60 | + } catch (IOException ioException) { | ||
61 | + ioException.printStackTrace(); | ||
62 | + } | ||
63 | + | ||
64 | + try { | ||
65 | + Cryptor.decrypt(fileIn, dir, password2); | ||
66 | + } catch (IOException ioException) { | ||
67 | + ioException.printStackTrace(); | ||
68 | + } catch (GeneralSecurityException generalSecurityException) { | ||
69 | + generalSecurityException.printStackTrace(); | ||
70 | + } | ||
71 | + | ||
72 | + try { | ||
73 | + if(file.exists()) | ||
74 | + { | ||
75 | + Desktop.getDesktop().open(file); | ||
76 | + } | ||
77 | + } catch (IOException ioException) { | ||
78 | + ioException.printStackTrace(); | ||
79 | + } | ||
80 | + | ||
81 | + try { | ||
82 | + Thread.sleep(1000); | ||
83 | + } catch (InterruptedException interruptedException) { | ||
84 | + interruptedException.printStackTrace(); | ||
85 | + } | ||
86 | + file.deleteOnExit(); | ||
87 | + } | ||
88 | + | ||
89 | + public static void main(String args[]){ | ||
90 | + | ||
91 | + LogWindow f = new LogWindow("Login", "user1", "12345678"); | ||
92 | + | ||
93 | + } | ||
94 | + | ||
95 | + | ||
96 | + | ||
97 | + class EventHandler implements ActionListener{ | ||
98 | + | ||
99 | + public void actionPerformed(ActionEvent e){ | ||
100 | + dispose(); | ||
101 | + } | ||
102 | + | ||
103 | + } | ||
104 | + | ||
105 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
DLPonUSB/src/cryptor/Main.java
0 → 100644
1 | +package cryptor; | ||
2 | + | ||
3 | +import java.io.IOException; | ||
4 | +import java.security.GeneralSecurityException; | ||
5 | +import java.util.Scanner; | ||
6 | + | ||
7 | +/** | ||
8 | + * Main entry point for running the Cryptor program. | ||
9 | + */ | ||
10 | +public class Main { | ||
11 | + | ||
12 | + /** | ||
13 | + * Calls an encryption or decryption method according to command-line arguments. | ||
14 | + * If no arguments are given then command prompts will be shown. | ||
15 | + * @param args the command-line arguments.<br> | ||
16 | + * Arguments for encryption: | ||
17 | + * <ol> | ||
18 | + * <li>-encrypt</li> | ||
19 | + * <li>plaintext filename</li> | ||
20 | + * <li>encrypted filename</li> | ||
21 | + * <li>password</li> | ||
22 | + * </ol> | ||
23 | + * Arguments for decryption: | ||
24 | + * <ol> | ||
25 | + * <li>-decrypt</li> | ||
26 | + * <li>encrypted filename</li> | ||
27 | + * <li>decrypted filename</li> | ||
28 | + * <li>password</li> | ||
29 | + * </ol> | ||
30 | + */ | ||
31 | + public static void main(String[] args) | ||
32 | + throws IOException, GeneralSecurityException { | ||
33 | + | ||
34 | + if (args.length > 0) { | ||
35 | + String mode = args[0]; | ||
36 | + String inFile = args[1]; | ||
37 | + String outFile = args[2]; | ||
38 | + char[] password = args[3].toCharArray(); | ||
39 | + | ||
40 | + if (mode.equals("-encrypt")) { | ||
41 | + Cryptor.encrypt(inFile, outFile, password); | ||
42 | + } else if (mode.equals("-decrypt")) { | ||
43 | + Cryptor.decrypt(inFile, outFile, password); | ||
44 | + } else { | ||
45 | + throw new GeneralSecurityException("Not a valid cipher mode"); | ||
46 | + } | ||
47 | + } else { | ||
48 | + Scanner scan = new Scanner(System.in); | ||
49 | + System.out.print("Enter input filename: "); | ||
50 | + String fileIn = scan.nextLine(); | ||
51 | + | ||
52 | + System.out.print("Enter output filename: "); | ||
53 | + String fileOut = scan.nextLine(); | ||
54 | + | ||
55 | + System.out.print("Enter password: "); | ||
56 | + char[] password = scan.nextLine().toCharArray(); | ||
57 | + | ||
58 | + System.out.print("Enter cipher mode [encrypt | decrypt]: "); | ||
59 | + String modeIn = scan.nextLine(); | ||
60 | + | ||
61 | + if (modeIn.equals("encrypt")) { | ||
62 | + Cryptor.encrypt(fileIn, fileOut, password); | ||
63 | + } else if (modeIn.equals("decrypt")) { | ||
64 | + Cryptor.decrypt(fileIn, fileOut, password); | ||
65 | + } else { | ||
66 | + throw new GeneralSecurityException("Not a valid cipher mode"); | ||
67 | + } | ||
68 | + } | ||
69 | + } | ||
70 | +} |
DLPonUSB/src/cryptor/MainMenu.java
0 → 100644
1 | +package cryptor; | ||
2 | + | ||
3 | +import javax.swing.*; | ||
4 | +import java.awt.*; | ||
5 | +import java.awt.event.ActionEvent; | ||
6 | +import java.awt.event.ActionListener; | ||
7 | +import java.awt.event.WindowAdapter; | ||
8 | +import java.awt.event.WindowEvent; | ||
9 | +import java.io.File; | ||
10 | +import java.io.FileNotFoundException; | ||
11 | +import java.io.FileOutputStream; | ||
12 | +import java.io.IOException; | ||
13 | +import java.security.GeneralSecurityException; | ||
14 | +import java.text.SimpleDateFormat; | ||
15 | +import java.util.Date; | ||
16 | + | ||
17 | +class MainMenu extends Frame { | ||
18 | + | ||
19 | + Button bRegister; | ||
20 | + | ||
21 | + Button bOpen; | ||
22 | + | ||
23 | + Button bViewLog; | ||
24 | + | ||
25 | + Button bDelete; | ||
26 | + | ||
27 | + MainMenu(String title, String ID, String PW){ | ||
28 | + | ||
29 | + //Frame(String title)을 호출한다. | ||
30 | + | ||
31 | + super(title); | ||
32 | + | ||
33 | + addWindowListener(new WindowAdapter() { | ||
34 | + @Override | ||
35 | + public void windowClosing(WindowEvent e) { | ||
36 | + String folderDir = ".\\" + ID + "\\Decrypted"; | ||
37 | + File folder = new File(folderDir); | ||
38 | + deleteDirectory(folder, ID, PW); | ||
39 | + | ||
40 | + dispose(); | ||
41 | + System.exit(0); | ||
42 | + } | ||
43 | + }); | ||
44 | + | ||
45 | + bRegister = new Button("Register Files"); | ||
46 | + | ||
47 | + bOpen = new Button("Open Encrypted Files"); | ||
48 | + | ||
49 | + bViewLog = new Button("View Logs"); | ||
50 | + | ||
51 | + bDelete = new Button("Delete Encrypted Files"); | ||
52 | + | ||
53 | + //OK버튼과 TextField에 이벤트처리를 위한 Listener를 추가해준다. | ||
54 | + | ||
55 | + bRegister.addActionListener(e -> { | ||
56 | + EncryptWindow f = new EncryptWindow(title, ID, PW); | ||
57 | + }); | ||
58 | + | ||
59 | + bOpen.addActionListener(e -> { | ||
60 | + DecryptWindow f = new DecryptWindow(title, ID, PW); | ||
61 | + }); | ||
62 | + | ||
63 | + bViewLog.addActionListener(e -> { | ||
64 | + LogWindow f = new LogWindow(title, ID, PW); | ||
65 | + }); | ||
66 | + | ||
67 | + bDelete.addActionListener(e -> { | ||
68 | + DeleteEncypted f = new DeleteEncypted(title, ID, PW); | ||
69 | + }); | ||
70 | + | ||
71 | + //LayoutManager를 FlowLayout으로 | ||
72 | + | ||
73 | + setLayout(new FlowLayout()); | ||
74 | + | ||
75 | + //생성한 component들을 Frame에 포함시킨다. | ||
76 | + | ||
77 | + add(bRegister); | ||
78 | + | ||
79 | + add(bOpen); | ||
80 | + | ||
81 | + add(bViewLog); | ||
82 | + | ||
83 | + add(bDelete); | ||
84 | + | ||
85 | + setSize(450,200); | ||
86 | + | ||
87 | + //화면이 보이게 한다. | ||
88 | + | ||
89 | + setVisible(true); | ||
90 | + } | ||
91 | + | ||
92 | + public static void main(String args[]){ | ||
93 | + MainMenu f = new MainMenu("Main", "user1", "12345678"); | ||
94 | + } | ||
95 | + | ||
96 | + public static boolean deleteDirectory(File path, String userId, String userPW) { | ||
97 | + if(!path.exists()) { | ||
98 | + return false; | ||
99 | + } | ||
100 | + File[] files = path.listFiles(); | ||
101 | + for (File file : files) { | ||
102 | + if (file.isDirectory()) { | ||
103 | + deleteDirectory(file, userId, userPW); | ||
104 | + } else { | ||
105 | + String fileName = file.getName(); | ||
106 | + String passwd2 = userId + ' ' + userPW; | ||
107 | + char[] password2 = passwd2.toCharArray(); | ||
108 | + String dir = ".\\" + userId + "\\logs\\" + fileName + ".txt"; | ||
109 | + String dir2 = ".\\" + userId + "\\logs\\" + fileName + ".log"; | ||
110 | + | ||
111 | + try { | ||
112 | + Cryptor.decrypt(dir2, dir, password2); | ||
113 | + } catch (IOException ioException) { | ||
114 | + ioException.printStackTrace(); | ||
115 | + } catch (GeneralSecurityException generalSecurityException) { | ||
116 | + generalSecurityException.printStackTrace(); | ||
117 | + } | ||
118 | + | ||
119 | + FileOutputStream fos = null; | ||
120 | + try { | ||
121 | + fos = new FileOutputStream(dir,true); | ||
122 | + } catch (FileNotFoundException fileNotFoundException) { | ||
123 | + fileNotFoundException.printStackTrace(); | ||
124 | + } | ||
125 | + SimpleDateFormat format1 = new SimpleDateFormat( "yyyy-MM-dd HH:mm"); | ||
126 | + | ||
127 | + Date time = new Date(); | ||
128 | + | ||
129 | + String time1 = format1.format(time); | ||
130 | + String toWrite = "삭제\t" + time1 + '\t' + "사용 완료" + '\n'; | ||
131 | + byte[] b = toWrite.getBytes(); | ||
132 | + try { | ||
133 | + fos.write(b); | ||
134 | + } catch (IOException ioException) { | ||
135 | + ioException.printStackTrace(); | ||
136 | + } | ||
137 | + try { | ||
138 | + fos.flush(); | ||
139 | + } catch (IOException ioException) { | ||
140 | + ioException.printStackTrace(); | ||
141 | + } | ||
142 | + try { | ||
143 | + fos.close(); | ||
144 | + } catch (IOException ioException) { | ||
145 | + ioException.printStackTrace(); | ||
146 | + } | ||
147 | + | ||
148 | + try { | ||
149 | + Cryptor.encrypt(dir, dir2, password2); | ||
150 | + } catch (IOException ioException) { | ||
151 | + ioException.printStackTrace(); | ||
152 | + } catch (GeneralSecurityException generalSecurityException) { | ||
153 | + generalSecurityException.printStackTrace(); | ||
154 | + } | ||
155 | + | ||
156 | + File temp = new File(dir); | ||
157 | + temp.delete(); | ||
158 | + | ||
159 | + file.delete(); | ||
160 | + } | ||
161 | + } | ||
162 | + return path.delete(); | ||
163 | + } | ||
164 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
면담_확인서/5월_캡스톤디자인_면담_확인서_증빙.jpg
0 → 100644

72.7 KB
-
Please register or login to post a comment