原创

Java代码演示RSA非对称算法

1.非对称加密

非对称加密也叫做公钥加密。非对称加密与对称加密相比,其安全性更好。对称加密的通信双方使用相同的密钥,如果一方的密钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对密钥,即公钥和私钥,且二者成对出现。私钥被自己保存,不能对外泄露。公钥指的是公共的密钥,任何人都可以获得该密钥。用公钥或私钥中的任何一个进行加密,用另一个进行解密。 被公钥加密过的密文只能被私钥解密,过程如下:

明文 + 加密算法 + 公钥 => 密文, 密文 + 解密算法 + 私钥 => 明文

被私钥加密过的密文只能被公钥解密,过程如下:

明文 + 加密算法 + 私钥 => 密文, 密文 + 解密算法 + 公钥 => 明文

2.加密和解密

环境:

Java版本:JDK1.8

pom.xml

		<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.14</version>
		</dependency>

###RSAEncryptTest.java

package cn.gameboys;
/** 
* Description: 
* @author gameboys(www.gameboys.cn) 
* @date 2020年5月14日 
*/

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.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

import org.apache.commons.codec.binary.Base64;

public class RSAEncryptTest {

	private static String src = "www.gameboys.cn";

	private static RSAPublicKey rsaPublicKey;
	private static RSAPrivateKey rsaPrivateKey;

	static {
		// 1、初始化密钥
		KeyPairGenerator keyPairGenerator;
		try {
			keyPairGenerator = KeyPairGenerator.getInstance("RSA");
			keyPairGenerator.initialize(512);// 64的整倍数
			KeyPair keyPair = keyPairGenerator.generateKeyPair();
			rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
			rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
			System.out.println("Public Key : " + Base64.encodeBase64String(rsaPublicKey.getEncoded()));
			System.out.println("Private Key : " + Base64.encodeBase64String(rsaPrivateKey.getEncoded()));
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 公钥加密,私钥解密
	 * 
	 * @author jijs
	 * @throws Exception
	 */
	public static void pubEn2PriDe() throws Exception {
		// 公钥加密
		X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		byte[] result = cipher.doFinal(src.getBytes());
		System.out.println("公钥加密,私钥解密 --加密: " + Base64.encodeBase64String(result));

		// 私钥解密
		PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
		keyFactory = KeyFactory.getInstance("RSA");
		PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
		cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		result = cipher.doFinal(result);
		System.out.println("公钥加密,私钥解密 --解密: " + new String(result));
	}

	/**
	 * 私钥加密,公钥解密
	 * 
	 * @author jijs
	 * @throws Exception
	 */
	public static void priEn2PubDe() throws Exception {

		// 私钥加密
		PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.ENCRYPT_MODE, privateKey);
		byte[] result = cipher.doFinal(src.getBytes());
		System.out.println("私钥加密,公钥解密 --加密 : " + Base64.encodeBase64String(result));

		// 公钥解密
		X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
		keyFactory = KeyFactory.getInstance("RSA");
		PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
		cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, publicKey);
		result = cipher.doFinal(result);
		System.out.println("私钥加密,公钥解密   --解密: " + new String(result));
	}

	public static void main(String[] args) throws Exception {
		pubEn2PriDe(); // 公钥加密,私钥解密
		priEn2PubDe(); // 私钥加密,公钥解密
	}

}
正文到此结束