JAVA RSA加密解决及数字签名实现代码

1、代码

package com.zhaochao.utill;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

import javax.crypto.Cipher;

public class RSACoder {
	public static final String KEY_ALGORITHM = "RSA";
	public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
	private static final String PUBLIC_KEY = "RSAPublicKey";
	private static final String PRIVATE_KEY = "RSAPrivateKey";

	public static String sign(byte[] data, String privateKey) throws Exception {
		// 解密由base64编码的私钥
		byte[] keyBytes = decryptBASE64(privateKey);
		// 构造PKCS8EncodedKeySpec对象
		PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
		// KEY_ALGORITHM 指定的加密算法
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		// 取私钥匙对象
		PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
		// 用私钥对信息生成数字签名
		Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
		signature.initSign(priKey);
		signature.update(data);
		return encryptBASE64(signature.sign());
	}

	public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {
		// 解密由base64编码的公钥
		byte[] keyBytes = decryptBASE64(publicKey);
		// 构造X509EncodedKeySpec对象
		X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
		// KEY_ALGORITHM 指定的加密算法
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		// 取公钥匙对象
		PublicKey pubKey = keyFactory.generatePublic(keySpec);
		Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
		signature.initVerify(pubKey);
		signature.update(data);
		// 验证签名是否正常
		return signature.verify(decryptBASE64(sign));
	}

	public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception {
		// 对密钥解密
		byte[] keyBytes = decryptBASE64(key);
		// 取得私钥
		PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
		// 对数据解密
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		return cipher.doFinal(data);
	}

	public static byte[] decryptByPublicKey(byte[] data, String key) throws Exception {
		// 对密钥解密
		byte[] keyBytes = decryptBASE64(key);
		// 取得公钥
		X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		Key publicKey = keyFactory.generatePublic(x509KeySpec);
		// 对数据解密
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.DECRYPT_MODE, publicKey);
		return cipher.doFinal(data);
	}

	public static byte[] encryptByPublicKey(byte[] data, String key) throws Exception {
		// 对公钥解密
		byte[] keyBytes = decryptBASE64(key);
		// 取得公钥
		X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		Key publicKey = keyFactory.generatePublic(x509KeySpec);
		// 对数据加密
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		return cipher.doFinal(data);
	}

	public static byte[] encryptByPrivateKey(byte[] data, String key) throws Exception {
		// 对密钥解密
		byte[] keyBytes = decryptBASE64(key);
		// 取得私钥
		PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
		// 对数据加密
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.ENCRYPT_MODE, privateKey);
		return cipher.doFinal(data);
	}

	private static byte[] decryptBASE64(String key) throws Exception {
		// TODO Auto-generated method stub
		return Base64Utill.decodeBase64(key);
	}

	public static String getPrivateKey(Map<String, Object> keyMap) throws Exception {
		Key key = (Key) keyMap.get(PRIVATE_KEY);
		return encryptBASE64(key.getEncoded());
	}

	private static String encryptBASE64(byte[] encoded) throws Exception {
		// TODO Auto-generated method stub
		return Base64Utill.encodeBase64(encoded);
	}

	public static String getPublicKey(Map<String, Object> keyMap) throws Exception {
		Key key = (Key) keyMap.get(PUBLIC_KEY);
		return encryptBASE64(key.getEncoded());
	}

	public static Map<String, Object> initKey() throws Exception {
		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
		keyPairGen.initialize(1024);
		KeyPair keyPair = keyPairGen.generateKeyPair();
		// 公钥
		RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
		// 私钥
		RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
		Map<String, Object> keyMap = new HashMap<String, Object>(2);
		keyMap.put(PUBLIC_KEY, publicKey);
		keyMap.put(PRIVATE_KEY, privateKey);
		return keyMap;
	}

	public static void testEncode(String publicKey, String privateKey) throws Exception {
		System.err.println("公钥加密——私钥解密");
		String inputStr = "abc";
		byte[] data = inputStr.getBytes();
		byte[] encodedData = RSACoder.encryptByPublicKey(data, publicKey);
		byte[] decodedData = RSACoder.decryptByPrivateKey(encodedData, privateKey);
		String outputStr = new String(decodedData);
		System.err.println("加密前: " + inputStr);
		System.err.println("加密后:" + new String(encodedData));
		System.err.println("解密后:" + outputStr);
		System.err.println(inputStr.equals(outputStr));


	}

	public static void testSign(String publicKey, String privateKey) throws Exception {
		System.err.println("私钥加密——公钥解密");
		String inputStr = "sign";
		byte[] data = inputStr.getBytes();
		byte[] encodedData = RSACoder.encryptByPrivateKey(data, privateKey);
		byte[] decodedData = RSACoder.decryptByPublicKey(encodedData, publicKey);
		String outputStr = new String(decodedData);
		System.err.println("加密前: " + inputStr + "==" + "解密后: " + outputStr);
		System.err.println(inputStr.equals(outputStr));
		System.err.println("私钥签名——公钥验证签名");
		// 产生签名
		String sign = RSACoder.sign(encodedData, privateKey);
		System.err.println("签名:" + sign);
		// 验证签名
		boolean status = RSACoder.verify(encodedData, publicKey, sign);
		System.err.println("状态:" + status);


	}

	public static void main(String[] rags) throws Exception {
		Map<String, Object> keyMap = RSACoder.initKey();
		String publicKey = RSACoder.getPublicKey(keyMap);
		String privateKey = RSACoder.getPrivateKey(keyMap);
		System.err.println("公钥: nr" + publicKey);
		System.err.println("私钥: nr" + privateKey);
		testEncode(publicKey, privateKey);
		testSign(publicKey, privateKey);

	}

}

2、BASE64加密文章

3、测试结果

公钥: nrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcL1QiqQi6cR7FN61u8JxZrGuHUhQcCd5xinbLYRjLuriA1OY3SqnnUZAJQ7xQSIyPhufX7DjZTUqIux9RxSHsoOUPglxqLPudp4bXrVmICXiTeX7XlqlEJ3iBMIbWd9QXWfi9j6awX/8rBkssgnL7rVvYcJxqUN/6iMbRP6L0GQIDAQAB
私钥: nrMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJwvVCKpCLpxHsU3rW7wnFmsa4dSFBwJ3nGKdsthGMu6uIDU5jdKqedRkAlDvFBIjI+G59fsONlNSoi7H1HFIeyg5Q+CXGos+52nhtetWYgJeJN5fteWqUQneIEwhtZ31BdZ+L2PprBf/ysGSyyCcvutW9hwnGpQ3/qIxtE/ovQZAgMBAAECgYBrMSRqYV7HLunyawMSF/sGpIpsJk387F0JygE8FljBQlZsvTF/kzPGubjEUwPEifZGb01haROfOCfGbb7SDRz5SvRK+O5+id7m9jxssqE0RaneWn+DPgaqiuVjHUFdYCYQpz9LrZvleennMZcT4v82jqrj7wS095e36L1uA7hrcQJBAMtwNVTt5VPNA8jV/VQQ7d9vTyHa2eBM5Ndz/tb+LCi7tEs/C/qiuPTnNaILS7J0O+3dCxBV2+JgelIjpesXTQ0CQQDEibB9xs8ntK1/zg0JkAx5VHsKrLHl3OyLiNT0AtMzJbNaIJMQh7bAiGxBt6X5Dahfn9gMWaJvipizl+PX9fg9AkEAhuEnSt7LTAtCNhbCdckfnSMUaRLLn237z2klje9I4dzJRZZQX+UhEaZ1pbEth+yOiz8hhbwXI/jpQKpH6B0zxQJBAMAxRX455GoXrXLFtModK5Wan5gYuP7nxAnPjS/xc0cZHwKLyETp8jTlM7gwNwYN7RFV5phtLwOUrS8y4YRW7KECQG/fO2HsWmZf/iF9sUa5lCeqt9KjHTQMmFC7j7ktaWuwXeqx27to/JfPe3kU0CWwWsKTrBYLYcY1ClM/za+yuuU=
公钥加密——私钥解密
加密前: abc
加密后:?"]Tރ���7��iJ����Cc�[ɠ�,��C�~EQ^w�\_B�S��M���r�S'ڲl7Z1��L��T�E��7�T�_�l%ѭ�L�|f��k��c�p,r��w�A
]�1U���Q|�
解密后:abc
true
私钥加密——公钥解密
加密前: sign==解密后: sign
true
私钥签名——公钥验证签名
签名:c4s5fSVDa6IrEIamAuJ5MxPADq7xsvJ5sVR3KguTLxWfsGZKTS4fCh01neiqZuRB/0e0d6n++cdDNwVwYrR6DQHINg2Uv3Y8mMzG0Sp/EnJAjqRmOP/b2kkIzAAS/UEuEdPLFSLex9cvVggdRK9V57XEeO0f7Qy7qaEcz+JmAZs=
状态:true


原文地址:https://www.cnblogs.com/whzhaochao/p/5023415.html