import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.util.UUID;

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

// 生成一对文件 publicKey.key 和 privateKey.key ,
// 公钥要用户发送 ( 文件 , 网络等方法 ) 给其它用户 , 私钥保存在本地
public class PiPuKeyPairs {
	public static void main(String[] args) {
		//getGeneralKeyPairs();
		String seed=UUID.randomUUID().toString();
		getSeSeedKeyPairs(seed);
	}

	public static boolean getGeneralKeyPairs() {
		try {
			// 初始化签名秘钥
			KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");
			keyPairGenerator.initialize(512);
			// 初始化公私秘钥对
			KeyPair keyPair = keyPairGenerator.genKeyPair();
			// 获取公钥
			PublicKey publicKey = keyPair.getPublic();
			// 获取私钥
			PrivateKey privateKey = keyPair.getPrivate();
			
			// 生产公钥文件UTF-8格式字符串
			OutputStreamWriter outputStreamWriter_pub = new OutputStreamWriter(new FileOutputStream("publicKey.key"), "UTF-8");
				outputStreamWriter_pub.write(encodeBase64(publicKey.toString()));
				outputStreamWriter_pub.close();
			System.out.println("公钥:\n" + encodeBase64(publicKey.toString()));
				
			// 生产公钥文件UTF-8格式字符串
			OutputStreamWriter outputStreamWriter_pri = new OutputStreamWriter(new FileOutputStream("privateKey.key"), "UTF-8");
				outputStreamWriter_pri.write(encodeBase64(privateKey.toString()));
				outputStreamWriter_pri.close();
			System.out.println("私钥:\n" + encodeBase64(privateKey.toString()));
			
			//生成
			System.out.println("秘钥对生成完成.....");
		return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * 自定义种子生成策略
	 * @param seed
	 * @return
	 */
	public static boolean getSeSeedKeyPairs(String seed) {
		try {
			// 初始化签名秘钥
			KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");
			
			 SecureRandom secureRandom=new SecureRandom();
			 	secureRandom.setSeed(seed.getBytes());
			 keyPairGenerator.initialize(512,secureRandom);
			// 初始化公私秘钥对
			KeyPair keyPair = keyPairGenerator.genKeyPair();
			// 获取公钥
			PublicKey publicKey = keyPair.getPublic();
			// 获取私钥
			PrivateKey privateKey = keyPair.getPrivate();
			
			// 生产公钥文件UTF-8格式字符串
			OutputStreamWriter outputStreamWriter_pub = new OutputStreamWriter(new FileOutputStream("publicKey2.key"), "UTF-8");
				outputStreamWriter_pub.write(encodeBase64(publicKey.toString()));
				outputStreamWriter_pub.close();
			System.out.println("公钥:\n" + encodeBase64(publicKey.toString()));
				
			// 生产公钥文件UTF-8格式字符串
			OutputStreamWriter outputStreamWriter_pri = new OutputStreamWriter(new FileOutputStream("privateKey2.key"), "UTF-8");
				outputStreamWriter_pri.write(encodeBase64(privateKey.toString()));
				outputStreamWriter_pri.close();
			System.out.println("\n私钥:\n" + encodeBase64(privateKey.toString()));
			
			//生成
			System.out.println("\n 秘钥对生成完成.....");
		return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	
	// 对字符密码加密
	public static String encodeBase64(String str) throws Exception {
		// 1.将传递进来的字符串密码 转换为字节数组 放到base64加密工具里 生产出一个加了密的字符串
		String base64Str = new BASE64Encoder().encode(str.getBytes("UTF-8"));
		return base64Str;
	}

	// 对密文字符串解密
	public static String decodeBase64(String base64Str) throws Exception {
		// 根据加了密的字符串 使用base64的解密工具里 获取原来的明文字符串密码
		byte[] bytes = new BASE64Decoder().decodeBuffer(base64Str);
		String generalStr = new String(bytes, "UTF-8");
		return generalStr;
	}

}

//运行结果

java安全架构____java 秘钥对生成_base64


//文件

java安全架构____java 秘钥对生成_java公钥_02

//文件

java安全架构____java 秘钥对生成_java公钥_03