java RSA 加密/解密

1 篇文章 0 订阅
package cn.shinkong.cxf.security;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;

import javax.crypto.Cipher;

import org.apache.ws.security.util.Base64;

public class Encryption_RSA {

	/** 指定加密算法为RSA */
	private final String ALGORITHM = "RSA";
	/** 密钥长度,用来初始化 */
	private final int KEYSIZE = 1024;
	/** 指定公钥存放文件 */
	private String PUBLIC_KEY_FILE = "PublicKey";
	/** 指定私钥存放文件 */
	private static final String PRIVATE_KEY_FILE = System.getProperty("user.dir");
	private String path = "";

	/** 生成公钥和私钥
	 */
	@SuppressWarnings("unused")
	private void generateKeyPair() throws Exception {
		// /** RSA算法要求有一个可信任的随机数源 
		// SecureRandom secureRandom = new SecureRandom();
		//为RSA算法创建一个KeyPairGenerator对象 
		KeyPairGenerator keyPairGenerator = KeyPairGenerator
				.getInstance(ALGORITHM);
		// 利用上面的随机数据源初始化这个KeyPairGenerator对象
		// keyPairGenerator.initialize(KEYSIZE, secureRandom);
		keyPairGenerator.initialize(KEYSIZE);
		//生成密匙对 
		KeyPair keyPair = keyPairGenerator.generateKeyPair();
		//得到公钥 
		RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
		// 得到私钥 
		RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate();
		ObjectOutputStream oos1 = null;
		ObjectOutputStream oos2 = null;
		try {
			/** 用对象流将生成的密钥写入文件 (默认在文件下)*/
			oos1 = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY_FILE));
			oos2 = new ObjectOutputStream(
					new FileOutputStream(PRIVATE_KEY_FILE));
			oos1.writeObject(publicKey);
			oos2.writeObject(privateKey);
		} catch (Exception e) {
			throw e;
		} finally {
			/** 清空缓存,关闭文件输出流 */
			oos1.close();
			oos2.close();
		}
	}

	/**
	 * 加密方法
	 * @param String 源数据
	 * @return String 密文
	 * @throws Exception
	 */
	public String encrypt(String source) throws Exception {
		// generateKeyPair();
		RSAPublicKey publicKey;
		ObjectInputStream ois = null;
		try {
			// 将文件中的公钥对象读出 
			ois = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE+path));
			// 从 ObjectInputStream 读取对象。
			publicKey = (RSAPublicKey) ois.readObject();
		} catch (Exception e) {
			throw e;
		} finally {
			ois.close();
		}
		//得到Cipher对象来实现对源数据的RSA加密 
		Cipher cipher = Cipher.getInstance(ALGORITHM);
		// 用密钥初始化此 Cipher。
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		//使用平台的默认字符集将此 String 编码为 byte 序列
		byte[] b = source.getBytes();
		/** 执行加密操作 */
		byte[] b1 = cipher.doFinal(b);

		return Base64.encode(b1);
	}

	/**
	 * 解密算法
	 * 
	 * @param String 密文
	 * @return 数据
	 * @throws Exception
	 */
	public String decrypt(String cryptograph) throws Exception {
		RSAPrivateKey privateKey;
		ObjectInputStream ois = null;
		try {
			/** 将文件中的私钥对象读出 */
			ois = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE+path));
			privateKey = (RSAPrivateKey) ois.readObject();
		} catch (Exception e) {
			throw e;
		} finally {
			ois.close();
		}
		/** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */
		Cipher cipher = Cipher.getInstance(ALGORITHM);
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		//Base64 转码
		byte[] b1 = Base64.decode(cryptograph);
		/** 执行解密操作 */
		byte[] b = cipher.doFinal(b1);
		return new String(b);
	}

	public String getPath() {
		return path;
	}

	public void setPath(String path) {
		this.path = path;
	}

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值