前言

  • 简介
    RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

  • 原理
    根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。

  • 运算速度
    由于进行的都是大数计算,使得RSA最快的情况也比DES慢上好几倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。RSA的速度比对应同样安全级别的对称密码算法要慢1000倍左右。

  • 其它链接
    RSA加密 - Vue
    RSA分段加密 - Java
    RSA分段解密 - Vue

具体实现

  • 实现类
import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;/*** @Description RSA加密算法* @author coisini* @date Jul 5, 2021* @Version 1.0*/
public class RSAUtil {private static final String ALGO = "RSA";private static final String CHARSET = "UTF-8";/*** 公钥 由generateKeyPair()生成*/private static final String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCaaI4MBywkCjIppZnraqN3pbrcZTq/t0+aMBo8K3pK9BDD6XkM6N2Yfcva7BSFbUWuAcI7piXak0UKn9CElDuhNzUSgQn4IXKxIt3Iva5cV83qYumj+0yRjjLT8Muu1Y1rgBZjY9oBwhVoV+Twg25+UJ+6Q6HM4xTwQQJDoyy4jwIDAQAB";/*** 私钥 由generateKeyPair()生成*/private static final String PRIVATE_KEY = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJpojgwHLCQKMimlmetqo3elutxlOr+3T5owGjwrekr0EMPpeQzo3Zh9y9rsFIVtRa4BwjumJdqTRQqf0ISUO6E3NRKBCfghcrEi3ci9rlxXzepi6aP7TJGOMtPwy67VjWuAFmNj2gHCFWhX5PCDbn5Qn7pDoczjFPBBAkOjLLiPAgMBAAECgYBnBBKhG7frY5IMDxwd4Euna767hB4qAlbte+JE+ozgrOzyiDXm0wXk0yjKqm8WhczTRwEbYsImjdKmP/GSQoN1AU7yEzM8j0Jgq46m9ZVrHhu2NpuZpr+XueWnA6FNz6tybBgcCwA4t8dvfbOrvjqhrCu01O1xWIpjronyFBN4IQJBAPGuF58xjXyANnp5YU8NhUQ73tTIveRlOpMXDSYkf9lWG26XIGUIsTe0f5jssiNmYtxG+lUm9LLfZgOLcrVkDZ0CQQCjjrBNMXub49efVTCg+nCGT2QXW2BHg/qs5vu8Y34LUHoD/hoEJ+AOWOdnhpRoYOpBwJAm3Gu4a1VmZGGafp0bAkAdfY3aWhSWtZpwNXF/UPoLCnc1Zc1uGkAchLqRBfEn1w7/3qcQTRA66OaNBYzzLuIvWOXhECDZ1tK+6fw0UCItAkAOLibW6n1fDKf7JnWq30u2OVfiNofoa2bmarhUowOgk3+grP0wcwyX8dlOPnrLeeuVe86DsASe3p9u2zEjJesVAkEAhkLiv4TXrC1QlJl7ghksUfFmdT7M4Zxlzj10ConMgq68HkLdmn2nNLsjhUHGwJe3EqM6aozn4zw/Z7uPIT9Fsw==";/*** 生成密钥对* @throws NoSuchAlgorithmException*/private static void generateKeyPair() throws NoSuchAlgorithmException {// KeyPairGenerator 类用于生成公钥和私钥对,基于RSA算法生成对象KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(ALGO);// 初始化密钥对生成器,密钥大小为 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.getEncoder().encode(publicKey.getEncoded()));// 得到私钥字符串String privateKeyString = new String(Base64.getEncoder().encode((privateKey.getEncoded())));System.out.println(publicKeyString);System.out.println(privateKeyString);}/*** RSA公钥加密* @param data 加密字符串* @return 密文* @throws Exception 加密过程中的异常信息*/private static String encryptByPublicKey(String data) throws Exception {// base64 编码的公钥byte[] decoded = Base64.getDecoder().decode(PUBLIC_KEY);RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance(ALGO).generatePublic(new X509EncodedKeySpec(decoded));// RSA加密Cipher cipher = Cipher.getInstance(ALGO);// 公钥加密cipher.init(Cipher.ENCRYPT_MODE, pubKey);return Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes(CHARSET)));}/*** RSA私钥解密* @param data 加密字符串* @return 明文* @throws Exception 解密过程中的异常信息*/private static String decryptByPrivateKey(String data) throws Exception {byte[] inputByte = Base64.getDecoder().decode(data.getBytes(CHARSET));// base64 编码的私钥byte[] decoded = Base64.getDecoder().decode(PRIVATE_KEY);RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance(ALGO).generatePrivate(new PKCS8EncodedKeySpec(decoded));// RSA 解密Cipher cipher = Cipher.getInstance(ALGO);// 私钥解密cipher.init(Cipher.DECRYPT_MODE, priKey);return new String(cipher.doFinal(inputByte));}/*** 私钥加密* 前端公钥解密* @param data 加密字符串* @return 密文* @throws Exception 加密过程中的异常信息*/public static String encryptByPrivateKey(String data) throws Exception {// 获取私钥PrivateKey privateKey = getPrivateKey(PRIVATE_KEY);Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, privateKey);byte[] cipherText = cipher.doFinal(data.getBytes());String cipherStr = Base64.getEncoder().encodeToString(cipherText);return cipherStr;}/*** 公钥解密* @param data 解密字符串* @return 明文* @throws Exception 解密过程中的异常信息*/public static String decryptByPublicKey(String data) throws Exception {// 获取公钥PublicKey publicKey = getPublicKey(PUBLIC_KEY);Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, publicKey);byte[] cipherText = Base64.getDecoder().decode(data);byte[] decryptText = cipher.doFinal(cipherText);return new String(decryptText);}/*** 将base64编码后的私钥字符串转成PrivateKey实例* @param privateKey 私钥* @return PrivateKey实例* @throws Exception 异常信息*/private static PrivateKey getPrivateKey(String privateKey) throws Exception {byte[] keyBytes = Base64.getDecoder().decode(privateKey);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(ALGO);return keyFactory.generatePrivate(keySpec);}/*** 将base64编码后的公钥字符串转成PublicKey实例* @param publicKey 公钥* @return PublicKey实例* @throws Exception 异常信息*/private static PublicKey getPublicKey(String publicKey) throws Exception {byte[] keyBytes = Base64.getDecoder().decode(publicKey);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(ALGO);return keyFactory.generatePublic(keySpec);}public static void main(String[] args) {String data = "RSA encrypt!";try {// generateKeyPair();String encryDataByPublicKey = encryptByPublicKey(data);System.out.println("encryDataByPublicKey: " + encryDataByPublicKey);String decryDataByPrivateKey = decryptByPrivateKey(encryDataByPublicKey);System.out.println("decryDataByPrivateKey: " + decryDataByPrivateKey);String encryDataByPrivateKey = encryptByPrivateKey(data);System.out.println("encryDataByPrivateKey: " + encryDataByPrivateKey);String decryDataByPublicKey = decryptByPublicKey(encryDataByPrivateKey);System.out.println("decryDataByPublicKey: " + decryDataByPublicKey);} catch (Exception e) {e.printStackTrace();}}}
  • 结果如下所示:

源码

  • GitHub: https://github.com/Maggieq8324/coisini-rsa
  • Gitee:https://gitee.com/maggieq8324/coisini-rsa

- End - - 个人学习笔记 - - 仅供参考 -

RSA加密 - Java相关推荐

  1. ios rsa加密 java解密_iOS RSA加密与解密 签名与验签(附Java端处理)

    本篇文章将涉及以下几个操作: 1.iOS端使用RSA公钥加密,iOS端使用RSA私钥解密. 2.iOS端使用RSA私钥加签,iOS端使用RSA公钥验签. 3.iOS端使用RSA公钥加密,Java端使用 ...

  2. 蓝桥杯习题-2019 第十届-研究生组-RSA加密-java

    题目: 思路: 不会做,身为研究生不知道RSA加密算法正常吗? 然后就是这些题太难了 看看什么是RSA吧 import java.math.BigInteger; import java.util.H ...

  3. Android RSA 加密

    没想到被Android里的RSA加密折腾了几个小时,主要还是自己对RSA加密的原理不了解,然后网上相关的资料也少. 使用AndroidUtilCode工具类中的EncryptUtils.encrypt ...

  4. 一篇搞定RSA加密与SHA签名|与Java完全同步

    看到这篇文章的同学可幸福了,当时在做RSA加密与签名的时候网上的资料简直不要太老,做完后实在是忍受不下去了,这篇文章我会详细讲解iOS如何实现RSA加密与签名,并且与Java完全同步,这是我的第二篇博 ...

  5. obj c和java_PKCS1-padding / RSA加密ios objc和java之间的区别

    我正在为ios和Android开发应用程序.我对加密任务相对来说比较陌生,在过去的3天里,由于无法运行RSA加密,所以我一直在抨击我的头部. 两个客户端都从java服务器接收公钥.在Android中我 ...

  6. C# Java间进行RSA加密解密交互

    C# Java间进行RSA加密解密交互 原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益, ...

  7. javascript rsa java,用javascript与java执行 RSA加密与解密

    用javascript与java执行 RSA加密与解密 2009-12-12 14:58:30   出处:https://www.yqdown.com 这几天一直做安全登录,网上查了好多资料,不尽如意 ...

  8. java RSA加密解密--转载

    原文地址:http://www.blogjava.net/icewee/archive/2012/05/19/378570.html 该工具类中用到了BASE64,需要借助第三方类库:javabase ...

  9. RSA加密解密及数字签名Java实现--转

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...

最新文章

  1. JVM(Java虚拟机)优化大全和案例实战
  2. Linux初学者接住了---Linux常用命令
  3. 【小白学习PyTorch教程】十五、BERT:通过PyTorch来创建一个文本分类的Bert模型
  4. jquery部分方法
  5. 完全数--Python
  6. 怎样采集百家论坛MP3讲座
  7. 声学模型GMM-HMM训练
  8. 企业管理信息系统成功实施的四个阶段
  9. 计算机比赛参赛口号,计算机加油运动会口号
  10. mysql实习报告总结_MySQL数据库实训报告 实训心得
  11. 微信小程序开发工具项目的基本组成结构
  12. 三菱FX系列PLC数据采集和点表自动侦测
  13. linux有什么好的软件,Linux国产软件大盘点
  14. Ubuntu Kylin V10安装python3.10.4
  15. 收集-网站后台优秀文章
  16. 更新3ds时和用读卡器读取传输文件操作不当导致的tf卡损坏无法读取需要格式化时出现的问题以及不想丢失文件并且修复的详细解决方法
  17. 如何防止自己的云服务器被暴力破解密码(限制暴力破解并发送邮件到自己的邮箱)
  18. Eclipse安装插件时,总卡住
  19. Spring项目启动完成后,自动执行一次指定方法
  20. 基于Yaml模板的服务编排部署

热门文章

  1. 售后服务场景智能调度解决方案
  2. 硬件设计22之高速电路设计保险丝的选型
  3. php实现下雪场景,下雪的唯美短句 下雪的场景写一段话
  4. 解决IndexError: invalid index of a 0-dim tensor. Use tensor.item() to convert a 0-dim tensor to a Pyth
  5. 好用的浏览器,与Google Chrome同内核
  6. 查询手机号的归属地及运营商接口
  7. eos 区块链 java 开发_EOS 交易验证的主要思路 - EOS 区块链开发实战
  8. 弘辽科技:拼多多懵懂商家不知道的直通车操作
  9. python-20180103-1
  10. win10开机的微软服务器,部分 Win10 Edge 浏览器开机自动启动,微软确认是 bug