利用Preferences对软件进行加密

利用Preferences对软件进行加密

1.思路流程图
在这里插入图片描述
2.加密工具类DesUtil

package bing;

import java.io.IOException;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * DES加密 解密算法
 * 
 * 
 */
public class DesUtil {

	private final static String DES = "DES";
	private final static String ENCODE = "GBK";
	public static String defaultKey = "eqweqwe-dtd*asd+gjljaslk";//自定义的秘钥

	/**
	 * 使用 默认key 加密
	 * 
	 * @param data
	 *            待加密数据
	 * @return
	 * @throws Exception
	 */
	public static String encrypt(String data) throws Exception {
		byte[] bt = encrypt(data.getBytes(ENCODE), defaultKey.getBytes(ENCODE));
		String strs = new BASE64Encoder().encode(bt);
		return strs;
	}

	/**
	 * 使用 默认key 解密
	 * 
	 * @param data
	 *            待解密数据
	 * @return
	 * @throws IOException
	 * @throws Exception
	 */
	public static String decrypt(String data) throws IOException, Exception {
		if (data == null)
			return null;
		BASE64Decoder decoder = new BASE64Decoder();
		byte[] buf = decoder.decodeBuffer(data);
		byte[] bt = decrypt(buf, defaultKey.getBytes(ENCODE));
		return new String(bt, ENCODE);
	}

	/**
	 * Description 根据键值进行加密
	 * 
	 * @param data
	 *            待加密数据
	 * @param key
	 *            密钥
	 * @return
	 * @throws Exception
	 */
	public static String encrypt(String data, String key) throws Exception {
		byte[] bt = encrypt(data.getBytes(ENCODE), key.getBytes(ENCODE));
		String strs = new BASE64Encoder().encode(bt);
		return strs;
	}

	/**
	 * 根据键值进行解密
	 * 
	 * @param data
	 *            待解密数据
	 * @param key
	 *            密钥
	 * @return
	 * @throws IOException
	 * @throws Exception
	 */
	public static String decrypt(String data, String key) throws IOException,
			Exception {
		if (data == null)
			return null;
		BASE64Decoder decoder = new BASE64Decoder();
		byte[] buf = decoder.decodeBuffer(data);
		byte[] bt = decrypt(buf, key.getBytes(ENCODE));
		return new String(bt, ENCODE);
	}

	/**
	 * Description 根据键值进行加密
	 * 
	 * @param data
	 * @param key
	 *            加密键byte数组
	 * @return
	 * @throws Exception
	 */
	private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
		// 生成一个可信任的随机数源
		SecureRandom sr = new SecureRandom();

		// 从原始密钥数据创建DESKeySpec对象
		DESKeySpec dks = new DESKeySpec(key);

		// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
		SecretKey securekey = keyFactory.generateSecret(dks);

		// Cipher对象实际完成加密操作
		Cipher cipher = Cipher.getInstance(DES);

		// 用密钥初始化Cipher对象
		cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);

		return cipher.doFinal(data);
	}

	/**
	 * Description 根据键值进行解密
	 * 
	 * @param data
	 * @param key
	 *            加密键byte数组
	 * @return
	 * @throws Exception
	 */
	private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
		// 生成一个可信任的随机数源
		SecureRandom sr = new SecureRandom();

		// 从原始密钥数据创建DESKeySpec对象
		DESKeySpec dks = new DESKeySpec(key);

		// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
		SecretKey securekey = keyFactory.generateSecret(dks);

		// Cipher对象实际完成解密操作
		Cipher cipher = Cipher.getInstance(DES);

		// 用密钥初始化Cipher对象
		cipher.init(Cipher.DECRYPT_MODE, securekey, sr);

		return cipher.doFinal(data);
	}
}

3.程序启动Main方法

package bing;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import java.util.prefs.Preferences;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Main {
	
	 Preferences pref = Preferences.userRoot().node(this.getClass().getName());//获取一个Preference对象
	 String benjizhucema = pref.get("serialnumber", "");//获取本机的注册码
	 int count = pref.getInt("count", 1);//计数,用来更新序列码
	 String zhuceDate= pref.get("datea", "1970-12-10 09:53:56");//初始化注册时间
	 Date date=new Date();
	 	
	public void zhucePanel(String serialnumber ){//注册面板
		
		final String s=serialnumber;//本机的注册序列号
		final JFrame jf=new JFrame();
		JButton sure=new JButton("注册");
		JTextField xuliema=new JTextField(s);
		xuliema.setEditable(false);
		JLabel shuoming =new JLabel("请输入注册码:");
		final JTextField zhucema=new JTextField(30);
		FlowLayout left=new FlowLayout(FlowLayout.LEFT);
		FlowLayout center=new FlowLayout(FlowLayout.CENTER);
		JPanel northp=new JPanel(center);
		JPanel centerp=new JPanel();
		JPanel leftp=new JPanel();
		JPanel rightp=new JPanel();
		JPanel south=new JPanel(center);
		JPanel center1=new JPanel(left);
		JPanel center2=new JPanel(center);
		northp.add(xuliema);
		centerp.setLayout(new GridLayout(2, 1));
		center1.add(shuoming);
		center2.add(zhucema);
		centerp.add(center1);
		centerp.add(center2);
		south.add(sure);
		jf.add(northp,BorderLayout.NORTH);
		jf.add(leftp,BorderLayout.WEST);
		jf.add(rightp,BorderLayout.EAST);
		jf.add(centerp,BorderLayout.CENTER);
		jf.add(south,BorderLayout.SOUTH);
	
		jf.setSize(400, 180);
		Dimension displaySize = Toolkit.getDefaultToolkit().getScreenSize(); // 获得显示器大小对象  
		Dimension frameSize = jf.getSize();             // 获得窗口大小对象  
		jf.setLocation((displaySize.width - frameSize.width) / 2,  (displaySize.height - frameSize.height) / 2); 
		jf.setResizable(false);
		jf.setVisible(true);
		jf.setTitle("用户注册");
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		sure.addActionListener(new ActionListener() {//注册按钮的单击事件
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				String benjizhucema=zhucema.getText();//输入框填写的注册码
				System.out.println(benjizhucema);
				String rightzhucema=null;
				try {
					rightzhucema=DesUtil.encrypt(s, DesUtil.defaultKey);//通过传入的本机序列号和自定义的秘钥,生成正确的注册码
					System.out.println(rightzhucema);
				} catch (Exception e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				if(benjizhucema.equals(rightzhucema)){//判断填写的注册码是否和正确的注册码一致,如果一致把本机的注册码更改为正确的注册码,如果不一致弹出注册失败
					JOptionPane.showMessageDialog(null, "恭喜你注册成功!","提示",1);
					pref.put("serialnumber", rightzhucema);					
					Date date4=new Date();
					SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
					pref.put("datea", df.format(date4));	//添加注册日期				
					new Form();//跳转到程序界面
					jf.setVisible(false);//注册框消失
					
				}else{
					JOptionPane.showMessageDialog(null, "注册码有误!请重新输入!","提示",1);
					
				}
				
			}
		});
		
	}

	public  boolean zhuce(String serialnumber){
		//pref.put("serialnumber", "");

		String rigthzhucema = null;
		try {
			rigthzhucema=DesUtil.encrypt(serialnumber, DesUtil.defaultKey);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		if (benjizhucema.equals(rigthzhucema)) {
			return true;
		} 	
		
		return false;
	}
	
	
	
	
	//获取本机序列码
	public String getSerialNumber(){
		Process process = null;
		try {
			process = Runtime.getRuntime()
					.exec(new String[] { "wmic", "diskdrive", "get",
							"serialnumber" });
			process.getOutputStream().close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Scanner sc = new Scanner(process.getInputStream());
		String property = sc.next();
		String serial = sc.next();
		
		return ""+pref.getInt("count", 1)+serial;
	}
	
	//日期比较方法
	public void compareTime(Date now){
		long time =15552000000l;
		int tian=(int) (time/1000/60/60/24);
		//System.out.println("--注册天数--"+tian);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date zhuce=null;       
        try {
			zhuce = sdf.parse(zhuceDate);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
       //System.out.println("--当前时间--"+sdf.format(now));
       //System.out.println("--注册时间--"+sdf.format(zhuce));
        
        long time1 = now.getTime();
        long time2 = zhuce.getTime();
        long time3 = time1-time2;
        
        if(time3>=time){
        	//System.out.println(time3);
        	pref.putInt("count", count+1);
        }
	}
	//主函数
	public static void main(String[] args) {	
		Main m=new Main();
		Date now=new Date();//当前日期
		m.compareTime(now);//对比当前时间	减去注册时间是否大于预设的可用日期,如果大于,计数的count+1,不大于则不变
		String s=m.getSerialNumber();//获取序列号(注:序列码由“count”和硬盘序列号组成)
		//System.out.println("--序列码--"+s);	
		boolean b=m.zhuce(s);//传入序列号,判断本机Preference写入的注册码是否为正确的注册码,如果正确,跳转软件界面,否则打开注册面板
		if(b){
			new Form();
		}else{
			m.zhucePanel(s);
		}	
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值