Java AES加密-以后如何解密加密字符串?
我有一个java程序。这是一个AES加密-解密程序。该程序有一个图形用户界面,可以输入字符串并显示AES加密字符串。程序还使用代码中编写的解密函数显示原始字符串。界面是这样的,当输入字符串并单击convert按钮时,加密和解密的结果显示在面板中。这是节目单Java AES加密-以后如何解密加密字符串?,java,encryption,aes,Java,Encryption,Aes,我有一个java程序。这是一个AES加密-解密程序。该程序有一个图形用户界面,可以输入字符串并显示AES加密字符串。程序还使用代码中编写的解密函数显示原始字符串。界面是这样的,当输入字符串并单击convert按钮时,加密和解密的结果显示在面板中。这是节目单 import java.awt.event.*; import java.awt.*; import javax.swing.*; import java.security.*; import javax.crypto.*; import j
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 + "\n");
out.append("Original String: " + decrypt(en) + "\n\n");
} 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;
}
}
导入java.awt.event.*;
导入java.awt.*;
导入javax.swing.*;
导入java.security.*;
导入javax.crypto.*;
导入javax.crypto.spec.*;
导入java.io.*;
公共类AESGUI扩展了JPanel{
公共静态void main(字符串[]args){
JFrame=新的JFrame(“AES加密”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置首选尺寸(新尺寸(600300));
frame.setLocationRelativeTo(空);
frame.setresizeable(false);
AESGUI p=新AESGUI();
frame.getContentPane().add(p);
frame.pack();
frame.setVisible(true);
}
私有JTextField;
私人住宅区外;
公共AESGUI(){
JLabel info=新的JLabel(“键入任何字符串”);
in=新的JTextField(20);
JButton encrypt=新JButton(“加密”);
out=新的JTextArea(10,40);
out.setEditable(false);
encrypt.addActionListener(新的encryptListener());
in.addActionListener(新的encryptListener());
添加(信息);
添加(in);
添加(加密);
加(出);
添加(新的JScrollPane(out));
}
私有类encryptListener实现ActionListener{
已执行的公共无效操作(操作事件e){
字符串数据=in.getText();
如果(data.length()==0){}
其他的
试一试{
字符串en=加密(数据);
out.append(“加密字符串:“+en+”\n”);
out.append(“原始字符串:”+解密(en)+“\n\n”);
}捕获(例外情况除外){}
}
}
公共字符串asHex(字节[]buf){
StringBuffer strbuf=新的StringBuffer(buf.length*2);
int i;
对于(i=0;i
此程序不会告诉用户使用哪个密钥加密字符串。由于它不会将密钥告诉用户,因此用户以后无法解密加密字符串。程序以十六进制编码显示加密字符串。为了以后解密字符串,最好是更改程序以便程序根据密码创建密钥,还是更改程序以便向用户显示随机生成的密钥,以便用户以后可以使用该密钥解密字符串?如果用户是将使用加密密钥用于稍后解密加密数据,我看不出为用户显示密钥有任何错误
您也可以使用第一个选项从密码生成加密密钥,但在这种情况下,如果您希望用户稍后解密数据,则需要再次让用户输入加密密码并生成加密密钥(同时确保生成sme密钥)并通知用户。该程序的目的是什么?你想达到什么目标?