相关文章推荐
欢快的电池  ·  snmpwalk -v 2c -c ...·  5 月前    · 

在此之前加密解密工具采用的是命令行的方式,下午没事改用Swing实现一下,使用相对友好些。命令行实现方式传送门: java独立小程序实现AES加密和解密

Swing实现步骤

加密测试:输入明文123456

点击确定将加密后的内容拷贝到剪切板。解密测试:

解密结果:

异常信息以提示框形式弹出:

  • 创建Frame窗体
  • 创建卡片式布局面板
  • 创建单选按钮面板
  • 创建文本框面板
  • 创建按钮面板
  • 创建组合面板
  • 将单选按钮和按钮面板添加到组合面板
  • 将组合面板添加到窗体
  • 向单选按钮面板中填充两个单选按钮
  • 向按钮面板中填充两个按钮
  • 向文本框面板中添加输入明文或密文的文本框
  • 给单选按钮添加监听事件
  • 给按钮添加监听事件
  • 设置窗体相关属性
  • import javax.swing.* ; import javax.swing.border.EtchedBorder; import javax.swing.border.TitledBorder; import java.awt.* ; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Enumeration; public class SwingDemo { static final String ENCRYPT = "加密" ; static final String DECRYPT = "解密" ; static final String ENCRYPTTIPS = "请输入明文:" ; static final String DECRYPTTIPS = "请输入密文:" ; static final String DEFAULTTIPS = "输入框内容不得为空!" ; static final String SUCCESSTITLE = "点击确定拷贝内容到剪切板" ; public static void main(String[] args) { new SwingDemo(); * 实现加解密业务 public SwingDemo() { /* 创建Frame窗体 */ JFrame mainWin = new JFrame("AES加密&解密工具" ); /* 卡片式布局的面板 */ JPanel cards = new JPanel( new CardLayout()); /* 单选按钮面板 */ JPanel radioPanel = new JPanel(); /* 文本框面板 */ JPanel textPanel = new JPanel(); /* 按钮面板 */ JPanel buttonPanel = new JPanel(); /* 组合面板 */ JPanel combinationPanel = new JPanel(); /* 将单选按钮和按钮面板添加到组合面板 */ combinationPanel.setLayout( new BorderLayout()); combinationPanel.add(radioPanel, BorderLayout.NORTH); combinationPanel.add(textPanel, BorderLayout.CENTER); combinationPanel.add(buttonPanel, BorderLayout.SOUTH); /* 将组合面板添加到窗体 */ mainWin.add(combinationPanel, BorderLayout.SOUTH); /* 向单选按钮面板中填充两个单选按钮 */ radioPanel.setBorder( new TitledBorder( new EtchedBorder(), "请选择模式")); // 设置单选按钮的外框标题 JRadioButton rb1 = new JRadioButton(ENCRYPT, true ); // 创建JRadioButton对象,默认选中 JRadioButton rb2 = new JRadioButton(DECRYPT); // 创建JRadioButton对象 radioPanel.add(rb1); radioPanel.add(rb2); // 将单选按钮添加到组,实现单选效果 ButtonGroup jRadioGroup = new ButtonGroup(); jRadioGroup.add(rb1); jRadioGroup.add(rb2); /* 向按钮面板中填充两个按钮 */ JButton okButton = new JButton("确定" ); JButton clearButton = new JButton("重置" ); buttonPanel.add(okButton); buttonPanel.add(clearButton); /* 向文本框面板中添加输入明文或密文的文本框 */ JTextField contentTextField = new JTextField(28 ); JLabel contentLabel = new JLabel(); contentLabel.setText(ENCRYPTTIPS); textPanel.add(contentLabel); textPanel.add(contentTextField); /* 给单选按钮添加监听事件 */ rb1.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { contentLabel.setText(ENCRYPTTIPS); // 动态修改标签文本 clearJTextField(contentTextField); // 清空文本框内容 rb2.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { contentLabel.setText(DECRYPTTIPS); clearJTextField(contentTextField); /* 给按钮添加监听事件 */ okButton.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 调用加密或解密逻辑 String text = contentTextField.getText().trim(); // 去掉文本框中字符串前后空格 if (StringUtils.isEmpty(text)) { // JOptionPane.showMessageDialog(null, DEFAULTTIPS); JOptionPane.showMessageDialog( null , DEFAULTTIPS, "警告", 2 ); return ; // 根据单选按钮组的模式执行响应逻辑 Enumeration<AbstractButton> jRadioGroupElements = jRadioGroup.getElements(); while (jRadioGroupElements.hasMoreElements()) { AbstractButton button = jRadioGroupElements.nextElement(); if (button.isSelected()) { String buttonText = button.getText(); // 按钮文本域内容 if (buttonText.equals(ENCRYPT)) { try { String cleartext = AESDecoder.aesEncrypt(text); JOptionPane.showMessageDialog( null , cleartext, SUCCESSTITLE, JOptionPane.PLAIN_MESSAGE); setSysClipboardText(cleartext); // 拷贝到剪切板 } catch (Exception ex) { String message = ex.getMessage(); System.out.println(message); JOptionPane.showMessageDialog( null , ex.getMessage(), "错误 ", 0 ); } else if (buttonText.equals(DECRYPT)) { try { String ciphertext = AESDecoder.aesDecrypt(text); JOptionPane.showMessageDialog( null , ciphertext, SUCCESSTITLE, JOptionPane.PLAIN_MESSAGE); setSysClipboardText(ciphertext); } catch (Exception ex) { String message = ex.getMessage(); System.out.println(message); JOptionPane.showMessageDialog( null , ex.getMessage(), "错误 ", 0 ); break ; clearButton.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { clearJTextField(contentTextField); cards.add(combinationPanel, "card1"); // 向卡片式布局面板中添加面板1 CardLayout cl = (CardLayout) (cards.getLayout()); cl.show(cards, "card1" ); mainWin.add(cards); /* 设置窗体相关属性 */ mainWin.setVisible( true ); // 窗体可见 mainWin.setResizable( false ); // 禁用最大化 mainWin.setSize( new Dimension(480, 270)); // 窗体宽高 mainWin.setLocationRelativeTo(mainWin.getOwner()); // 窗体位置居中当前屏幕 mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口程序停止 * 清空文本框内容 * @param contentTextField private void clearJTextField(JTextField contentTextField) { contentTextField.setText( "" ); * 实现将字符串复制到剪切板 * @param writeMe public static void setSysClipboardText(String writeMe) { Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard(); Transferable tText = new StringSelection(writeMe); clip.setContents(tText, null );

    加解密部分代码

    这部分和命令行实现方式无异。

    AESDecoder.java

    package com.xgcd;
    import org.apache.commons.codec.binary.Base64;
    import org.apache.commons.lang.StringUtils;
    import sun.misc.BASE64Decoder;
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.spec.SecretKeySpec;
    import java.math.BigInteger;
    import java.security.SecureRandom;
    public class AESDecoder {
        //密钥 (需要前端和后端保持一致)
        public static final String KEY = "NARI@KD_123@Help";
        //算法
        private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";
         * 随机生成指定长度的字符串
        public static String getRandomString(int length) { //length表示生成字符串的长度
            String base = "abcdef#ghi$jkl!mno&pqrstu%vwxyz0_@123456789";
            SecureRandom random = new SecureRandom();
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < length; i++) {
                int number = random.nextInt(base.length());
                sb.append(base.charAt(number));
            return sb.toString();
         * aes解密
         * @param encrypt 内容
         * @return
         * @throws Exception
        public static String aesDecrypt(String encrypt) throws Exception {
            return aesDecrypt(encrypt, KEY);
    //        try {
    //            return aesDecrypt(encrypt, KEY);
    //        } catch (Exception e) {
    //            e.printStackTrace();
    //            return e.getMessage();
         * aes加密
         * @param content
         * @return
         * @throws Exception
        public static String aesEncrypt(String content) throws Exception {
            return aesEncrypt(content, KEY);
    //        try {
    //            return aesEncrypt(content, KEY);
    //        } catch (Exception e) {
    //            e.printStackTrace();
    //            return e.getMessage();
         * 将byte[]转为各种进制的字符串
         * @param bytes byte[]
         * @param radix 可以转换进制的范围,从Character.MIN_RADIX到Character.MAX_RADIX,超出范围后变为10进制
         * @return 转换后的字符串
        public static String binary(byte[] bytes, int radix) {
            return new BigInteger(1, bytes).toString(radix);// 这里的1代表正数
         * base 64 encode
         * @param bytes 待编码的byte[]
         * @return 编码后的base 64 code
        public static String base64Encode(byte[] bytes) {
            return Base64.encodeBase64String(bytes);
         * base 64 decode
         * @param base64Code 待解码的base 64 code
         * @return 解码后的byte[]
         * @throws Exception
        public static byte[] base64Decode(String base64Code) throws Exception {
            return StringUtils.isEmpty(base64Code) ? null : new BASE64Decoder().decodeBuffer(base64Code);
         * AES加密
         * @param content    待加密的内容
         * @param encryptKey 加密密钥
         * @return 加密后的byte[]
         * @throws Exception
        public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            kgen.init(128);
            Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
            cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));
            return cipher.doFinal(content.getBytes("utf-8"));
         * AES加密为base 64 code
         * @param content    待加密的内容
         * @param encryptKey 加密密钥
         * @return 加密后的base 64 code
         * @throws Exception
        public static String aesEncrypt(String content, String encryptKey) throws Exception {
            return base64Encode(aesEncryptToBytes(content, encryptKey));
         * AES解密
         * @param encryptBytes 待解密的byte[]
         * @param decryptKey   解密密钥
         * @return 解密后的String
         * @throws Exception
        public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            kgen.init(128);
            Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
            byte[] decryptBytes = cipher.doFinal(encryptBytes);
            return new String(decryptBytes);
         * 将base 64 code AES解密
         * @param encryptStr 待解密的base 64 code
         * @param decryptKey 解密密钥
         * @return 解密后的string
         * @throws Exception
        public static String aesDecrypt(String encryptStr, String decryptKey) throws Exception {
            return StringUtils.isEmpty(encryptStr) ? null : aesDecryptByBytes(base64Decode(encryptStr), decryptKey);
        public static String decrypt(String encryptStr) {
            try {
                return aesDecrypt(encryptStr, KEY);
            } catch (Exception e) {
                return null;
        public static void main(String[] args) {
            String encryCont = "";
            try {
                System.out.println(encryCont = AESDecoder.aesEncrypt("Welcome@19"));
                System.out.println(AESDecoder.aesDecrypt(encryCont));
            } catch (Exception e) {
                e.printStackTrace();
    

    将项目打成可执行jar包,不再赘述。

    GitHub代码

    https://github.com/xiguanchendian/Swing

    http://c.biancheng.net/swing/

    https://blog.csdn.net/yangymy/article/details/71172589?utm_source=blogxgwz3

    https://blog.csdn.net/qq_42276808/article/details/91492254