龙空技术网

Java加密与解密之非对称加密RSA

Spring全家桶实战案例 119

前言:

如今同学们对“javarsa加密文件”大概比较看重,咱们都想要知道一些“javarsa加密文件”的相关文章。那么小编在网上网罗了一些对于“javarsa加密文件””的相关文章,希望小伙伴们能喜欢,咱们快快来了解一下吧!

非对称加密算法由于效率相比较较为低,一般非对称加密算会与对称加密算法相结合使用,用非对称加密算法来加密对称加密算法的密钥,而对称加密算法来完成对数据的加密(对称加密算法的效率要高的多)。

非对称加密算法对加密的数据长度是有要求的不同密钥长度对加密数据的大小有限制。

1978年,美国麻省理工学院(MIT)的Ron Rivest、Adi Shamir和Leonard Adleman三位学者提出了一种新的非对称加密算法,这种算法是以这三位学者的姓氏开头字母命名,被称为RSA算法。

RSA是非对称加密算法的国际标准。RSA算法不仅可以用来对数据加密还可以用来数字前面。RSA相比对称加密算法(DES,AES)要慢的多,同时对称加密算法只有一个密钥,废队长加密是有两个密钥,一个公钥(公开),一个私钥(保密)。简单理解就是公钥是发放给第三方用的是公开的,私钥则是由自己保留。公钥加密的数据,必须有对应的私钥来解密,私钥加密的数据也必须由对应公钥解密。

Java7(Java8中应该也差不多)于BC对比实现

Java代码实现:

package com.pack.security.rsa;import java.nio.charset.Charset;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.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.HashMap;import java.util.Map;import javax.crypto.Cipher;public class RSAMain {		public static final String RSA_ALGORITHM = "RSA" ;	public static final String PUBLIC_KEY = "RSAPublicKey" ;	public static final String PRIVATE_KEY = "RSAPrivateKey" ; 		/**	 * @desc 	 *     RSA密钥长度	 *     默认1024	 */	public static final int KEY_SIZE = 1024 ;		/**	 * @author xg	 * @throws Exception 	 * @return Map<String,Key>	 * @desc	 *     初始化RSA密钥对	 */	public static Map<String, Key> initRSAKey() throws Exception {		Map<String, Key> keys = new HashMap<>() ;		// 实例化密钥对生成器		KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM) ;		// 初始化密钥对长度		keyPairGenerator.initialize(KEY_SIZE) ;		// 生成密钥对		KeyPair keyPair = keyPairGenerator.genKeyPair() ;		// 获取公钥		PublicKey publicKey = keyPair.getPublic() ;		// 获取私钥		PrivateKey privateKey = keyPair.getPrivate() ;		keys.put(PUBLIC_KEY, publicKey) ;		keys.put(PRIVATE_KEY, privateKey) ;		return keys ;	}		/**	 * @author xg	 * @param keys	 * @throws Exception 	 * @return byte[]	 * @desc	 *     获取公钥	 */	public static byte[] getPublicKey(Map<String, Key> keys) throws Exception {		return keys.get(PUBLIC_KEY).getEncoded() ;	}		/**	 * @author xg	 * @param keys	 * @throws Exception 	 * @return byte[]	 * @desc	 *     获取私钥	 */	public static byte[] getPrivateKey(Map<String, Key> keys) throws Exception {		return keys.get(PRIVATE_KEY).getEncoded() ;	}		/**	 * @author xg	 * @param data	 * @param key	 * @throws Exception 	 * @return byte[]	 * @desc	 *     私钥解密	 */	public static byte[] decryptByPrivateKey(byte[] data, byte[] key) throws Exception {		// 获取私钥		PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(key) ;		// 获取密钥工厂		KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM) ;		// 生成私钥对象		PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec) ;		// 对数据解密		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()) ;		cipher.init(Cipher.DECRYPT_MODE, privateKey) ;		return cipher.doFinal(data) ;	}		/**	 * @author xg	 * @param data // 加密后的数据	 * @param key // 公钥	 * @throws Exception 	 * @return byte[]	 * @desc	 *     公钥解密	 */	public static byte[] decryptByPublicKey(byte[] data, byte[] key) throws Exception {		// 获取公钥		X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(key) ;		// 获取密钥工厂		KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM) ;		// 生成公钥对象		PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec) ;		// 对数据解密		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()) ;		cipher.init(Cipher.DECRYPT_MODE, publicKey) ;		return cipher.doFinal(data) ;	}		/**	 * @author xg	 * @param data	 * @param key	 * @throws Exception 	 * @return byte[]	 * @desc	 *     私钥加密	 */	public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception {		// 获取私钥		PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(key) ;		// 获取密钥工厂		KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM) ;		// 生成私钥对象		PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec) ;		// 对数据解密		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()) ;		cipher.init(Cipher.ENCRYPT_MODE, privateKey) ;		return cipher.doFinal(data) ;	}		/**	 * @author xg	 * @param data	 * @param key	 * @throws Exception 	 * @return byte[]	 * @desc	 *     公钥加密	 */	public static byte[] encryptByPublicKey(byte[] data, byte[] key) throws Exception {		// 获取公钥		X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(key) ;		// 获取密钥工厂		KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM) ;		// 生成公钥对象		PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec) ;		// 对数据解密		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()) ;		cipher.init(Cipher.ENCRYPT_MODE, publicKey) ;		return cipher.doFinal(data) ;	}		public static void main(String[] args) throws Exception {		byte[] data = "JavaRSA算法".getBytes(Charset.forName("UTF-8")) ;		Map<String, Key> keys = initRSAKey() ;		// 私钥加密,公钥解密		byte[] encryptDataPrivate = encryptByPrivateKey(data, getPrivateKey(keys)) ;		System.out.println("私钥加密,公钥解密: " + new String(decryptByPublicKey(encryptDataPrivate, getPublicKey(keys)), "UTF-8")) ;				// 公钥加密,私钥解密		byte[] encryptDataPublic = encryptByPublicKey(data, getPublicKey(keys)) ;		System.out.println("公钥加密,私钥解密: " + new String(decryptByPrivateKey(encryptDataPublic, getPrivateKey(keys)), "UTF-8")) ;	}	}

代码中注释写的很全了,就不再解释了。

执行结果:

完毕!!!

标签: #javarsa加密文件 #rsa是非对称加密算法 #javarsa密钥对 #javarsa加密算法