RSA加密---java和node兼容版(可直接复制使用)

目录

背景

实现

一、node代码

1、引入依赖

2、生成公钥和私钥

3、生成工具类

二、java代码

背景

本来项目的后端是node,里面登录接口用的是后端生成RSA公钥和私钥,公钥给前端网页用来加密,node后端解密,一切很和谐,突然要我上一个Android应用,结果java和node两边就是无法通配。

原因:默认的RSA加解密格式不一样,node默认的 'pkcs1_oaep', 而java中默认的是pkcs8

解决方法:两边都采用同一种模式就好了,这里我修改node为pkcs8.

实现

一、node代码

1、引入依赖

npm install node-rsa

2、生成公钥和私钥

const NodeRSA = require('node-rsa')// 生成密文(和java通用版本)
var key = new NodeRSA({b: 1024})
var privateKey = key.exportKey('pkcs8-private')
var publicKey = key.exportKey('pkcs8-public-pem')console.log(privateKey)
console.log(publicKey)

效果如下:

 

3、生成工具类

const NodeRSA = require('node-rsa')var publicKey = '-----BEGIN PUBLIC KEY-----\n' +'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9WbdF8v9qt9u1nEbUnWLlDa/e\n' +'3gc67MhCgzRlwq+s7xVP6usKJbqB7FUIM0k1e7nx1eMgmpkL4y4sLjuWzms6OXo5\n' +'OFdb64RbdTKfo91bBVW9kWov8SiLL3/Y5NlEtG+uG0DWZSbBc73vPQlvUT/6Kuy9\n' +'7qFpCjXmyIDbHLUKQQIDAQAB\n' +'-----END PUBLIC KEY-----'var privateKey = '-----BEGIN PRIVATE KEY-----\n' +'MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAL1Zt0Xy/2q327Wc\n' +'RtSdYuUNr97eBzrsyEKDNGXCr6zvFU/q6woluoHsVQgzSTV7ufHV4yCamQvjLiwu\n' +'O5bOazo5ejk4V1vrhFt1Mp+j3VsFVb2Rai/xKIsvf9jk2US0b64bQNZlJsFzve89\n' +'CW9RP/oq7L3uoWkKNebIgNsctQpBAgMBAAECgYB+KRK15oxL/KjFPpTrANptp0rx\n' +'AZprpmxf9K+qxabrYHkgwHNOVYkJHAAj8JfsrL1d5pbomFk01G9lPICzoGFMSaNA\n' +'kFlC15Td6/ERbDrIXjDjcggL8FfkWm1mb3UEZJsN/dLCclMDCEYnLMgfBKrj651+\n' +'Y9wvlqn0cltrIThbSQJBAO+U10ZHVnzO1A+FFN5NK7yoqGn/mOvwPIObEyASGznK\n' +'X0EpDcamt5giH7GrTaId24vILX1MpI+YamU3xzp3w/8CQQDKU6KUALBuKOLQrYW4\n' +'4wtdBiOSHsYbcMXJoXC+NAhwb6kz1aCnGRfxtzpVZmMtaoIzxuzmqdya09OTazyX\n' +'KjG/AkEAgqdM7wqgY9f3Va9hvgmfvHbNwWCeaKzOk4bSWz8EkfOHFuXomVj57oFN\n' +'f3rID4zw2b4E8LwHUjfwbdqJT51YyQJBAKsP/1tHIeRhqTNqIq9pN0hVUmnOnwzA\n' +'UlnhpyMJd0EpB1QOAKCG9NmnYyilQqE5dhA01kNHxn8ZLb9sYXQldp0CQQC1DOqN\n' +'5N8xx/k65MFgxIM/asyRhe6YCG7SCIAdyAau0S7v+Qf7R6tX4jWHWxhQfRl2dHKx\n' +'a3JZu+LOb8XwDxNQ\n' +'-----END PRIVATE KEY-----'var key = new NodeRSA()
key.importKey(privateKey, 'pkcs8-private')
key.importKey(publicKey, 'pkcs8-public-pem')// 加密
function encryption (data) {try {const dataEncry = key.encrypt(data, 'base64')// 返回结果return JSON.stringify({code: 200,data: dataEncry})} catch (e) {// 返回错误return JSON.stringify({code: 500,data: e})}
}// 解密
function decryption (data) {try {const dataDecry = key.decrypt(data, 'utf8')// 返回结果return JSON.stringify({code: 200,data: dataDecry})} catch (e) {// 返回错误return JSON.stringify({code: 500,data: e})}
}module.exports = {encryption,decryption
}

二、java代码

1、直接上工具类

注意:java代码中的公钥不需要开头和结尾的【-----BEGIN PUBLIC KEY-----】这个,只需要保留中间的密钥就好,且不要留有换行符【\n】。

import android.os.Build;import androidx.annotation.RequiresApi;import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;/*** Rsa加解密工具(node后端通用版本)*/
public class RsaUtil {/*** Rsa加密* @param data 需要加密的数据* @return 返回密文*/@RequiresApi(api = Build.VERSION_CODES.O)public static String encrypt(String data) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {byte[] dataBytes = data.getBytes();if (dataBytes.length > 214) throw new RuntimeException("不能一次性加密超过214字节的数据");String pubKey ="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9WbdF8v9qt9u1nEbUnWLlDa/e" +"3gc67MhCgzRlwq+s7xVP6usKJbqB7FUIM0k1e7nx1eMgmpkL4y4sLjuWzms6OXo5" +"OFdb64RbdTKfo91bBVW9kWov8SiLL3/Y5NlEtG+uG0DWZSbBc73vPQlvUT/6Kuy9" +"7qFpCjXmyIDbHLUKQQIDAQAB";Base64.Decoder decoder = Base64.getDecoder();byte[] keyBytes = decoder.decode(pubKey);X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);KeyFactory kf = KeyFactory.getInstance("RSA");PublicKey pk = kf.generatePublic(spec);byte[] cipherText;Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding");cipher.init(Cipher.ENCRYPT_MODE, pk);cipherText = cipher.doFinal(dataBytes);Base64.Encoder encoder = Base64.getEncoder();return encoder.encodeToString(cipherText);}/*** Rsa解密* @param data 需要解密的数据* @return 明文*/@RequiresApi(api = Build.VERSION_CODES.O)public static String decrypt(String data) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {String privateKey ="MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAL1Zt0Xy/2q327Wc" +"RtSdYuUNr97eBzrsyEKDNGXCr6zvFU/q6woluoHsVQgzSTV7ufHV4yCamQvjLiwu" +"O5bOazo5ejk4V1vrhFt1Mp+j3VsFVb2Rai/xKIsvf9jk2US0b64bQNZlJsFzve89" +"CW9RP/oq7L3uoWkKNebIgNsctQpBAgMBAAECgYB+KRK15oxL/KjFPpTrANptp0rx" +"AZprpmxf9K+qxabrYHkgwHNOVYkJHAAj8JfsrL1d5pbomFk01G9lPICzoGFMSaNA" +"kFlC15Td6/ERbDrIXjDjcggL8FfkWm1mb3UEZJsN/dLCclMDCEYnLMgfBKrj651+" +"Y9wvlqn0cltrIThbSQJBAO+U10ZHVnzO1A+FFN5NK7yoqGn/mOvwPIObEyASGznK" +"X0EpDcamt5giH7GrTaId24vILX1MpI+YamU3xzp3w/8CQQDKU6KUALBuKOLQrYW4" +"4wtdBiOSHsYbcMXJoXC+NAhwb6kz1aCnGRfxtzpVZmMtaoIzxuzmqdya09OTazyX" +"KjG/AkEAgqdM7wqgY9f3Va9hvgmfvHbNwWCeaKzOk4bSWz8EkfOHFuXomVj57oFN" +"f3rID4zw2b4E8LwHUjfwbdqJT51YyQJBAKsP/1tHIeRhqTNqIq9pN0hVUmnOnwzA" +"UlnhpyMJd0EpB1QOAKCG9NmnYyilQqE5dhA01kNHxn8ZLb9sYXQldp0CQQC1DOqN" +"5N8xx/k65MFgxIM/asyRhe6YCG7SCIAdyAau0S7v+Qf7R6tX4jWHWxhQfRl2dHKx" +"a3JZu+LOb8XwDxNQ";//64位解码加密后的字符串Base64.Decoder decoder = Base64.getDecoder();byte[] inputByte = decoder.decode(data.getBytes("UTF-8"));//base64编码的私钥byte[] decoded = decoder.decode(privateKey);RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));//RSA解密Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding");cipher.init(Cipher.DECRYPT_MODE, priKey);return new String(cipher.doFinal(inputByte));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是MOM?为什么它是趋势

制造运营管理(MOM) 制造运营管理(MOM)旨在优化制造流程的效率和有效性。它涵盖制造执行、质量管理、生产计划和调度以及制造智能等功能。这种解决方案以全面的方式管理和增强制造流程。 MOM的功能特点 对于MOM的功能特点来说&…

Office Word自动编号转文本

原理 使用office自带的宏功能,一键替换 过程 调出word的“开发工具”选项 文件->选项->自定义功能区->选中开发工具->确定 创建宏 开发工具->宏->创建宏 编写宏 在弹出来的框里,替换代码为 Sub num2txt() ActiveDocument.…

前端请求没问题,后端正常运行,但查不出数据

写代码时写得快了些,Orders.的订单状态写错了CONFIRMED 改成COMPLETED

selenium 4.x 入门(环境搭建、八大元素定位)

背景 Web自动化测现状 1. 属于 E2E 测试 2. 过去通过点点点 3. 好的测试,还需要记录、调试网页的细节 一、selenium4.x环境搭建 一键搭建 pip3 install webdriver-helper 安装后自动的完成: 1. 查看浏览器的版本号 2. 查询操作系统的类型…

C++栈和队列模拟

栈和队列所用的容器默认都为deque,这种容器可以看作是一种vector和list的中间性能容器。 而deque虽然头插、尾插效率很好,且支持 [ ] 访问(默认容器为它的原因),但是 他的缺点也很明显: 1.中间插入删除会…

Git中单独的功能特性分支是什么含义

在Git中,一个"功能特性分支"(通常简称为“特性分支”)是指从主开发分支(比如main或master)独立出来的分支,专门用于开发一个新功能、修复一个bug,或者进行实验性的尝试。使用特性分支…

git误操作版本回退的方法

场景:在使用git进行代码提交的时候不小心执行了git reset 命令进行了版本回退但是在这之前进行了git add . git commit -m "提交"等命令,正常情况下就可以直接使用 git reset 版本号 进行代码的回退,但是发现自己不能找打上一个提…

某985证书站挖掘记录

0x1.前言 本文章仅用于信息安全防御技术分享,因用于其他用途而产生不良后果,作者不承担任何法律责任,请严格遵循中华人民共和国相关法律法规,禁止做一切违法犯罪行为。文中涉及漏洞均以提交至教育漏洞平台,现已修复。 …

微服务之分布式理论zookeeper概述

一、分布式技术相关的理论 CAP理论 CAP定理(CAP theorem),⼜被称作布鲁尔定理(Eric Brewer),1998年第⼀次提出. 最初提出是指分布式数据存储不可能同时提供以下三种保证中的两种以上: (1) ⼀致性(Consistency): 每次读取收到的信息都是最新的; (2) …

Macs Fan Control Pro for mac激活版:macOS 平台的风扇控制软件

Macs Fan Control Pro是一款用于 macOS 平台的风扇控制软件,它允许用户监控和调整 Mac 电脑的风扇转速。以下是该软件的一些特点和功能: Macs Fan Control Pro for mac激活版下载 风扇监控:Macs Fan Control Pro 提供实时的风扇转速监控&…

uniapp关于iconfont字体图标使用

1、打开[阿里巴巴矢量图标库](https://www.iconfont.cn/),选择需要的图标添加到购物车 2、点开购物车,将图标添加到项目 3、点开项目,点击下载至本地,会得到一个download.zip包 4、解压download包 5、将包里的iconfont.css和iconf…

Java从菜鸟到高手①

目录 1.数据类型 2.定义变量 2.1.编码方式 2.2.布尔型变量boolean 2.3.隐式类型转化和强制类型转化 2.4类型提升 3.字符串类型 4.运算符 4.1.取余 4.2. ,- 4.3逻辑运算&& || ! 4.4.位运算 4.5.条件运算符 1.数据类型 Java中&#…

2024智能科学与软件工程国际学术会议(ICISSE 2024)

2024智能科学与软件工程国际学术会议(ICISSE 2024) 会议简介 2024智能科学与软件工程国际学术会议(ICISSE 2024)将在北京隆重举行。本次会议汇集了全球智能科学和软件工程领域的专家学者,共同探讨该领域的最新研究成果和发展趋…

超详细的Vue脚手架

文章目录 Node.js介绍安装快速入门控制台输出使用函数模块化编程 npm包管理器介绍命令初始化命令本地安装(了解)全局安装(掌握)批量下载淘宝npm镜像(建议使用) Webpack介绍安装快速入门方式一:webpack原始方式方式二:基于NPM方式 webpack-dev-server 开发…

2024年第十五届蓝桥杯江苏省赛回顾

呜呜呜~~~ 我在考完了后感觉自己直接炸了:好多学到的算法都没有用上,几乎所有的题目都是暴力的。。。 最后十几分钟对于一道dp算法终于有思路了,但是。。匆匆忙忙之间就是没有调试出来。(还是交了一道暴力[旋风狗头]直接哭死~~&…

设计模式学习笔记 - 开源实战五(下):总结Mybatis中用到的10种设计模式

概述 本章再对 Mybatis 用到的设计模式做一个总结。它用到的设计模式也不少。有些前面章节已经经过了,有些则比较简单。 SqlSessionFactoryBuilder:为什么要用建造者模式来创建 SqlSessionFactory? 在《Mybatis如何权衡易用性、性能和灵活性…

鸿蒙内核源码分析(汇编基础篇) | CPU在哪里打卡上班

本篇通过拆解一段很简单的汇编代码来快速认识汇编,为读懂鸿蒙汇编打基础.系列篇后续将逐个剖析鸿蒙的汇编文件. 汇编很简单 第一: 要认定汇编语言一定是简单的,没有高深的东西,无非就是数据的搬来搬去,运行时数据主要…

高等学校数字化校园平台介绍

高等学校信息化建设已经进入到跨业务领域信息共享、建立全校统一集成的信息系统阶段,目标是实现整个学校的系统集成、信息共享与工作协同。因此,如何将众多应用系统中大量的信息进行科学、规范的定义和分类,使信息有序流通、保证信息的一致性…

IP定位技术企业网络安全检测

随着信息技术的飞速发展,网络安全问题日益凸显,成为企业运营中不可忽视的一环。在众多网络安全技术中,IP定位技术以其独特的优势,为企业网络安全检测提供了强有力的支持。本文将深入探讨IP定位技术在企业网络安全检测中的应用及其…

使用通义千问,识别需求文档中的输入输出信号存储到excel表格,完成对需求的初步分析

操作步骤如下: 第一步,提取需求的输入输出信号为json格式, 提示词如下: 车速自动闭锁 使能条件(a&b&c&d&e&f) a. 电源状态为 ON(PowerMode ON) b. 主驾门锁…