文章目录

  • RSA加密算法
  • 直接上代码
    • 工具类:
    • 测试类:
    • 测试结果:

RSA加密算法

一种非对称加密算法,所谓非对称,就是指该算法加密和解密使用不同的密钥,即使用斜体样式加密密钥进行加密、解密密钥进行解密

直接上代码

工具类:

import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;
import java.util.Base64;public class RSAUtil {//将Base64编码后的公钥转换成PublicKey对象public static PublicKey string2PublicKey(String pubStr) throws Exception{byte[] keyBytes = base642Byte(pubStr);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");PublicKey publicKey = keyFactory.generatePublic(keySpec);return publicKey;}//将Base64编码后的私钥转换成PrivateKey对象public static PrivateKey string2PrivateKey(String priStr) throws Exception{byte[] keyBytes = base642Byte(priStr);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");PrivateKey privateKey = keyFactory.generatePrivate(keySpec);return privateKey;}//Base64编码转字节数组public static byte[] base642Byte(String base64Key) throws IOException{Base64.Decoder decoder = Base64.getDecoder();return decoder.decode(base64Key);}/*** 解密方法* @param byte2Base64* @return*/public static String RsaDecrypt(String byte2Base64,String privateKeyStr){byte[] decryptedData=null;try {//将Base64编码后的私钥转换成PrivateKey对象PrivateKey privateKey = RSAUtil.string2PrivateKey(privateKeyStr);Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());cipher.init(2, privateKey);byte[] encryptedData = RSAUtil.base642Byte(byte2Base64);int inputLen = encryptedData.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;for(int i = 0; inputLen - offSet > 0; offSet = i * 256) {byte[] cache;if(inputLen - offSet > 256) {cache = cipher.doFinal(encryptedData, offSet, 256);} else {cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);++i;}decryptedData = out.toByteArray();out.close();}catch (Exception e){e.printStackTrace();}return new String(decryptedData);}/*** 分断加密* @param byte2Base642* @return*/public static String rsaEncrypt(String byte2Base642,String publicKeyStr) {String result = "";try {// 将Base64编码后的公钥转换成PublicKey对象PublicKey publicKey = RSAUtil.string2PublicKey(publicKeyStr);// 加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] inputArray = byte2Base642.getBytes();int inputLength = inputArray.length;// 最大加密字节数,超出最大字节数需要分组加密int MAX_ENCRYPT_BLOCK = 117;// 标识int offSet = 0;byte[] resultBytes = {};byte[] cache = {};while (inputLength - offSet > 0) {if (inputLength - offSet > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(inputArray, offSet, MAX_ENCRYPT_BLOCK);offSet += MAX_ENCRYPT_BLOCK;} else {cache = cipher.doFinal(inputArray, offSet, inputLength - offSet);offSet = inputLength;}resultBytes = Arrays.copyOf(resultBytes, resultBytes.length + cache.length);System.arraycopy(cache, 0, resultBytes, resultBytes.length - cache.length, cache.length);}Base64.Encoder encoder = Base64.getEncoder();result = encoder.encodeToString(resultBytes);} catch (Exception e) {System.out.println(e.toString());System.out.println("rsaEncrypt error:" + e.getMessage());}return result;}}

测试类:

public class Test {public static void main(String[] args) {//公钥String publicKey="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg0doe1LOyn+ha+Hl12/EcwoLpXq30dmVcPTuPHqmBPtSJ6bN5jnaKR8JiGJANPhRkW0BYoI1Xj1hmHAtPEO+Hh/370MKpU2+xddMQJEmE79zONdrKCMxGm3oZWTGQylQLAWEf8SY32nz0hmh2SQ68oKSGxc8L2XIV9DaSsAc3EaRYPawHtThyWV28hUtmRQmKQ/wf5q346Urmu11ZjEZZUyO9NbzpKdxJRdScg8cbFJ8kRpHS+qbIYyGJkit9xqjuJ/g3L9WvgW8LFF5WUxz93a98LYnI90ESKx2ZD+64p4oyeEgJ52PLkpb//tbLapIA47PQS9+deh03FmNazS1GwIDAQAB";//私钥String privateKey="MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCDR2h7Us7Kf6Fr4eXXb8RzCgulerfR2ZVw9O48eqYE+1Inps3mOdopHwmIYkA0+FGRbQFigjVePWGYcC08Q74eH/fvQwqlTb7F10xAkSYTv3M412soIzEabehlZMZDKVAsBYR/xJjfafPSGaHZJDrygpIbFzwvZchX0NpKwBzcRpFg9rAe1OHJZXbyFS2ZFCYpD/B/mrfjpSua7XVmMRllTI701vOkp3ElF1JyDxxsUnyRGkdL6pshjIYmSK33GqO4n+Dcv1a+BbwsUXlZTHP3dr3wticj3QRIrHZkP7rinijJ4SAnnY8uSlv/+1stqkgDjs9BL3516HTcWY1rNLUbAgMBAAECggEASd6LhyFQZReuMDNbjn9Arm7PoNzNxJJHidj4mSV2d8UnNFKi91JEVPE2/vwyHtw/obIRnmmgOBgX65vriEaiGvdoHsS9n8iAeXitWoOSRnhrEGf+zwYGYlXH+A3dlfsQNsUgCnkIgGZxIR71OGcvmDgqmH3Zit4d/nPx8S/qzXNDoLBmXfZPul2Abh4aHGXLFlIoWF6BHX6qyCyCVzuGOt/M9XwL8S762cXystRBDhO8d06WhDY9veuAyBpjlowwYGxfIkQekxo4GaSGQsI+urufysxQSRgbIE8wjExQhwb+5bI/Fs6KpzFrrOZ8p8JhtkwUk6Eyt8WtY1sCGYdwkQKBgQDSd2mjc9Sr5rNaKbb/pxGbGc7KIamrMuFutx/e3b1RNUBylCG/bI7fH43IfMuSQcHae5cgsKc3vL4Q0M3LEM6AbibTXI0BGz2V2fF5BAGruodeJhmPscTRRNmZrgSVHwK0qWkAjXg+uuzQGdJg7QPQPSpS6tJvdozGBfxlVuk76QKBgQCfrjs+nryOUmXXlmcT2M+nrj7OSINAaIqlG5Ds31bYMzn93Z9AG/JchXkDgAVRxGasBInrpH9uDjllGWxy+WdA+kKE/Soob1thjwz4ADUeqLpY+nncNdQOG8Aj/SbEW8sBvuYCggLQ+DwWQ8PLSckiB5fberv0CPTH15qP8tn6YwKBgQDJQzX6/5ZdOIVEcGW2Pj6g0mIke2Jz+3kGVgodJnCXCtRxfWR0WMybY+JC2cwWNdm6I7vWn/eYXl5nWDWjvZOrzypDrtqMN0+CUGMRNZqfbQVsLAT/m6C5+hwYUQfCzl/ZAbQOujpFyp0RN9AtrhmadhNWLYZE3topt6mwAxeQmQKBgQCfp/52ixJunvZTC3++uV5PAwqrCJerM5vEn/5UyK41d2q5aPkMiaTXW2D23e7zpZMe1V7tbEk5SiGa80Oa5cGWl2MhQ1v+l/DfZ7+Iy/RQ1lWUF8T2KCABhz+i/D/hvwIImc2ynjmgpUK25ESFIx5m1v7AJUR+KOJOWkWhPikyjwKBgEShIr/u7GnImcLL5Dd2H4HqUHBVBQv7Ceb8j3oar/milgBtmSow+bZj0fuX1Mu7Xjw9cswgI0npC7Wd1w79wcWVWDeZF+eg2aqME0Uovd3U2HYhZHSTc2r2U59uLkqsl3jm9xI5+dkQi6FX1v067P8TA6R6ZCc6YSNtkb+z/6nP";String string="{\"returnId\":\"9\",\"isRelief\":\"成功\"}";System.out.println("加密内容 : "+string);String encryptRes = RSAUtil.rsaEncrypt(string,publicKey);System.out.println("res加密后的密文 : "+encryptRes);String decryptRes = RSAUtil.RsaDecrypt(encryptRes,privateKey);System.out.println("res加密密文解密后的内容 : "+decryptRes);}
}

测试结果:

加密内容 : {"returnId":"9","isRelief":"成功"}
res加密内容后的密文 : Tur0jUO5zQRFb+S7CFX7qN6oyLQG1IrIEIAAS6yHAlOmkP1/s9CfN09h32wQ7qy/oASiIU+4MtcW2to3ZuwBj1/qeSwg7ceQ9IK5nU4+GT8KpdaqZunEhTKz/U7JSIQRSZFpw7GB8V9JVYM+rrx/dBU+3lzGNPwvlJVhGS16Q8TQlaTZdn/B92S1oZ/cJ1RbAccEhbYBb2mDc+ByCwpYHG8tKHSyCvPILVHDq1hmtg6BuMOhCAZSSXBsC39QjnDwWt9yQ6nY+dL5aQlVwyMkZpCTpSfF9pkIYbH5UiQiZ7hUjrvisxkre7SsAjFyPl1ZnryLCSDZO2DwrZ46mj/0rg==
res加密密文解密后的内容 : {"returnId":"9","isRelief":"成功"}

RSA加密算法-非对称加密算法的使用相关推荐

  1. Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA

    [最简单的加密] 1.简单的概念 明文:加密前的信息 密文:机密后的信息 算法:加密或解密的算法 密钥:算法使用的钥匙(读作miyao,正确应该是miyue,但是大家都读miyao) 2.简单的例子 ...

  2. 第十二章 非对称加密算法-RSA

    注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章"高等加密算法--非对称加密算法" 12.1.RSA(最经典的非对称加密算法) 特点: 使用一套密钥 ...

  3. JAVA加密解密→术语、密码分类、OSI与TCP/IP安全体系、Base64、消息摘要算法MD/SHA/MAC、对称加密算法DES/AES/PBE、非对称加密算法DH/RSA/EIGamaI

    术语 密码分类 OSI与TCP/IP安全体系 JAVA安全 Base64算法 消息摘要算法MD 消息摘要算法MD图解 消息摘要算法SHA 消息摘要算法SHA图解 消息摘要算法MAC 消息摘要算法MAC ...

  4. 常用加密算法之非对称加密算法

    非对称加密算法 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey).公开密钥与私有密钥是一对,如果用公开密钥对数据进行加 ...

  5. 不可逆加密算法有哪些_对称加密算法和非对称加密算法

    对称加密算 对称加密算法是加密和解密时使用相同的密钥,主要用于保证数据的机密性.最具有代表性的算法是20世纪70年代IBM公司提出的DES(dataencryption standard)算法:在此基 ...

  6. 物联网安全系列 - 非对称加密算法 ECDH

    非对称加密算法 - ECDH 背景    之前的章节讲到了对称加密算法AES,发送方和接收方需要使用相同的密钥进行通讯,但是发送方怎么将密钥安全的发送给接收方?这是一个问题. 密钥分配问题    对称 ...

  7. 快速了解常用的非对称加密算法,再也不用担心面试官的刨根问底

    面试官:说一说你常用的加密算法有哪些? 加密算法通常被分为两种:对称加密算法和非对称加密算法.其中,对称加密算法在加密和解密时使用的密钥相同:非对称加密算法在加密和解密时使用的密钥不同,分为公钥和私钥 ...

  8. 对称加密算法与非对称加密算法

    目录 一.什么是对称加密算法 二.常用的对称加密算法 三.AES算法 1.ECB工作模式 2.CBC工作模式 3.小结 四.非对称加密算法 五.对称加密算法与非对称加密算法的区别 一.什么是对称加密算 ...

  9. 非对称加密算法RSA公钥私钥的模数和指数提取方法

    生成非对称加密算法RSA公钥.私钥的方法: 1. 通过OpenSSL库生成,可参考  https://github.com/fengbingchun/OpenSSL_Test/blob/master/ ...

最新文章

  1. 设备漏电对计算机影响,电脑机箱漏电对电脑有影响吗
  2. 程序安装包制作工具 v1.0官方版
  3. FZU - 2042 The Mad Mathematician(数位dp)
  4. Microsoft Teams:团队Owner离开公司后,我们该怎么做?
  5. java.util.concurrent.RejectedExecutionException
  6. python中import文件_Python导入其他文件中的.py文件 即模块
  7. QT中PRO文件写法的详细介绍,很有用,很重要!
  8. windows 系统配置多网关win添加静态路由
  9. [渝粤教育] 中国地质大学 测量学 复习题 (2)
  10. UVALive 7274 Canvas Painting (优先队列)
  11. Apache Qpid Proton 0.16.0,轻量通信库
  12. 加密word文档脱壳教程
  13. JDK中的BitMap实现之BitSet源码分析
  14. 8086/8088寻址方式
  15. Java-Anagram方法
  16. 黑苹果开启硬件加速(Clover)
  17. 今天是第几天python_今_今是什么意思_今字怎么读_今的含义_今字组词-新东方在线字典...
  18. bugtraq mysql,Oracle MySQL Server远程安全漏洞(CVE-2017-3459)
  19. python--web--让python提供api服务--aiohttp
  20. iOS开发- ios学习资源(持续更新)

热门文章

  1. 读《Oracle 数据库应用与实践》
  2. mysql的groupby_MYSQL GROUP BY用法详解
  3. 威纶通触摸屏232脚位_威纶通各系列触摸屏引脚排列.pdf
  4. Word中的SVG格式的矢量插图问题
  5. 计算机应用程序无响应,电脑上应用程序很容易未响应,怎么办?
  6. Blender 插件开发 将object设置成bpy.context.object
  7. Android系统各个版本系统特性整理(1.1-6.0)
  8. 域名与服务器如何绑定?
  9. 数据访问安全代理 CASB
  10. 服务器安全加固三件套