RSA加密算法(仅公钥加密,私钥解密)

1.RSA的介绍

RSA加密算法是一种非对称加密算法。在公开密钥加密电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。 

想了解算法的可以去这个链接了解一下,介绍挺详细的。

https://blog.csdn.net/ly131420/article/details/38400583


2.RSA代码

需要两个jar包,Base64和BASE64Decoder,用于转码和解码。

import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;

public class RSA {
	/**
	 * 转换私钥
	 * 
	 * @param key 字符串的私钥
	 */
	public static PrivateKey getPrivateKey(String key) throws Exception {
		byte[] keyBytes;
		keyBytes = (new BASE64Decoder()).decodeBuffer(key);
		PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
		return privateKey;
	}

	/**
	 * 转换公钥
	 * 
	 * @param key 字符串的公钥
	 */
	public static PublicKey getPublicKey(String key) throws Exception {
		byte[] keyBytes;
		keyBytes = (new BASE64Decoder()).decodeBuffer(key);
		X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		PublicKey publicKey = keyFactory.generatePublic(keySpec);
		return publicKey;
	}

	/**
	 * 加密
	 * 
	 * @param str_plaintext 需要加密的数据
	 * @param str_publicKey 加密公钥--字符串
	 * @param str_priK      加密私钥--字符串
	 */
	public static String encrypt(String str_plaintext, String str_publicKey) throws Exception {
		PublicKey publicKey = getPublicKey(str_publicKey);
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		byte[] bt_plaintext = str_plaintext.getBytes();
		byte[] bt_cipher = cipher.doFinal(bt_plaintext);
		return Base64.encodeBase64String(bt_cipher);
	}

	/**
	 * 解密
	 * 
	 * @param str_plaintext  需要解密的数据
	 * @param str_pubK       解密公钥--字符串
	 * @param str_privateKey 解密私钥--字符串
	 */
	public static String decrypt(String str_cipher, String str_privateKey) throws Exception {
		PrivateKey privateKey = getPrivateKey(str_privateKey);
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		// return Base64.encodeBase64String(b);
		byte[] bt_encrypted = Base64.decodeBase64(str_cipher);
		byte[] bt_original = cipher.doFinal(bt_encrypted);
		String str_original = new String(bt_original);
		return str_original;
	}

	public static void main(String[] args) {
		String str_pubK = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqPvovSfXcwBbW8cKMCgwqNpsYuzF8RPAPFb7LGsnVo44JhM/xxzDyzoYtdfNmtbIuKVi9PzIsyp6rg+09gbuI6UGwBZ5DWBDBMqv5MPdOF5dCQkB2Bbr5yPfURPENypUz+pBFBg41d+BC+rwRiXELwKy7Y9caD/MtJyHydj8OUwIDAQAB";
		String str_priK = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKo++i9J9dzAFtbxwowKDCo2mxi7MXxE8A8VvssaydWjjgmEz/HHMPLOhi1182a1si4pWL0/MizKnquD7T2Bu4jpQbAFnkNYEMEyq/kw904Xl0JCQHYFuvnI99RE8Q3KlTP6kEUGDjV34EL6vBGJcQvArLtj1xoP8y0nIfJ2Pw5TAgMBAAECgYAGGB8IllMwxceLhjf6n1l0IWRH7FuHIUieoZ6k0p6rASHSgWiYNRMxfecbtX8zDAoG0QAWNi7rn40ygpR5gS1fWDAKhmnhKgQIT6wW0VmD4hraaeyP78iy8BLhlvblri2nCPIhDH5+l96v7D47ZZi3ZSOzcj89s1eS/k7/N4peEQJBAPEtGGJY+lBoCxQMhGyzuzDmgcS1Un1ZE2pt+XNCVl2b+T8fxWJH3tRRR8wOY5uvtPiK1HM/IjT0T5qwQeH8Yk0CQQC0tcv3d/bDb7bOe9QzUFDQkUSpTdPWAgMX2OVPxjdq3Sls9oA5+fGNYEy0OgyqTjde0b4iRzlD1O0OhLqPSUMfAkEAh5FIvqezdRU2/PsYSR4yoAdCdLdT+h/jGRVefhqQ/6eYUJJkWp15tTFHQX3pIe9/s6IeT/XyHYAjaxmevxAmlQJBAKSdhvQjf9KAjZKDEsa7vyJ/coCXuQUWSCMNHbcR5aGfXgE4e45UtUoIE1eKGcd6AM6LWhx3rR6xdFDpb9je8BkCQB0SpevGfOQkMk5i8xkEt9eeYP0fi8nv6eOUcK96EXbzs4jV2SAoQJ9oJegPtPROHbhIvVUmNQTbuP10Yjg59+8=";

		String str_plaintext = "aaaaa";
		try {
			String encrypt = encrypt(str_plaintext, str_pubK);
			System.out.println("加密后的数据:" + encrypt);
			String decrypt = decrypt(encrypt, str_priK);
			System.out.println("解密后的数据:" + decrypt);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

猜你喜欢

转载自blog.csdn.net/qq_42035966/article/details/81332466
今日推荐