Rsa加解密

RSA-Java加解密 文章目录背景介绍JAVA RSA加解密工具类基础工具类问题记录 --- 报文长度过长加解密失败原因分段加解密code问题记录二 -- 当密钥对改为2048 bit备注PKCS1 和 PKCS8 的区别在线rsa加解密网站 背景介绍 项目中最近使用RSA算法对敏感数据进行加解密,因此在结合网上相关文章后进行整理。 RSA算法是一种非对称加密算法,会生成一对RSA秘钥,即公钥+私钥,将公钥提供给调用方,调用方使用公钥对数据进行加密后,接口根据私钥进行解密 JAVA RSA加解密工具类 基础工具类 impo 阅读详情
package com.gzxf.utils;

import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;


/**
 * RSA
 *
 */
@SuppressWarnings("restriction")
public class RSAHelper {
	public static int keySize = 2048;
	public static String charset = "UTF-8";

	/**
	 * To byte array byte [ ].
	 *
	 * @param hexString the hex string
	 * @return the byte [ ]
	 */
	public static byte[] toByteArray(String hexString) {
		if (hexString == null || hexString.isEmpty())
			return null;
		hexString = hexString.toLowerCase();
		final byte[] byteArray = new byte[hexString.length() >> 1];
		int index = 0;
		for (int i = 0; i < hexString.length(); i++) {
			if (index  > hexString.length() - 1)
				return byteArray;
			byte highDit = (byte) (Character.digit(hexString.charAt(index), 16) & 0xFF);
			byte lowDit = (byte) (Character.digit(hexString.charAt(index + 1), 16) & 0xFF);
			byteArray[i] = (byte) (highDit << 4 | lowDit);
			index += 2;
		}
		return byteArray;
	}


	/**
	 * byte[] to Hex string.
	 *
	 * @param byteArray the byte array
	 * @return the string
	 */
	public static String toHexString(byte[] byteArray) {
		final StringBuilder hexString = new StringBuilder("");
		if (byteArray == null || byteArray.length <= 0)
			return null;
		for (int i = 0; i < byteArray.length; i++) {
			int v = byteArray[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				hexString.append(0);
			}
			hexString.append(hv);
		}
		return hexString.toString().toLowerCase();
	}

	/**
	 * 得到公钥
	 *
	 * @param key
	 *            密钥字符串(经过base64编码)
	 * @throws Exception
	 */
	public static PublicKey getPublicKey(String key) throws Exception {
		byte[] keyBytes;
		keyBytes = toByteArray(key);

		X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		PublicKey publicKey = keyFactory.generatePublic(keySpec);
		return publicKey;
	}

	/**
	 * 得到私钥
	 *
	 * @param key
	 *            密钥字符串(经过base64编码)
	 * @throws Exception
	 */
	public static PrivateKey getPrivateKey(String key) throws Exception {
		byte[] keyBytes;
		keyBytes = toByteArray(key);

		PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
		return privateKey;
	}

	/**
	 * 得到密钥字符串(经过hex编码)
	 *
	 * @return
	 */
	public static String getKeyString(Key key) throws Exception {
		byte[] keyBytes = key.getEncoded();
		String s = toHexString(keyBytes);
		return s;
	}

	public static byte[] byteMerger(byte[] bt1, byte[] bt2) {
		if(bt2 == null) return bt1;
		if(bt1 == null) return bt2;
		byte[] bt3 = new byte[bt1.length+bt2.length];
		System.arraycopy(bt1, 0, bt3, 0, bt1.length);
		System.arraycopy(bt2, 0, bt3, bt1.length, bt2.length);
		return bt3;
	}

	public static byte[] subArray(byte[] byte_array, int off, int len) {
		byte[] result = new byte[len];
		System.arraycopy(byte_array, off, result, 0, len); //源数组,起始位置,目的数组,起始位置,长度
		return result;
	}

	/**
	 * 加密的核心步骤
	 *
	 * @param src
	 *            如果src.getBytes("UTF-8").length > 117那么加密就会报错!需要做迭代处理。
	 * @param cipher
	 * @return
	 * @throws Exception
	 */
	public static byte[] encryptFinal(byte[] src, Cipher cipher) throws Exception {
		byte[] enBytes = null;
		int len = src.length;
		int limit = keySize / 8 - 11;
		if (len > limit) {
			int remainder = len % limit;
			int divisor = len / limit;
			/*
			 * 整除数处理 处理以117为倍数的单元
			 */
			for (int i = 0; i < divisor; i++) {
				byte[] subEnBytes = cipher.doFinal(src, limit * i, limit);
				enBytes = byteMerger(enBytes, subEnBytes);
			}
			/*
			 * 余数处理 处理不足117的单元
			 */
			if (remainder > 0) {
				byte[] subEnBytes = cipher.doFinal(src, limit * divisor,
						remainder);
				enBytes = byteMerger(enBytes, subEnBytes);
			}
		} else {
			enBytes = cipher.doFinal(src);
		}
		return enBytes;
	}

	/**
	 * 解密的核心步骤
	 *
	 * @param src
	 *            如果src.length > keySize / 8那么就会报错!需要迭代处理。
	 * @param cipher
	 * @return
	 * @throws Exception
	 */
	private static byte[] decryptFinal(byte[] src, Cipher cipher) throws Exception {
		byte[] deBytes = null;
		int len = src.length;
		int limit = keySize / 8;
		if (len > limit) {
			int remainder = len % limit;
			int divisor = len / limit;
			/*
			 * 整除数处理 处理以128为倍数的单元
			 */
			for (int i = 0; i < divisor; i++) {
				byte[] subDeBytes = subArray(src, limit * i, limit);
				deBytes = byteMerger(deBytes, cipher.doFinal(subDeBytes));
			}
			/*
			 * 余数处理 处理不足keySize / 8的单元
			 * NOTE:在解密的时候都是以keySize / 8为一个单元,尚未发现例外。所以这个步骤不会执行,留下它以防万一吧。
			 */
			if (remainder > 0) {
				byte[] subDeBytes = subArray(src, limit * divisor, remainder);
				deBytes = byteMerger(deBytes, cipher.doFinal(subDeBytes));
			}
		} else {
			deBytes = cipher.doFinal(src);
		}
		/*
		 * 如果是“RSA/ECB/NoPadding”模式,需要将(byte)0去掉
		 */
		if (true) {
			byte[] deBytesWithOutZero = null;
			for (int i = 0; i < deBytes.length; i++) {
				if (deBytes[i] == (byte) 0) {
					continue;
				} else {
					byte[] cur = new byte[1];
					cur[0] = deBytes[i];
					deBytesWithOutZero = byteMerger(deBytesWithOutZero, cur);
				}
			}
			return deBytesWithOutZero;
		}
		return deBytes;
	}

	public static void main(String[] args) throws Exception {

		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
		// 密钥位数
		keyPairGen.initialize(RSAHelper.keySize);
		// 密钥对
		KeyPair keyPair = keyPairGen.generateKeyPair();

		// 公钥
		PublicKey publicKey = keyPair.getPublic();

		// 私钥
		PrivateKey privateKey = keyPair.getPrivate();

		String publicKeyString = getKeyString(publicKey);
		System.out.println("public:\n" + publicKeyString);

		String privateKeyString = getKeyString(privateKey);
		System.out.println("private:\n" + privateKeyString);

		// 保存密钥对,并将私钥用来分发给各个APP开发商家

		// 加解密类
		Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");// Cipher.getInstance("RSA/ECB/PKCS1Padding");  NoPadding

		// 明文
		String strPlainText = "我们都很好!我们都很好!我们都很好!我们都很好!我们都很好!我们都很好!我们都很好!我们都很好!我们都很好!我们都很好!我们都很好!";
		strPlainText += "我们都很好!我们都很好!我们都很好!我们都很好!我们都很好!我们都很好!我们都很好!我们都很好!我们都很好!我们都很好!我们都很好!";
		strPlainText += "OK!";
		byte[] plainText = strPlainText.getBytes(charset);

		// 加密
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		byte[] enBytes = encryptFinal(plainText, cipher);
		//byte[] enBytes = cipher.doFinal(plainText);
		System.out.println("plainText:" + strPlainText);
		System.out.println("plainHex:" + toHexString(plainText));
		System.out.println("enBYTES:" + new String(enBytes));
		System.out.println("enHEX:" + toHexString(enBytes));

		// 通过密钥字符串得到密钥
		publicKey = getPublicKey(publicKeyString);
		privateKey = getPrivateKey(privateKeyString);

		String hexStr = toHexString(enBytes);
		byte[] gotEnBytes = toByteArray(hexStr);

		// 解密
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		byte[] deBytes = decryptFinal(gotEnBytes, cipher);
		//byte[] deBytes = cipher.doFinal(enBytes);

		publicKeyString = getKeyString(publicKey);
		System.out.println("public:\n" + publicKeyString);

		privateKeyString = getKeyString(privateKey);
		System.out.println("private:\n" + privateKeyString);

		String s = new String(deBytes, charset);
		System.out.println(s);
	}
}
RSA分段加解密 RSA加解密 阅读详情

相关推荐

微信小程序前端RSA加解密

介绍RSA加解密在小程序上使用的工具

LeeBrook0的博客 1万+

RSA加解密

1978年美国麻省理工学院的三名密码学者R.L.Rivest,A.Shamir和L.Adleman提出了一种基于大合数因子分解困难性的公开密钥密码,简称为RSA密码。如果重复对每个部分结果做平方运算即求x,x2,x4,x8,x16则只需4次乘法。为了完成本关任务,你需要掌握:1.rsa算法原理,2.快速乘法算法。本关任务:使用python模块,编写一个进行RSA加解密的程序。根据提示,在右侧编辑器补充代码,能够正确的进行加解密,输出明文。本关任务:编写一个能进行rsa加密和解密的程序。

zs_261的博客 890

基于RSA加解密概述

本文介绍了RSA非对称加密算法的原理及其在汽车安全启动(Automobile security boot)中的应用。文章首先阐述了RSA算法的数学基础,包括密钥生成、加解密过程等核心概念,重点分析了其非对称性特点和安全优势。随后详细描述了基于S32K144芯片实现RSA的完整流程,包括客户端密钥生成、CSR生成、CA证书签发与验证等关键步骤。在应用层面,文章具体说明了RSA在通信双方加解密、数字签名验证等场景的实现方法,最终将这一安全机制应用于汽车安全启动系统。该系列文章共包含12个章节,系统性地介绍了从理

qq_40916548的博客 1118

mbedtls移植之RSA加解密算法

mbedtls移植实现RSA加解密和RSA密钥生成

辛勤搬砖的门卫的专栏 6675

.net RSA 加解密

一、.net → java RSA转换 /// <summary> /// RSA密钥格式转换 /// </summary> public static class RSAConverter { /// <summary> /// RSA私钥格式转换,java->.net...

筱筱的博客 918

一文梳理金融风控建模全流程(Python)

。借助A卡模型,银行或金融机构能够根据申请人的个人信息和历史数据,对其进行风险评估。这种评估能够帮助金融机构判断借款人是否具备偿还贷款的能力和意愿。

weixin_43420291的博客 4776

头歌实践答案——RSA加解密

既可用于加密,又可用于数字签名,安全、易懂,它已成为目前应用最广泛的公开密钥密码。如果重复对每个部分结果做平方运算即求x,x2,x4,x8,x16则只需4次乘法。根据提示,在右侧编辑器补充代码,采用快速乘法算法实现rsa加解密过程。为了完成本关任务,你需要掌握:1.rsa算法原理,2.快速乘法算法。本关任务:使用python模块,编写一个进行RSA加解密的程序。根据提示,在右侧编辑器补充代码,能够正确的进行加解密,输出明文。本关任务:编写一个能进行rsa加密和解密的程序。开始你的任务吧,祝你成功!

weixin_73928886的博客 2192

Windows 下 Codex MCP 服务配置全攻略:从环境搭建到实战避坑

本文详细介绍了在Windows系统下配置Codex MCP服务的完整流程与实战避坑指南。内容涵盖从Node.js环境搭建、Codex CLI安装,到核心配置文件config.toml的编写与解析,并重点解决了Windows平台特有的环境变量设置、MCP服务启动命令适配等关键难点,帮助开发者顺利完成从环境准备到编辑器插件连接的整个配置过程。

weixin_28826545的博客 2070

用 Python 来实现 RSA 加解密

昨天看到一篇英文文章[1],展示了如何用 Python 来实现 RSA 算法,代码的逻辑与前文一文搞懂 RSA 算法一样,不太熟悉 RSA 的朋友可以看一下一文搞懂 RSA 算法,里面对什...

somenzz的博客 6044

VisionMaster Qt二次开发:图像获取、COM组件渲染与本地化存储实战

本文详细介绍了基于VisionMaster进行Qt二次开发的核心实战流程,涵盖环境搭建、方案加载、图像数据获取、COM组件渲染与本地化存储。重点解析了如何通过COM组件在Qt界面中实时显示图像,以及将VM图像数据转换为QImage并保存为本地文件的关键步骤与常见问题,为工业视觉项目开发提供稳定高效的解决方案。

weixin_29229261的博客 206

Windowns下Git环境配置-命令行方式

文章目录一、配置Git1.1 下载Git并安装1.2 配置本地Git用户名和邮箱1.3 注册GitHub二、生成本地公钥,放到GitHub上-SSH Key2.1 生成本地公钥命令2.2 查看生成的公钥2.3 在GitHub放上公钥并测试连通性三、创建项目实操四、可能出现的问题4.1.push不成功4.2.提示SSL的问题4.3.域名不能解析的问题4.4.如果github连接不上的问题 一、配置Git 1.1 下载Git并安装 Git官网 默认安装,根据需要修改安装路径 1.2 配置本地Git用户名和邮箱

学习工作笔记 1135

flutter RSA 加解密

代码如下: import 'dart:convert'; import 'dart:math'; import 'dart:typed_data'; import 'package:asn1lib/asn1lib.dart'; import 'package:pointycastle/export.dart'; class RSAUtils { static RSAPublicKey pu...

rznice的专栏 5561

FX2N-2AD模块实战:从硬件连接到FROM/TO指令编程详解

本文详细解析FX2N-2AD模拟量输入模块的硬件连接与FROM/TO指令编程技巧,涵盖BFM缓冲存储器配置、梯形图程序设计及工程实战经验。通过实例演示如何实现精准信号采集与数据处理,特别针对PLC系统中的常见故障提供解决方案,助力工业自动化工程师高效完成设备调试与维护。

prometheus9mon的博客 507

VUE内使用RSA加解密

说明:为防止私钥泄漏,由服务端生成两对密钥,分别是(前端公钥+私钥,后端公钥加私钥),采用加解密模式为:前端使用后台公钥加密,使用前端私钥解密;后端使用前端公钥加密,使用后端私钥解密。前后端统一使用公钥加密,私钥解密 一、现在vue项目中安装依赖包jsencrypt   npm installjsencrypt--save-dev 二、在项目中新建jsencryptKey.js,用来存放公共加解密方法 三、jsencryptKey.js内引入依赖jsencrypt.js...

浩星 2571

【架构】-- StarRocks 和 Doris 介绍与选型建议

查询性能 | ✅ 高性能,支持向量化执行和 CBO 优化器 | ✅ 高性能,优化的查询引擎 |- **实时性要求高**:如果业务对数据的实时性要求较高,建议选择 **StarRocks**,其在实时数据处理和低延迟查询方面表现优越。- **复杂查询需求**:对于需要处理复杂多表关联查询的场景,两者均可胜任,需根据具体性能测试结果进行选择。

欢迎来到我的博客,一起探索代码里的世界! 1832

Simulink仿真模块 - Data Type Conversion

Data Type Conversion将输入信号转换为指定的数据类型 在仿真库中的位置为: Simulink / 常用模块 Simulink / Signal Attributes 模型为: 说明 DataTypeConversion模块可将任何 Simulink®数据类型的输入信号转换为您指定的数据类型。 注意 要通过指定模块参数来控制输出数据类型,或者要从下游模块继承数据类型,使用DataTypeConversion模块。要...

jk_101的博客 2519

rsa加解密

import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import ...

qq_34103387的博客 258

Python 爬虫实战:共享单车数据采集全流程与市场洞察深度剖析

本文介绍了如何利用Python爬虫技术获取和分析共享单车运营数据。文章从项目背景出发,详细阐述了系统架构设计,包括数据抓取、清洗存储、分析和可视化模块。通过Scrapy、BeautifulSoup等工具实现数据采集,使用Pandas进行数据清洗,并借助Matplotlib进行可视化分析。实战部分展示了爬虫代码示例和城市分布、使用频率等分析案例。最终指出数据驱动分析有助于了解行业现状和市场趋势,未来可结合机器学习等方法进行深入洞察。该技术方案为共享单车行业研究提供了有效的数据支持。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2232

RSA 加解密(Java 实现)

RSA 算法是一种非对称加解密算法。服务方生成一对 RSA 密钥,即公钥 + 私钥,将公钥提供给调用方,调用方使用公钥对数据进行加密后,服务方根据私钥进行解密。

长安明月的博客 3万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java Rsa分段加解密

给大家分享一个java分段加解密的工具类 该类也是综合网上相关类写出来的 感谢各位,所以我也来奉献了 还有一个测试用的main方法 package example; /** * 创建时间:2019/01/10 * 创建人:Administrator * 描述: */ import javax.crypto.Cipher; import java.io.ByteArrayOutputSt...

PMY_C_L的博客 3706

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

RSA加解密源码

源码: #include #include #include #include #include #include #include typedef struct{ unsigned char encData[128]; unsigned char encData2[128]; }ENC_DATA; static char *M

思考,行动,再思考,再总结 2174

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

RSA加解密简单实现

SMD5加密属于不可逆加密,原文加密过后生成的密文无法解密出原文。 DES/AES加密属于对称可逆加密,通信的双方使用同一个秘钥,通过秘钥加密过后的密文,可使用秘钥解密出原文。 RSA属于非对称可逆加密,加密秘钥和解密秘钥为两个不同的秘钥,两个秘钥称之为公钥和私钥,公钥是公开的,通信双方都持有的,用来加密原文数据;私钥为通信的其中一方持有,用来解密数据来获取原文数据。 SSL加密是数字证书加密,属于加解密综合应用,https协议使用(https协议=HTTP协议+SSL/TLS协议)

liwan09的博客 2133

C语言实现RSA算法加解密

使用c语言实现了RSA加解密算法,可以加解密文件和字符串。

不负长风 5034

使用RSA非对称加密算法进行加解密

该工具类主要用途:①生成一对密钥(公钥和私钥)②提供加解密的方法。

qq_54655539的博客 2337

RSA加解密Utils

不废话,code: public class RsaProvider { public static final String KEY_ALGORITHM = "RSA"; public static final String SIGNATURE_ALGORITHM = "MD5withRSA"; private static final ...

qq_38069477的博客 1011
上一篇: oracle获取中文拼音/WB
下一篇: docker 构建本地 frp
和月明
博客等级 码龄6年 214粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值