java - AES 加密 - 以后如何解密加密的字符串?

标签 java encryption aes

我有一个java程序。这是一个AES加密-解密程序。该程序有一个图形用户界面,可以输入字符串并显示 AES 加密字符串。该程序还通过使用代码中编写的解密函数显示原始字符串。该界面是这样的,当输入字符串并单击转换按钮时,加密和解密的结果将显示在面板中。这是程序。

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;
    }

}

此程序不会告诉用户使用哪个 key 来加密字符串。由于它没有将 key 告诉用户,因此用户以后无法解密加密的字符串。该程序以十六进制编码显示加密的字符串。为了稍后解密字符串,最好更改程序以便程序根据密码创建 key ,还是更改程序以向用户显示随机生成的 key 更好,用户可以使用该 key 稍后解密字符串?

最佳答案

如果用户是稍后使用加密 key 解密加密数据的实际最终用户,我认为为用户显示 key 没有任何问题。

您也可以选择第一个选项,即从密码生成加密 key ,但在这种情况下,如果您希望用户稍后解密数据,那么您需要再次让他输入加密密码并生成加密 key (还要确保它产生 sme key )并告知用户。

关于java - AES 加密 - 以后如何解密加密的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1912785/

相关文章:

java - 仅使用大写字母的异或加密

java - 如何解决填充不良的问题

node.js - 在nodejs中使用aes-128-ecb加密数据

java - 获取异常 java.security.InvalidKeyException : Invalid AES key length: 28 bytes

javascript - 字符串的 SubtleCrypto ArrayBuffer 键

java - 如何反序列化 json 对象,其中键中存在指针?

java - 可以强制执行应用程序中所有文件的静态 block 吗?

java - 如何在 Java 中创建安全的随机 AES key ?

java - 获取通知标题安卓

java - 如何从 Java 中的 List<String[]> 获取具有频率的唯一值?