JAVA RSA加密公私钥

RSA加密算法:RSA加密算法是一种非对称加密算法。解密者拥有私钥,并且将由私钥计算生成的公钥发布给加密者。加密都使用公钥进行加密,并将密文发送到解密者,解密者用私钥解密将密文解码为明文。

import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;

import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

public class RSAEncrypt {
	private static Map<String, String> keyMap = new HashMap<String, String>();  //用于封装随机产生的公钥与私钥
	private static Map<String, BigInteger> modMap = new HashMap<>();
	public static void main(String[] args) throws Exception {
		//生成公钥和私钥
		genKeyPair();
		//加密字符串
		String message = "license";
		System.out.println("随机生成的公钥为:" + keyMap.get("publicKeyString"));
		System.out.println("随机生成的私钥为:" + keyMap.get("privateKeyString"));
		String messageEn = encrypt(message,keyMap.get("publicKeyString"));//公钥加密
		System.out.println(message + "\t加密后的字符串为:" + messageEn);
		String messageDe = decrypt(messageEn,keyMap.get("privateKeyString"));//私钥解密
		System.out.println("decrypt还原后的字符串为:" + messageDe);
		String messageDeMod = decryptMod(messageEn,modMap.get("privateMod"), modMap.get("privatePub"));
		System.out.println("decryptMod还原后的字符串为:" + messageDeMod);
		String messageDeModStr = decryptModStr(messageEn,keyMap.get("privateModStr"), keyMap.get("privatePubStr"));
		System.out.println("decryptModStr还原后的字符串为:" + messageDeModStr);
	}

	/**
	 * 随机生成密钥对
	 * @throws NoSuchAlgorithmException
	 */
	public static void genKeyPair() throws NoSuchAlgorithmException {
		// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
		// 初始化密钥对生成器,密钥大小为96-1024位
		keyPairGen.initialize(1024,new SecureRandom());
		// 生成一个密钥对,保存在keyPair中
		KeyPair keyPair = keyPairGen.generateKeyPair();
		RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();   // 得到私钥
		RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  // 得到公钥
		String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));
		// 得到私钥字符串
		String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));
		// 将公钥和私钥保存到Map
		keyMap.put("publicKeyString",publicKeyString);
		keyMap.put("privateKeyString",privateKeyString);  

		String publicModStr = new String(Base64.encodeBase64((publicKey.getModulus().toByteArray())));
		String publicPubStr = new String(Base64.encodeBase64((publicKey.getPublicExponent().toByteArray())));
		String privateModStr = new String(Base64.encodeBase64((privateKey.getModulus().toByteArray())));
		String privatePubStr = new String(Base64.encodeBase64((privateKey.getPrivateExponent().toByteArray())));
		keyMap.put("publicModStr",publicModStr);
		keyMap.put("publicPubStr",publicPubStr);
		keyMap.put("privateModStr",privateModStr);
		keyMap.put("privatePubStr",privatePubStr); 

		modMap.put("publicMod", publicKey.getModulus());
		modMap.put("publicPub", publicKey.getPublicExponent());
		modMap.put("privateMod", privateKey.getModulus());
		modMap.put("privatePub", privateKey.getPrivateExponent());

		System.out.println("publicModStr:"+publicModStr);
		System.out.println("publicPubStr:"+publicPubStr);
		System.out.println("publicMod:"+publicKey.getModulus());
		System.out.println("publicPub:"+publicKey.getPublicExponent());
		System.out.println("privateModStr:"+privateModStr);
		System.out.println("privatePubStr:"+privatePubStr);
		System.out.println("privateMod:"+privateKey.getModulus());
		System.out.println("privatePub:"+privateKey.getPrivateExponent());
	}
	/**
	 * RSA公钥加密
	 *
	 * @param str
	 *            加密字符串
	 * @param publicKey
	 *            公钥
	 * @return 密文
	 * @throws Exception
	 *             加密过程中的异常信息
	 */
	public static String encrypt( String str, String publicKey ) throws Exception{
		//base64编码的公钥
		byte[] decoded = Base64.decodeBase64(publicKey);
		RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
		//RSA加密
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.ENCRYPT_MODE, pubKey);
		String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
		return outStr;
	}

	/**
	 * RSA私钥解密
	 *
	 * @param str
	 *            加密字符串
	 * @param privateKey
	 *            私钥
	 * @return 铭文
	 * @throws Exception
	 *             解密过程中的异常信息
	 */
	public static String decrypt(String str, String privateKey) throws Exception{
		//64位解码加密后的字符串
		byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
		//base64编码的私钥
		byte[] decoded = Base64.decodeBase64(privateKey);
        RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
		//RSA解密
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, priKey);
		String outStr = new String(cipher.doFinal(inputByte));
		return outStr;
	}

	/**
	 * RSA私钥解密
	 *
	 * @param str
	 *            加密字符串
	 * @param privateKey
	 *            私钥
	 * @return 铭文
	 * @throws Exception
	 *             解密过程中的异常信息
	 */
	public static String decryptMod(String str, BigInteger privateMod, BigInteger privatePub) throws Exception{
		//64位解码加密后的字符串
		byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));

		RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(privateMod, privatePub);
        RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(priKeySpec);
		//RSA解密
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, priKey);
		String outStr = new String(cipher.doFinal(inputByte));
		return outStr;
	}

	/**
	 * RSA私钥解密
	 *
	 * @param str
	 *            加密字符串
	 * @param privateKey
	 *            私钥
	 * @return 铭文
	 * @throws Exception
	 *             解密过程中的异常信息
	 */
	public static String decryptModStr(String str, String privateModStr, String privatePubStr) throws Exception{
		//64位解码加密后的字符串
		byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));

		BigInteger privateMod = new BigInteger(Base64.decodeBase64(privateModStr));
		BigInteger privatePub = new BigInteger(Base64.decodeBase64(privatePubStr));
		RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(privateMod, privatePub);
        RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(priKeySpec);
		//RSA解密
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, priKey);
		String outStr = new String(cipher.doFinal(inputByte));
		return outStr;
	}

}

  

原文地址:https://www.cnblogs.com/RealWorld/p/12559259.html

时间: 2024-08-02 08:41:26

JAVA RSA加密公私钥的相关文章

Java RSA 加密解密算法 入门

一.入门闲话 最近在学javase,想拿个小题目练习.拿到一个关于socket接口实现基于TCP协议的通信(准确的说是多进程程序中通信问题.).通信过程中需要用RSA算法进行加解密. 要求进程应用软件A 键盘输入数据后和第一端口号-1存入一SendDate对象sd1中,然后将sd1进行序列化后,将序列化后的数据进行RSA加密(此处的RSA加密用最终接收方D的公钥加密).将第一次RSA加密后的数据和第二端口号P2,存入第二SendDate对象sd2中,接着再将sd2进行序列化,再将sd2 序列化后

java RSA公钥加密,私钥解密算法例子

"非对称加密算法". (1)乙方生成两把密钥(公钥和私钥).公钥是公开的,任何人都可以获得,私钥则是保密的. (2)甲方获取乙方的公钥,然后用它对信息加密. (3)乙方得到加密后的信息,用私钥解密. 如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的.公钥用于加密, 私钥用于解密. RSA 是一种非对称加密算法,一般很难破解,因此一些要求比较高的系统通常会采用rsa加密算法,一般来说用RSA加密有如下几个步骤. 1. 生成公钥与私钥 2. 用公钥对需要加密的字符串等进

C# 与 Java Rsa加密与解密互通

Rsa 加密标准的制定已经过去了十多年了. 这两天在看rsa 加密的文章,基本上都是在说 .net 与 java 之间的 rsa加密是不能互通的.因为项目有用到,所以花了点时间对rsa加密做了一点点了解,发现,不管是java 还是 C# 都对 rsa 的标准加密进行了实现, 是 对于标准是实现,不能互通就讲不过去了. 今天特意写了一段java 代码试了一下,发现是完全可以的. 密钥的描述: C#(.net) 中有三种方式导出密钥,一种是blob,一种是 xml 另一种是参数,其中xml 的方式是

java RSA 生成公钥私钥

/** * 引进的包都是Java自带的jar包 * 秘钥相关包 * base64 编解码 * 这里只用到了编码 */ import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; imp

java RSA加密生成license,用CPU序列号生成机器码

? license里就是一些注册信息,键值对组成的字符串 ? 对称加密: DES,AES,加密解密都用一个秘钥,速度快 非对称机密 RSA,可以私钥加密公钥解密,也可以公钥机密私钥解密,速度慢 注意:RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行.RSA加密对明文的长度是有限制的,如果加密数据过大会抛出异常: ? 常见加密算法 DES? ??? DES是Data Encryption Standard(数据加密标准)的缩写,DES算法为密

java RSA加密解密

该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1. jar 注意: RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行. RSA加密对明文的长度是有限制的,如果加密数据过大会抛出如下异常: Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes

C#-java RSA加密解密

using Org.BouncyCastle.Math;using Org.BouncyCastle.Crypto.Parameters;using Org.BouncyCastle.Security;using Org.BouncyCastle.Asn1.X509;using Org.BouncyCastle.X509;using Org.BouncyCastle.Asn1.Pkcs;using Org.BouncyCastle.Pkcs;using System;using System.S

Java RSA公钥加密,私钥解密算法的尝试

https://www.cnblogs.com/liemng/p/6699257.html 写这篇博客其实是有点意外的,来源最初也算是入职当前这家公司算吧,由于项目要求数据几乎都进行了加密(政府项目么!!!),当时看到这块就想好好看看这块的东西,苦于时间一直寻找不开,慢慢的都忘记了,忽然有天在网上看到一些关于加密的博客,讨论到说支付宝这样的商业软件加密是如何进行操作,后来了解了下,由于我是做android开发的所以我想当然的就下载了一个支付宝的android版本,进阶着就是迫不及待的改后缀,然后

Mac下如何生成RSA加密的私钥和公钥

关于RSA加密算法的介绍这里就不复制粘贴了,下面讲的是如何在Mac下利用命令行生成RSA的私钥和公钥. 使用command生成2048位的私有密钥 openssl genrsa -out private_key.pem 2048 当前的目录下会生成一个名为 private_key.pem 的文件,如果用文本编辑器打开,你会发现是这样的: 这些东西就是我们刚刚生成的密钥,这个东西只能放在服务端,如果这个东西泄漏,整个RSA加密环节就暴露了. 接下来我们利用私钥生成公钥(command命令必须在刚才