java非对称加解密

简介

非对称加密:加密和解密使用不同的秘钥的加解密方法。一般的,用公钥做加密,私钥做解密使用

常用的加解密有:RSA、ECC、DSA,在java中使用最多的是RSA

工具类

/*** 非对称加解密工具类(RSA)** RSA加密(一次)有最大字节数组限制 177、解密的最大字符限制128***/
public class AsymmetricEncryptDecryptionUtil {public static final String UTF8= StandardCharsets.UTF_8.name();public static final String ALGORITHM = "RSA";public static final int MAX_ENC_LENGTH = 117;public static final int MAX_DEN_LENGTH = 128;/*** 创建公钥和私钥对的16进制字符串** @throws NoSuchAlgorithmException 算法异常* @throws IOException io异常*/public static void createKeyPair() throws NoSuchAlgorithmException, IOException {KeyPairGenerator pairGenerator = KeyPairGenerator.getInstance(ALGORITHM);pairGenerator.initialize(1024);KeyPair keyPair = pairGenerator.genKeyPair();// 公钥PublicKey publicKey = keyPair.getPublic();// 私钥PrivateKey privateKey = keyPair.getPrivate();// 公钥秘钥字节数组byte[] publicKeyPairEncoded = publicKey.getEncoded();// 私钥秘钥字节数组byte[] privateKeyEncoded = privateKey.getEncoded();String pubHexStr = Hex.encodeHexString(publicKeyPairEncoded);String priHexStr = Hex.encodeHexString(privateKeyEncoded);System.out.println("公钥是:" + pubHexStr);System.out.println("私钥是:" + priHexStr);}private static PublicKey getPublicKey() throws Exception {String pubCfFile = AsymmetricEncryptDecryptionUtil.class.getClassLoader().getResource("rsa.pub").getPath();String pubKeyHexStr = FileUtils.readFileToString(new File(pubCfFile), UTF8);KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Hex.decodeHex(pubKeyHexStr));return keyFactory.generatePublic(x509EncodedKeySpec);}private static PrivateKey getPrivateKey() throws Exception {String priCfFile = AsymmetricEncryptDecryptionUtil.class.getClassLoader().getResource("rsa.pri").getPath();String priKeyHexStr = FileUtils.readFileToString(new File(priCfFile), UTF8);KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Hex.decodeHex(priKeyHexStr));return keyFactory.generatePrivate(pkcs8EncodedKeySpec);}public static String encodeStr(String originalStr,Key key) throws Exception {Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE,key);byte[] bytes = doCodec(cipher, originalStr.getBytes(UTF8), MAX_ENC_LENGTH);return Hex.encodeHexString(bytes);}public static String deCodeStr(String hexStr,Key key) throws Exception {byte[] bytes = Hex.decodeHex(hexStr);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE,key);byte[] originalBytes = doCodec(cipher,bytes,MAX_DEN_LENGTH);return new String(originalBytes,UTF8);}/*** 由于RSA加密、解密都有最大字节数组长度限制(加密是177长度,解密是128长度)** 所以需要循环处理** @param cipher cipher* @param bytes 待加解密的字节数组* @param maxLength 处理的最大长度* @return 加解密的字节数组* @throws BadPaddingException BadPaddingException* @throws IllegalBlockSizeException IllegalBlockSizeException*/private static byte[] doCodec(Cipher cipher,byte[] bytes,int maxLength) throws BadPaddingException, IllegalBlockSizeException {int length = bytes.length;int offset = 0;byte[] cache;int i = 0;ByteArrayOutputStream bos = new ByteArrayOutputStream();while ((length - offset) > 0) {if(length - offset > maxLength) {cache = cipher.doFinal(bytes,offset,maxLength);} else {cache = cipher.doFinal(bytes,offset,length - offset);}i++;offset = i * maxLength;bos.write(cache,0,cache.length);}return bos.toByteArray();}public static void main(String[] args) throws Exception {String str = "法律";PublicKey publicKey = getPublicKey();String s = encodeStr(str, publicKey);System.out.println("RSA encode result:" + s);PrivateKey privateKey = getPrivateKey();String s1 = deCodeStr(s,privateKey);System.out.println("RSA decode result:" + s1);}
}

注意:RSA加解密有限制,一次加密的最大字节数组不能超过177长度,解密的最大数组长度不能超过128个字节长度

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

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

相关文章

浅谈ASJ系列剩余电流动作继电器

1. 概述 Overview 在工业应用中,剩余电流继电器与外部剩余电流互感器结合使用以检测和评估接地故障电流。它们也可以与保护装置结合使用,以实现电路的断开,从而实现对线路和人员的保护。 Residual current relay can be combined with ext…

C# SqlSugar 数据库 T4模板

生成效果 模板代码 <# template debug"false" hostspecific"true" language"C#" #> <# output extension".cs" #> <# assembly name"System.Core" #> <# assembly name"System.Data" #>…

matlab一本通 学习笔记三

图形步骤&#xff1a;生成自变量&#xff0c;根据函数产生结果向量&#xff0c;利用figure生成窗口&#xff0c;使用plot生成图形&#xff0c;设置轴&#xff0c;设置标记&#xff0c;使用r,g,y,b等设置颜色&#xff0c;使用x.-ov标识线型&#xff1b;使用position在figure中设…

PFA聚四氟乙烯镊子耐强腐蚀可夹取太阳能硅片等

PFA镊子是一种高纯度聚四氟乙烯制成的实验室工具&#xff0c;具有以下特点&#xff1a; 1.高耐腐蚀性&#xff1a;PFA镊子能够抵抗酸、碱、盐等多种化学物质的侵蚀&#xff0c;适用于处理各种强腐蚀性物质。 2. 高耐高温性&#xff1a;PFA镊子的熔点较高&#xff0c;能够在高温…

QT-quick 学习整理

1、特点 Qt Quick是一个现代化的、基于QML的框架。 ● QML是Qt Quick的关键组成部分&#xff0c;是一种基于JavaScript的声明性语言&#xff0c;用于描述用户界面的视觉和行为。 ● Qt Quick Controls是一套预先设计好的用户界面元素库&#xff0c;包含了诸如按钮、文本框、菜…

【MySQL】复合查询 | 内外连接

文章目录 一、MySQL复合查询基本查询回顾多表查询自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询合并查询 二、MySQL内外连接内连接外连接左外连接右外连接 一、MySQL复合查询 基本查询回顾 准备测试表 下面给出三张表&#xff0c;员工表&#xff08;emp&…

又一款 AI 工具火爆全网!DomoAI 实测体验如何(二)

上一篇介绍了 DomoAI 的两种生成视频的方式&#xff1a; 1、根据上传的视频生成多种风格的视频 2、根据上传的图片生成视频 下图就是通过 DomoAI 生成的一组视频。 DomoAI测试视频 对制作过程感兴趣的可以看上一篇&#xff1a; 程序员X小鹿&#xff1a;【AI 视频】又一款 AI…

std::string在 Windows MSVC和Linux Gcc 中capacity容量扩容策略的分析和对比

1、capacity()作用 在std::string中&#xff0c;capacity()为当前string占用内存字符的长度&#xff0c;表示当前string的容量&#xff0c;可以理解为一个预分配制度&#xff0c;如果当前的string不断进行扩展操作&#xff0c;则不需要每次都进行内存上的分配&#xff0c;提高程…

【银行测试】银行金融项目测试总结+面试题汇总(答案)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、银行项目测试的…

人型动画足部IK权重曲线烘焙

简介 如下图所示&#xff0c;Left、Right FootIK Weight两条动画曲线用于设置人物角色足部IK时获取权重值&#xff0c;手动编辑且动画片段较多时比较费事&#xff0c;可以考虑程序化烘焙这两条足部IK权重曲线。 实现思路 创建新的编辑器窗口&#xff0c;在OnGUI中获取当前所…

FART12刷机脱壳记录笔记

其他脱壳笔记&#xff1a; https://codeooo.blog.csdn.net/article/details/126891503 fart12 脱壳系统 可以脱邦邦 爱加密 企业壳 等&#xff1b; 寒冰大佬的脱壳王 本文记录下刷机过程&#xff0c;方便以后查看使用。 adb授权和ome锁要开着 代表锁是开着状态 如果出现&a…

关于标准库中的反向迭代器

什么是迭代器&#xff1f; 迭代器&#xff08;iterator&#xff09;有时又称光标&#xff08;cursor&#xff09;是程序设计的软件设计模式&#xff0c;可在容器对象&#xff08;container&#xff0c;例如list或vector&#xff09;上遍历访问的接口&#xff0c;通常来…

Ps:图框工具

图框工具 Frame Tool是自 Ps 2019 版开始新增的一个工具。 图框 Frame可用于限制图像的显示范围&#xff0c;在设计过程中&#xff0c;还常常可起到占位符的功能。 快捷键&#xff1a;K 使用图框工具&#xff0c;对于快速相册排版、创建某种形式的特效等有一定的帮助。比起使用…

ctfshow 杂项签到

ctfshow的杂项签到题&#xff0c;下载压缩包之后里面有图片。 直接将图片用010editor打开&#xff0c;检索ctfshow可以看到答案。

Frequency-domain MLPs are More EffectiveLearners in Time Series Forecasting

本论文来自于 37th Conference on Neural Information Processing Systems (NeurIPS 2023) Abstract 时间序列预测在金融、交通、能源、医疗等不同行业中发挥着关键作用。虽然现有文献设计了许多基于 RNN、GNN 或 Transformer 的复杂架构&#xff08;注意力机制的计算太占用资…

.net6使用Sejil可视化日志

&#xff08;关注博主后&#xff0c;在“粉丝专栏”&#xff0c;可免费阅读此文&#xff09; 之前介绍了这篇.net 5使用LogDashboard_.net 5logdashboard rootpath-CSDN博客 这篇文章将会更加的简单&#xff0c;最终的效果都是可视化日志。 在程序非常庞大的时候&…

js函数声明的几种方式

在JavaScript中&#xff0c;有几种方式可以声明函数&#xff0c;其中最常见的有两种&#xff1a;函数声明和函数表达式。 一、函数声明 使用关键字 function 来声明函数&#xff0c;语法如下 function functionName(parameters) {// 函数体 }例子&#xff1a; function gre…

blender scripting 编写

blender scripting 编写 一、查看ui按钮对应的代码二、查看或修改对象名称三、案例&#xff1a;渲染多张图片并导出对应的相机参数 一、查看ui按钮对应的代码 二、查看或修改对象名称 三、案例&#xff1a;渲染多张图片并导出对应的相机参数 注&#xff1a;通过ui交互都设置好…

GEE数据集——USGS全球地震数据集

美国地质勘探局全球地震数据集 美国地质调查局地震灾害计划 (EHP) 提供全面的地震数据集&#xff0c;为全球监测、研究和地震防备提供宝贵资源。该数据集包含来自各种来源的地震信息&#xff0c;包括地震台、卫星图像和地面观测。持续更新&#xff0c;截至 2023 年 10 月 10 日…

Linux:软件安装

Linux 上的软件安装 四种安装方式 在线安装从磁盘安装盘deb软件包从二进制软件包安装从源代码编译安装 在线安装 在不同的linux发行版上面在线安装方式会有一些差异包括使用的命令及它们的包管理工具&#xff0c;因为我们的开发环境是基于ubuntu的&#xff0c;所以这里我们…