Java加密算法RSA代码实例
这篇文章主要介绍了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,签名。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
关于SpringBoot获取IOC容器中注入的Bean(推荐)
本文通过实例代码给大家详解了springboot获取ioc容器中注入的bean问题,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧2018-05-05
IDEA利用自带Axis工具和wsdl文件反向生成服务端客户端代码图文详解
这篇文章主要介绍了IDEA利用自带Axis工具和wsdl文件反向生成服务端客户端代码详细流程,在这里小编使用的是idea2021.1最新开发工具,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下2021-05-05
Jpa数据操作以及@Query和@Modifying注解使用方式
这篇文章主要介绍了Jpa数据操作以及@Query和@Modifying注解使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-07-07
解决Beanutils.copyproperties实体类对象不一致的问题
这篇文章主要介绍了解决Beanutils.copyproperties实体类对象不一致的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06
详解在Spring MVC中使用注解的方式校验RequestParams
本篇文章主要介绍了详解在Spring MVC中使用注解的方式校验RequestParams ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。2017-03-03
Spring Boot集成FreeMarker 时访问不到.ftl文件的配置步骤
Spring Boot 要集成 FreeMarker 模板引擎时必须经过正确的配置,大致可分为5 个步骤,下面分步骤给大家介绍的非常详细,感兴趣的朋友一起看看吧2025-04-04


最新评论