数字签名,RSA的公私钥加密与解密

package test;

import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;
import javax.crypto.Cipher;

public class RSAUtil {
	public static String data = "12345";
	public static Encoder base64Encoder = Base64.getMimeEncoder();
	public static Decoder base64Decoder = Base64.getMimeDecoder();
	// 公钥
	private static String publicKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/OpVr+aQu6B3stSUgsLcZWpaxatset8zTqat1FF543hoECcTnRqDXKwfX09J+RLCc/1fbITt0s4wUUwJNU7lKJSTGZp5/xHcEiFJjTa+XY6pQHQKvvZjAQMkyzC3H5tmaNTapKYJOAWw7u1dxcRNFdD3k5E+EiqSnlo30u7SLCwIDAQAB";
	// 私钥
	private static String privateKeyStr = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAL86lWv5pC7oHey1JSCwtxlalrFq2x63zNOpq3UUXnjeGgQJxOdGoNcrB9fT0n5EsJz/V9shO3SzjBRTAk1TuUolJMZmnn/EdwSIUmNNr5djqlAdAq+9mMBAyTLMLcfm2Zo1Nqkpgk4BbDu7V3FxE0V0PeTkT4SKpKeWjfS7tIsLAgMBAAECgYBicjt4geV3TIITWVJK2Q76G3vWzIcP8lmdYgzl0l2sZdMI3yqiUeb9vqZkAyWrYZt2x7GoGxyrwL9Nu0pFGuQZFaZIrHRj6LoNq/dgGUpN5zviXUDq2RrhhP7dW4Zc2UbbZqtTzn4jgv8/dviT+LACBmbavojjbb6YZHO/YDml2QJBAPWWu7SkyqfHSDOBBYWyI0GON2ApqTOIsENpQ572IvjNzT8TcXsNRr1hy4o5JfJN4KutBSsJkxAv3+nCc7pvRo0CQQDHVefkgjyuCyQjTtm8WPeIP7Ny8Rul44SmoyaSOANiPufsjIAPvxtNwyvkyUKtI7AMx6XrAWltRMWWiByVH533AkBp87fTfWz46V7a6YTqYyoWtDZrxE19MDFrQ9SqleIMmS09UzQYNGgaeECJx5H5cWPGbQTXxm+uAhmGDiBDhJJZAkEAu84SR1b1OL1CdQmrVyszPGlX9ul3NRphNmbsxkKD3aKK/HF7jlptrRw/VLTSXzIKgl/v0LRp0gtDZgojc9RwDQJBAJ2d0E9huqG9yP0bA9q0lIFwqJogLnoRvQCkNW6hATUrA5b7lrZYniPbwRfSALW2jgweTeTaeouPBHPWbVz/ws8=";
	private static RSAUtil ourInstance = new RSAUtil();

	public static RSAUtil getInstance() {
		return ourInstance;
	}

	// 生成密钥对
	private void generateKeyPair() throws NoSuchAlgorithmException {
		KeyPairGenerator keyPairGenerator;
		keyPairGenerator = KeyPairGenerator.getInstance("RSA");
		keyPairGenerator.initialize(1024);
		KeyPair keyPair = keyPairGenerator.generateKeyPair();
		// 获取公钥,并以base64格式打印出来
		PublicKey publicKey = keyPair.getPublic();
		publicKeyStr = new String(base64Encoder.encodeToString(publicKey.getEncoded()));
		// 获取私钥,并以base64格式打印出来
		PrivateKey privateKey = keyPair.getPrivate();
		privateKeyStr = new String(base64Encoder.encodeToString(privateKey.getEncoded()));
	}

	// 将base64编码后的公钥字符串转成PublicKey实例
	private static PublicKey getPublicKey(String publicKey) throws Exception {
		byte[] keyBytes = base64Decoder.decode(publicKey);
		X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		return keyFactory.generatePublic(keySpec);
	}

	// 将base64编码后的私钥字符串转成PrivateKey实例
	private static PrivateKey getPrivateKey(String privateKey) throws Exception {
		byte[] keyBytes = base64Decoder.decode(privateKey);
		PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		return keyFactory.generatePrivate(keySpec);
	}

	// 公钥加密
	public static String encryptByPublicKey(String content) throws Exception {
		// 获取公钥
		PublicKey publicKey = getPublicKey(publicKeyStr);
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		byte[] cipherText = cipher.doFinal(content.getBytes());
		String cipherStr = base64Encoder.encodeToString(cipherText);
		return cipherStr;
	}

	// 私钥加密
	public static String encryptByPrivateKey(String content) throws Exception {
		// 获取私钥
		PrivateKey privateKey = getPrivateKey(privateKeyStr);
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.ENCRYPT_MODE, privateKey);
		byte[] cipherText = cipher.doFinal(content.getBytes());
		String cipherStr = base64Encoder.encodeToString(cipherText);
		return cipherStr;
	}

	// 私钥解密
	public static String decryptByPrivateKey(String content) throws Exception {
		// 获取私钥
		PrivateKey privateKey = getPrivateKey(privateKeyStr);
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		byte[] cipherText = base64Decoder.decode(content);
		byte[] decryptText = cipher.doFinal(cipherText);
		return new String(decryptText);
	}

	// 公钥解密
	public static String decryptByPublicKey(String content) throws Exception {
		// 获取公钥
		PublicKey publicKey = getPublicKey(publicKeyStr);
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, publicKey);
		byte[] cipherText = base64Decoder.decode(content);
		byte[] decryptText = cipher.doFinal(cipherText);
		return new String(decryptText);
	}


	public static void main(String[] args) throws Exception {
		System.out.println("初始数据:"+data);
		// 公钥加密
		String encryptedBytes = encryptByPublicKey(data);
		System.out.println("公钥加密后:" + encryptedBytes);
		// 私钥解密
		String decryptedBytes = decryptByPrivateKey(encryptedBytes);
		System.out.println("私钥解密后:" + decryptedBytes);
		// 私钥加密
		String encryptedBytes2 = encryptByPrivateKey(data);
		System.out.println("私钥加密后:" + encryptedBytes2);
		// 公钥解密
		String decryptedBytes2 = decryptByPublicKey(encryptedBytes2);
		System.out.println("公钥解密后:" + decryptedBytes2);
	}
}

运行结果:

初始数据:12345
公钥加密后:Hw8BMSBxT6TnYkDDxEV3IT5psy3Esa5SHuN1Z4PY2Y0GOtzQMN1/8mgT/V67OsZvKnoD+JzwBwrU
HVeYEsB+GJ9gCvym5ynCm62hedUE/xIdWYQlCshQFSctGJh84NB7fLjfiSZbKKSvVnuo/x1Amc3L
kzX2TfiJ6R1wpG7RYQk=
私钥解密后:12345
私钥加密后:XP7ygszLRhbEnST36iY51YySNDJS2ZG2IdXrv+1XhIRKIlYXTlebf0Rl7c2OqAe9j7u9VHR+etuw
t7f+KlGx7t3BBz5ICIRhJQsLgD/Neg1zbhPleuzvUkgiyMPAmLUpTJYkrrU2uxP8kb3lj5AoI7bj
ujjLB02Rn2JaPyILebc=
公钥解密后:12345
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值