AES encryption - how to later decrypt the encrypted string?
我有一个Java程序。这是一个AES加密-解密程序。该程序有一个图形用户界面,可以输入字符串并显示AES加密字符串。程序还使用代码中编写的解密函数显示原始字符串。界面是这样的,当输入字符串并单击convert按钮时,加密和解密的结果将显示在面板中。这是节目单。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | import java.awt.event.*; import java.awt.*; import javax.swing.*; import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; import java.io.*; public class AESGUI extends JPanel { public static void main(String[] args) { JFrame frame = new JFrame("AES Encryption"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setPreferredSize(new Dimension(600,300)); frame.setLocationRelativeTo(null); frame.setResizable(false); AESGUI p = new AESGUI(); frame.getContentPane().add(p); frame.pack(); frame.setVisible(true); } private JTextField in; private JTextArea out; public AESGUI() { JLabel info = new JLabel("Type any String"); in = new JTextField(20); JButton encrypt = new JButton("Encrypt"); out = new JTextArea(10,40); out.setEditable(false); encrypt.addActionListener(new encryptListener()); in.addActionListener(new encryptListener()); add(info); add(in); add(encrypt); add(out); add(new JScrollPane(out)); } private class encryptListener implements ActionListener { public void actionPerformed(ActionEvent e) { String data = in.getText(); if (data.length() == 0) { } else try { String en = encrypt(data); out.append("Encrypted string:" + en +" "); out.append("Original String:" + decrypt(en) +" "); } catch(Exception ex) { } } } public String asHex(byte[] buf) { StringBuffer strbuf = new StringBuffer(buf.length * 2); int i; for (i = 0; i < buf.length; i++) { if (((int) buf[i] & 0xff) < 0x10) strbuf.append("0"); strbuf.append(Long.toString((int) buf[i] & 0xff, 16)); } return strbuf.toString(); } private SecretKeySpec skeySpec; private Cipher cipher; private byte[] encrypted; public String encrypt(String str) throws Exception { // Get the KeyGenerator KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128); // 192 and 256 bits may not be available // Generate the secret key specs. SecretKey skey = kgen.generateKey(); byte[] raw = skey.getEncoded(); skeySpec = new SecretKeySpec(raw,"AES"); // Instantiate the cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); encrypted = cipher.doFinal(str.getBytes()); return asHex(encrypted); } public String decrypt(String str) throws Exception { cipher.init(Cipher.DECRYPT_MODE, skeySpec); byte[] original = cipher.doFinal(encrypted); String originalString = new String(original); return originalString; } } |
这个程序不会告诉用户使用哪个密钥来加密字符串。因为它不告诉用户密钥,所以用户以后无法解密加密的字符串。程序以十六进制编码显示加密字符串。为了以后解密字符串,最好更改程序以便程序基于密码创建密钥,还是更改程序以便向用户显示随机生成的密钥,以便用户以后解密字符串?
如果用户是实际的最终用户,在以后的某个时间点使用加密密钥解密加密数据,那么我认为为用户显示密钥没有任何错误。
您也可以使用从密码生成加密密钥的第一个选项,但在这种情况下,如果您希望用户稍后解密数据,则需要让他输入加密密码并生成加密密钥(同时确保它生成SME密钥)并通知用户。