zoukankan      html  css  js  c++  java
  • JAVA RSA加密公私钥

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

    RSA 密钥最少保存 3 个数,n,d,e
    ne 组成公钥,nd 组成私钥
    其中 e 一般固定 65537,因此知道私钥 nd 就能推出公钥

    如果 e 不是 65537 就不一定能推出了

    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.RSAPublicKeySpec;
    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("privateKeyString"));//私钥加密
    		System.out.println(message + "	加密后的字符串为:" + messageEn);
    		String messageDe = decrypt(messageEn,keyMap.get("publicKeyString"));//公钥解密
    		System.out.println("decrypt还原后的字符串为:" + messageDe);
    		String messageDeMod = decryptMod(messageEn,modMap.get("publicMod"), modMap.get("publicExp"));
    		System.out.println("decryptMod还原后的字符串为:" + messageDeMod);
    		String messageDeModStr = decryptModStr(messageEn,keyMap.get("publicModStr"), keyMap.get("publicExpStr"));
    		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 publicExpStr = new String(Base64.encodeBase64((publicKey.getPublicExponent().toByteArray())));
    		String privateModStr = new String(Base64.encodeBase64((privateKey.getModulus().toByteArray())));
    		String privateExpStr = new String(Base64.encodeBase64((privateKey.getPrivateExponent().toByteArray())));
    		keyMap.put("publicModStr",publicModStr); 
    		keyMap.put("publicExpStr",publicExpStr); 
    		keyMap.put("privateModStr",privateModStr); 
    		keyMap.put("privateExpStr",privateExpStr); 
    		
    		modMap.put("publicMod", publicKey.getModulus());
    		modMap.put("publicExp", publicKey.getPublicExponent());
    		modMap.put("privateMod", privateKey.getModulus());
    		modMap.put("privateExp", privateKey.getPrivateExponent());
    		
    		System.out.println("publicModStr:"+publicModStr);
    		System.out.println("publicExpStr:"+publicExpStr);
    		System.out.println("publicMod:"+publicKey.getModulus());
    		System.out.println("publicExp:"+publicKey.getPublicExponent());
    		System.out.println("privateModStr:"+privateModStr);
    		System.out.println("privateExpStr:"+privateExpStr);
    		System.out.println("privateMod:"+privateKey.getModulus());
    		System.out.println("privateExp:"+privateKey.getPrivateExponent());
    	}  
    	
    	/** 
    	 * RSA私钥加密 
    	 *  
    	 * @param str 
    	 *            加密字符串
    	 * @param privateKey 
    	 *            私钥 
    	 * @return 密文 
    	 * @throws Exception 
    	 *             加密过程中的异常信息 
    	 */  
    	public static String encrypt( String str, String privateKey ) throws Exception{
    		//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.ENCRYPT_MODE, priKey);
    		String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
    		return outStr;
    	}
    	
    	/** 
    	 * RSA公钥解密
    	 *  
    	 * @param str 
    	 *            加密字符串
    	 * @param publicKey 
    	 *            公钥 
    	 * @return 铭文
    	 * @throws Exception 
    	 *             解密过程中的异常信息 
    	 */  
    	public static String decrypt(String str, String publicKey) throws Exception{
    		//64位解码加密后的字符串
    		byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
    		//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.DECRYPT_MODE, pubKey);
    		String outStr = new String(cipher.doFinal(inputByte));
    		return outStr;
    	}
    
    	/** 
    	 * RSA公钥解密
    	 *  
    	 * @param str 
    	 *            加密字符串
    	 * @param publicMod 
    	 *            公钥模数
    	 * @param publicExp 
    	 *            公钥指数
    	 * @return 铭文
    	 * @throws Exception 
    	 *             解密过程中的异常信息 
    	 */  
    	public static String decryptMod(String str, BigInteger publicMod, BigInteger publicExp) throws Exception{
    		//64位解码加密后的字符串
    		byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
    		
    		RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(publicMod, publicExp); 
            RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(pubKeySpec);  
    		//RSA解密
    		Cipher cipher = Cipher.getInstance("RSA");
    		cipher.init(Cipher.DECRYPT_MODE, pubKey);
    		String outStr = new String(cipher.doFinal(inputByte));
    		return outStr;
    	}
    	
    	/** 
    	 * RSA公钥解密
    	 *  
    	 * @param str 
    	 *            加密字符串
    	 * @param publicModStr
    	 *            公钥模数字符串
    	 * @param publicExpStr 
    	 *            公钥指数字符串
    	 * @return 铭文
    	 * @throws Exception 
    	 *             解密过程中的异常信息 
    	 */  
    	public static String decryptModStr(String str, String publicModStr, String publicExpStr) throws Exception{
    		//64位解码加密后的字符串
    		byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
    		
    		BigInteger publicMod = new BigInteger(Base64.decodeBase64(publicModStr));
    		BigInteger publicExp = new BigInteger(Base64.decodeBase64(publicExpStr));
    		RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(publicMod, publicExp); 
            RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(pubKeySpec);  
    		//RSA解密
    		Cipher cipher = Cipher.getInstance("RSA");
    		cipher.init(Cipher.DECRYPT_MODE, pubKey);
    		String outStr = new String(cipher.doFinal(inputByte));
    		return outStr;
    	}
    
    }
  • 相关阅读:
    新年新气象~
    北京不下雪,自己来点雪花看看吧~(附效果图)
    没事写个游戏自己玩~
    原生js实现简单的焦点图效果
    php xdebug扩展无法进入断点问题
    (转)没有IE就没有伤害!浏览器兼容性问题解决方案汇总
    利用mvc filterconfig属性实现权限验证
    c# 替换所有中文、标点符号,全角转半角
    go web 第三天 学习笔记 --mysql
    go web 第二天 学习笔记之文件上传
  • 原文地址:https://www.cnblogs.com/RealWorld/p/12559259.html
Copyright © 2011-2022 走看看