package com.msserver.core.util; import java.security.KeyPair; import java.security.PrivateKey; import java.security.PublicKey; import java.security.SecureRandom; public class SecurityUtil { /** * 生成公钥和私钥 * @param SignaturePassword this is your password or keyWord */ @SuppressWarnings("unused") public static void createkey(String signaturePassword) throws Exception{ java.security.KeyPairGenerator keygen=java.security.KeyPairGenerator.getInstance("DSA"); //如果设定随机产生器就用如下代码初始化 SecureRandom secrand=new SecureRandom(); if(null != signaturePassword && !signaturePassword.equals("")){ //对签名密码进行MD5加密 String ressignaturePassword=MD5Util.encode(signaturePassword); System.out.println("原密码 "+signaturePassword); System.out.println("MD5后的密码 "+ressignaturePassword); secrand.setSeed(ressignaturePassword.getBytes()); // 初始化随机产生器 } if(null != secrand){ keygen.initialize(512,secrand); // 初始化密钥生成器 }else if(null == secrand){ //否则 keygen.initialize(512); } //生成密钥公钥 pubkey 和私钥 prikey KeyPair keys=keygen.generateKeyPair(); // 生成密钥组 PublicKey pubkey=keys.getPublic(); PrivateKey prikey=keys.getPrivate(); //分别保存在 myprikey.dat 和 mypubkey.dat 中 , 以便下次不在生成生成密钥对的时间比较长 java.io.ObjectOutputStream out=new java.io.ObjectOutputStream( new java.io.FileOutputStream("F:/myprikey.key"));//私钥保存 out.writeObject(prikey); out.close(); out=new java.io.ObjectOutputStream( new java.io.FileOutputStream("F:/mypubkey.key"));//公钥保存 out.writeObject(pubkey); out.close(); } /** * 使用私钥对信息加密 */ public static void privateEncode(String myinfo) throws Exception{ java.io.ObjectInputStream in=new java.io.ObjectInputStream( new java.io.FileInputStream("F:/myprikey.key")); PrivateKey myprikey=(PrivateKey)in.readObject(); in.close(); //初始一个 Signature 对象 , 并用私钥对信息签名 java.security.Signature signet=java.security.Signature.getInstance("DSA"); signet.initSign(myprikey); signet.update(myinfo.getBytes()); byte[] signed=signet.sign(); System.out.println("私钥签名前的信息 "+myinfo); System.out.println("私钥签名后的信息 "+signed); //把信息和签名保存在一个文件中 (myinfo.dat) java.io.ObjectOutputStream out=new java.io.ObjectOutputStream( new java.io.FileOutputStream("F:/myinfo.dat")); out.writeObject(myinfo); out.writeObject(signed); out.close(); } /** * 公钥 验证 私钥 签名后的信息 * @throws Exception */ public static void validate() throws Exception{ //拿到公钥 java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("F:/mypubkey.key")); PublicKey pubkey=(PublicKey)in.readObject(); in.close(); //读入签名和信息 in=new java.io.ObjectInputStream(new java.io.FileInputStream("F:/myinfo.dat")); String info=(String)in.readObject(); byte[] signed=(byte[])in.readObject(); in.close(); //初始一个 Signature 对象 , 并用公钥和签名进行验证 java.security.Signature signetcheck=java.security.Signature.getInstance("DSA"); signetcheck.initVerify(pubkey); signetcheck.update(info.getBytes()); if (signetcheck.verify(signed)) { System.out.println("签名正常 √"); }else{ System.out.println("签名异常 ×"); } } public static void main(String[] args) throws Exception { createkey("6666662xVVVVxxBxx");//创建公钥和私钥 //privateEncode("这是我的密码为8888888");//私钥对信息进行加密 validate(); } }