本代码采用的是AES加密算法实现一个密钥生成器。

项目结构如下所示:
【代码如下】
LicenseEntry.java
package cn.evansung.license;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.text.DateFormatter;public class LicenseEntry {public static void main(String[] args) {LicenseFrame frame = new LicenseFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}
}class LicenseFrame extends JFrame {/*** */private static final long serialVersionUID = 1L;private static final int WIDTH = 475;private static final int HEIGHT = 445;private JTextField userNameInput;private JFormattedTextField dueTimeInput;private JTextField socketInput;private JTextField brandInput;private JTextField productInput;private JTextArea keyOutput;public LicenseFrame() {Container con = getContentPane();Toolkit kit = Toolkit.getDefaultToolkit();Dimension screenSize = kit.getScreenSize();int width = screenSize.width;int height = screenSize.height;int x = (width - WIDTH) / 2;int y = (height - HEIGHT) / 2;setLocation(x, y);setSize(WIDTH, HEIGHT);setResizable(false);//设置图标Image image = kit.getImage("image/favicon.png");setIconImage(image);setTitle("License builder - Undefined");setFont(new Font("Dialog", 0, 12));JLabel label1 = new JLabel("Username:");label1.setBounds(65, 45, 80, 30);userNameInput = new JTextField();userNameInput.setBounds(140, 45, 180, 30);JLabel label2 = new JLabel("DueTime:");label2.setBounds(65, 90, 80, 30);DateFormat format = new SimpleDateFormat("yyyy-MM-dd");DateFormatter df = new DateFormatter(format);dueTimeInput = new JFormattedTextField(df);dueTimeInput.setValue(new Date());dueTimeInput.setBounds(140, 90, 180, 30);JLabel label3 = new JLabel("Socket:");label3.setBounds(65, 135, 80, 30);socketInput = new JTextField();socketInput.setBounds(140, 135, 180, 30);JLabel label4 = new JLabel("Brand:");label4.setBounds(65, 180, 80, 30);brandInput = new JTextField();brandInput.setBounds(140, 180, 180, 30);JLabel label5 = new JLabel("Product:");label5.setBounds(65, 225, 80, 30);productInput = new JTextField();productInput.setBounds(140, 225, 180, 30);JLabel label6 = new JLabel("Key:");label6.setBounds(65, 270, 80, 30);keyOutput = new JTextArea(5, 20);keyOutput.setLineWrap(true);keyOutput.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.black));keyOutput.setBounds(140, 270, 300, 70);JPanel contentPanel = new JPanel();contentPanel.setLayout(null);contentPanel.add(label1);contentPanel.add(label2);contentPanel.add(label3);contentPanel.add(label4);contentPanel.add(label5);contentPanel.add(label6);contentPanel.add(userNameInput);contentPanel.add(dueTimeInput);contentPanel.add(socketInput);contentPanel.add(brandInput);contentPanel.add(productInput);contentPanel.add(keyOutput);con.add(contentPanel);ButtonPanel southPanel = new ButtonPanel(contentPanel);con.add(southPanel, BorderLayout.SOUTH);}private class ButtonPanel extends JPanel {private static final long serialVersionUID = 1L;private JPanel centerPanel;private JButton create;private JButton check;public ButtonPanel(JPanel centerPanel) {this.centerPanel = centerPanel;create = new JButton("Create");check = new JButton("Check");ButtonGroup group = new ButtonGroup();group.add(create);group.add(check);add(create);add(check);create.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {createBtnActionPerformed(event);}});check.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {checkBtnActionPerformed(event);}});}private void createBtnActionPerformed(ActionEvent event) {Date date = null;try {date = (Date) dueTimeInput.getValue();} catch (Exception e) {e.printStackTrace();JOptionPane.showMessageDialog(null, "时间格式错误:" + dueTimeInput.getValue(), "错误提示", 0);return;}long timestamp = date.getTime();//86300000L为一天的毫秒数if (timestamp - System.currentTimeMillis() > 86300000L) {String username = userNameInput.getText().trim();if ((username == null) || (username.isEmpty())) {JOptionPane.showMessageDialog(null, "用户不能为空", "消息提示", 1);return;}try {String socket_text = socketInput.getText();long socket = 1L;if (isNumeric(socket_text)) {socket = Long.valueOf(socket_text).longValue();}long day = (timestamp / 1000L - 1493568000L) / 3600L / 24L;String storekey = day + ":" + socket + ":" + brandInput.getText().trim() + ":" + productInput.getText().trim();String key = AESCore.encrypt(storekey.getBytes(), "fiwouser-" + username);keyOutput.setText(key);} catch (Exception e) {JOptionPane.showMessageDialog(null, "生成失败:" + e.getMessage(), "错误提示", 0);}} else {JOptionPane.showMessageDialog(null, "有效时间至少超过1天,请修改duetime", "消息提示", 1);return;}centerPanel.setBackground(Color.CYAN);}private void checkBtnActionPerformed(ActionEvent event) {String key = keyOutput.getText();String name = userNameInput.getText();if ((key.isEmpty()) || (name.isEmpty())) {centerPanel.setBackground(null);JOptionPane.showMessageDialog(null, "请检查key或name是否为空", "消息提示", 1);return;}try {String keystore = AESCore.decrypt(key, "user-" + name);String[] keys = keystore.split(":");if ((keys.length >= 1) && (isNumeric(keys[0]))) {//设置时间基准2017/05/01(1493568000000L)long time = 1493568000000L + Long.valueOf(keys[0]).longValue() * 24L * 3600L * 1000L;Calendar cal = Calendar.getInstance();cal.setTimeInMillis(time);dueTimeInput.setValue(cal.getTime());if (time < System.currentTimeMillis()) {centerPanel.setBackground(null);JOptionPane.showMessageDialog(null, "该key已过期", "消息提示", 1);return;}centerPanel.setBackground(Color.CYAN);JOptionPane.showMessageDialog(null, "该key有效", "消息提示", 1);return;}centerPanel.setBackground(null);JOptionPane.showMessageDialog(null, "无效key", "消息提示", 1);} catch (Exception e) {centerPanel.setBackground(null);JOptionPane.showMessageDialog(null, "验证失败:" + e.getMessage(), "错误提示", 0);}}private boolean isNumeric(Object s) {return ((s == null) ? false : s.toString().matches("^[-+]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?[dD]?$"));}}
}
AESCore.java
package cn.evansung.license;import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;public class AESCore {public static String encrypt(String bef_aes, String password) {byte[] byteContent = null;try {byteContent = bef_aes.getBytes("utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return encrypt(byteContent, password);}public static String encrypt(byte[] content, String password) {SecretKey secretKey;try {secretKey = getKey(password);byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES");cipher.init(1, key);byte[] result = cipher.doFinal(content);String aft_aes = parseByte2HexStr(result);return aft_aes;} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return null;}public static String decrypt(String aft_aes, String password) {byte[] content;try {content = parseHexStr2Byte(aft_aes);SecretKey secretKey = getKey(password);byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES");cipher.init(2, key);byte[] result = cipher.doFinal(content);String bef_aes = new String(result);return bef_aes;} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return null;}public static String parseByte2HexStr(byte[] buf) {StringBuffer sb = new StringBuffer();for (int i = 0; i < buf.length; ++i) {String hex = Integer.toHexString(buf[i] & 0xFF);if (hex.length() == 1)hex = '0' + hex;sb.append(hex.toUpperCase());}return sb.toString();}public static byte[] parseHexStr2Byte(String hexStr) {if (hexStr.length() < 1)return null;byte[] result = new byte[hexStr.length() / 2];for (int i = 0; i < hexStr.length() / 2; ++i) {int value = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 2), 16);result[i] = (byte)value;}return result;}public static SecretKey getKey(String strKey) {KeyGenerator _generator;try {_generator = KeyGenerator.getInstance("AES");SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");secureRandom.setSeed(strKey.getBytes());_generator.init(128, secureRandom);return _generator.generateKey();} catch (Exception e) {throw new RuntimeException("初始化密钥出现异常");}}
}
【运行后的 结果】

java swing制作密钥生成器-AES对称加密相关推荐

  1. RSA加密及AES对称加密代码实现

    最近老师布置了两个加密的作业,记录一下编码过程及遇到的问题. 对于RSA解密基本内容这里就不赘述,直接说一下编码过程把: 1:N = p*q(p.q互质,即公约数只有1)可以用辗转相除去判断 2:L是 ...

  2. java和Vue前后端RSA对称加密

    java和Vue前后端RSA对称加密 参考:https://blog.csdn.net/qq_25623257/article/details/109775531 一.生成秘钥对(公私钥) 在线生成地 ...

  3. RSA(非对称)+AES(对称加密)前后台交互

    前言:    为了提高安全性采用了RSA,但是为了解决RSA加解密性能问题,所以采用了RSA(非对称)+AES(对称加密)方式,如果只考虑其中一种的,可以去看我前面两篇文章,专门单独写的demo,可以 ...

  4. 编写ATL工程实现ActiveX控件调用cryptoAPI接口(三)------------AES对称加密与解密

    注:下面的代码中用了Map,Base64,log,Result等都为自定义类型,太长就不一一贴出. [cpp]  view plain  copy  print ? /* * * * 文件名称:Enc ...

  5. Python代码实现MD5、AES对称加密和RSA非对称加密以及OpenSSl实践

    1.MD5加密算法 1.1 MD5加密的特点 不可逆运算 对不同的数据加密的结果是定长的32位和16位字符(不管文件多大都一样) 对相同的数据加密,得到的结果是一样的(也就是复制). 抗修改性 :信息 ...

  6. 正确使用AES对称加密

    正确使用AES对称加密 经常我看到项目中有人使用了对称加密算法,用来加密客户或项目传输中的部分数据.但我注意到开发 人员由于不熟悉原理,或者简单复制网上的代码示例,有导致代码存在安全风险. 我经常遇到 ...

  7. 使用java swing制作人机五子棋

    使用java swing制作人机五子棋 背景 算法原理 棋盘分值更新范围 更新分值方法 判断分值方法 局势分数权重 设计模式 战局类Battle AI类 Integration UI设计 窗口类UIi ...

  8. AES对称加密和解密算法以及Java的AES工具类

    参考资料:百度百科[高级加密标准] AES简介 1.密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块 ...

  9. Android+Java中使用Aes对称加密的工具类与使用

    场景 Android+Java中使用RSA加密实现接口调用时的校验功能: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/11146 ...

最新文章

  1. 造成机器学习项目失败的7个原因
  2. php图片自动裁剪工具,php图片自动裁剪工具,解决图片变形问题,缩略图问题
  3. Ubuntu最简单的方式安装NVIDIA显卡驱动和cuda工具
  4. 置顶 | 2020学习单/读书单(顺境做事,逆境读书)
  5. ABAP 负号 提前
  6. java商城_java开源商城系统的优势是什么?
  7. 当create table as select 遇上大数据
  8. IOS学习之多线程(2)--创建线程
  9. java 中间容器 表格_【JAVA SE基础篇】45.迭代器、Collections工具类以及使用容器存储表格...
  10. mask rcnn属于dnn么_基于OpenCV DNN的 MaskRCNN 目标检测与实例分割
  11. Oracle v$session_longops 视图说明
  12. python爬虫-8个最高效的Python爬虫框架,你用过几个?
  13. Python入门--面向对象的特征-->封装
  14. JAVA性能优化笔记(一)
  15. php微信开发视频教程_PHP微信开发视频资源推荐
  16. 用x32/x64dbg脱DLL壳(IAT表修复和重定位表修复)
  17. 空压机物联网解决方案
  18. 采用计算机对酒店客房进行管理,酒店客房管理系统—计算机毕业设计论文.doc...
  19. jar包双击打不开或者闪退的解决办法
  20. 读书笔记:软件工程(1) - 软件工程概述(1)

热门文章

  1. html增删改后让table自动刷新,vue如何实现表格增删改查效果
  2. 阿里云搜索是什么,与百度搜索有什么不同
  3. CSS mask 实现鼠标跟随镂空效果
  4. vue 添加favicon.ico 修改favicon.ico
  5. 大数据浪潮下,企业财务人员应如何提升数据分析能力?
  6. Scala进阶之路-并发编程模型Akka入门篇
  7. 给大家介绍一个WIFI密码查看器,解密不安全的WIFI
  8. 待办事项下拉html代码,一款简洁易用的HTML5当日待办事项列表
  9. 图 - 存储结构之邻接表
  10. 一分钟让你实现Android微信分享功能