Java加密算法RSA代码实例
时间:2021-03-06 10:09:42|栏目:JAVA代码|点击: 次
这篇文章主要介绍了Java加密算法RSA代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
代码如下
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
public class RSADecrypt {
public static Map<String, String> createKeyPair() throws NoSuchAlgorithmException {
//创建秘钥对生成器
KeyPairGenerator generator = KeyPairGenerator.getInstance("rsa");
//初始化密钥对生成器
generator.initialize(1024);
//生成密钥对
KeyPair keyPair = generator.generateKeyPair();
//获取公钥私钥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
String publicKeyStr = new String(publicKey.getEncoded());
String privateKeyStr = new String(privateKey.getEncoded());
//公钥私钥存放map
Map<String, String> keyMap = new HashMap<>();
keyMap.put("publicKey", publicKeyStr);
keyMap.put("privateKey", privateKeyStr);
return keyMap;
}
/**
* 获取公钥
* @param publicKey
* @return
*/
public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
KeyFactory keyFactory = KeyFactory.getInstance("rsa");
//X509编码
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicKey.getBytes());
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyFactory.generatePublic(x509EncodedKeySpec);
return rsaPublicKey;
}
/**
* 获取私钥
* @param privateKey
* @return
*/
public static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
KeyFactory keyFactory = KeyFactory.getInstance("rsa");
//PKCS#8编码
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(privateKey.getBytes());
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8EncodedKeySpec);
return rsaPrivateKey;
}
/**
* 公钥加密
* @param src
* @param publicKey
* @return
*/
public static byte[] publicEncrypt(String src, RSAPublicKey publicKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
Cipher cipher = Cipher.getInstance("rsa");
cipher.init(Cipher.ENCRYPT_MODE,publicKey);
byte[] encryptedData = cipher.doFinal(src.getBytes());
return encryptedData;
}
/**
* 私钥解密
* @param data
* @param privateKey
* @return
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
public static String privateDecrypt(byte[] data, RSAPrivateKey privateKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
Cipher cipher = Cipher.getInstance("rsa");
cipher.init(Cipher.DECRYPT_MODE,privateKey);
byte[] result = cipher.doFinal(data);
return new String(result);
}
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchPaddingException {
Map<String,String> keyPair = createKeyPair();
RSAPublicKey publicKey = getPublicKey(keyPair.get("publicKey"));
RSAPrivateKey privateKey = getPrivateKey(keyPair.get("privateKey"));
String str = "hello world";
/**
* 公钥加密,私钥解密
*/
byte[] encryptedData = publicEncrypt(str,publicKey);
String result = privateDecrypt(encryptedData, privateKey);
/**
* 私钥加密,公钥解密
*/
byte[] encrypted = privateEncrypt(str, privateKey);
String source = publicDecrypt(encrypted, publicKey);
}
/**
* 私钥加密
* @param src
* @param privateKey
* @return
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
public static byte[] privateEncrypt(String src, RSAPrivateKey privateKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
Cipher cipher = Cipher.getInstance("rsa");
cipher.init(Cipher.DECRYPT_MODE,privateKey);
byte[] result = cipher.doFinal(src.getBytes());
return result;
}
/**
* 公钥解密
* @param data
* @param publicKey
* @return
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
public static String publicDecrypt(byte[] data, RSAPublicKey publicKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
Cipher cipher = Cipher.getInstance("rsa");
cipher.init(Cipher.DECRYPT_MODE,publicKey);
byte[] result = cipher.doFinal(data);
return new String(result);
}
}
上面例子使用密钥长度1024,如果想使用2048密钥,只需要在初始化密钥对生成器做一些变动,其他部分可以复用。
generator.initialize(2048);
这个例子只是基本常用的RSA加解密,也可加入base64,签名。


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




