Java RSA加密解密及签名验证

2023-10-26

一、简介

RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。
正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要 。
RSA是被研究得最广泛的公钥算法,从提出到现在已近三十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。

二、应用

1、密匙生成器,自动生成gongshi公钥和私钥,其中1024为密匙大小,密钥可以设置的范围是96-1024

     keyPairGen.initialize(1024,new SecureRandom());

2、公钥加密,先获取公钥publicKey,进行cipher初始化,对data进行加密。

    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes("UTF-8")));

3、私钥解密,先获取私钥privateKey,进行cipher初始化,对data进行转换,在进行解密。

    cipher.init(Cipher.ENCRYPT_MODE, privateKey);
    byte[] inputByte = Base64.getDecoder().decode(data.getBytes("UTF-8"));
    new String(cipher.doFinal(inputByte),"UTF-8");

三、代码

1、运行代码:

package demo;

import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.util.Base64;

import javax.crypto.Cipher;


public class RSAUtil {

	//自动创建生成公钥和私钥对(RSA算法)
	public static KeyPair getKeyPair() throws Exception {
	    KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");		  
	    keyPairGen.initialize(1024,new SecureRandom());
	    KeyPair keyPair = keyPairGen.generateKeyPair();
	    return keyPair;
	}

	//公钥加密
	public static String encryption(String data, Key publicKey) throws Exception{
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        String information = Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes("UTF-8")));
        return information;
    }
	
	//私钥解密
	 public static String decrypt(String data, Key privateKey) throws Exception{     
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] inputByte = Base64.getDecoder().decode(data.getBytes("UTF-8"));
        String information = new String(cipher.doFinal(inputByte),"UTF-8");
        return information;
    }
	 
	//私钥生成签名 
	public static String sign(String data, PrivateKey privateKey) throws Exception {
	    Signature signature = Signature.getInstance("SHA256withRSA");
	    signature.initSign(privateKey);
	    signature.update(data.getBytes(StandardCharsets.UTF_8));
	    byte[] inputByte = signature.sign();
	    return Base64.getEncoder().encodeToString(inputByte);
	}
	
	//公钥验证签名
	public static boolean validate(String data, String sign, PublicKey publicKey) throws Exception {
	     Signature signature = Signature.getInstance("SHA256withRSA");
	     signature.initVerify(publicKey);
	     signature.update(data.getBytes(StandardCharsets.UTF_8));
	     byte[] inputByte = Base64.getDecoder().decode(sign);
	     return signature.verify(inputByte);
	 }
	 
	 

	public static void main(String[] args) throws Exception {
		System.out.println("====================================================================");
		   
	    KeyPair keyPair = getKeyPair();
	    PublicKey publicKey =  keyPair.getPublic();
	    PrivateKey privateKey = keyPair.getPrivate();
	    
	    String data0 = "RSA加密解密成功!";
	    System.out.println("==公钥:"+keyPair.getPublic());
	    System.out.println("==私钥:"+keyPair.getPrivate());
	    
	    System.out.println("加密前数据:"+data0);
	    
	    String data1 = encryption(data0,publicKey);
	    System.out.println("加密后数据:"+data1);
	    
	    String messageDe = decrypt(data1,privateKey);
	    System.out.println("解密后数据:"+messageDe);
	    
	    String sign = sign(data0, keyPair.getPrivate());
		boolean validate = validate(data0,sign, keyPair.getPublic());
		System.out.println("校验通过:"+validate);
	    System.out.println("====================================================================");

	}

}


运行结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java RSA加密解密及签名验证 的相关文章

  • 为什么Spring任务调度程序要等待上一个任务完成?

    我有以下任务计划程序设置
  • Jackson JSON、不可变类和接口

    我正在使用 Jackson 的示例 并且在反序列化与不可变的类和接口一起使用时遇到了一些麻烦 下面是我的代码 package com art starter jackson starter import java io IOExceptio
  • 需要 Android API 级别 9 的 Java 库方法的兼容性吗?

    一些 Java 库方法 例如DecimalFormat setRoundingMode have a since 1 6他们的文档中的条目 since 1 6 public void setRoundingMode RoundingMode
  • JTable 未显示在 JFrame (Java) 上

    我遇到了一个问题JFrame没有显示JTable添加到其中 我试过了getContentPane add 我已改为仅添加以使代码更短一些 任何帮助都非常感激 package com embah Accgui import java awt
  • 如何检查 Android 上的互联网访问情况? InetAddress 永不超时

    I got a AsyncTask这应该检查对主机名的网络访问 但是doInBackground 永远不会超时 有人知道吗 public class HostAvailabilityTask extends AsyncTask
  • 用java创建一个简单的规则引擎

    我正在探索用 Java 创建简单业务规则引擎的不同方法 我需要向客户展示一个简单的 Web 应用程序 让他配置一堆规则 规则库的示例可能如下所示 这是例子 IF PATIENT TYPE A AND ADMISSION TYPE O SEN
  • Apache CXF 客户端代理设置

    我正在尝试使用以下教程开发肥皂服务的消费者http cxf apache org docs developing a consumer html http cxf apache org docs developing a consumer
  • 在 Java 中通过 JDBC 查询速度慢,但在其他系统(TOAD)中则不然

    您好 我有一个对 Oracle 系统的查询 其中涉及一个视图 该视图通过将 TO NUMBER 应用于表主键来连接其他表 如果我使用 TOAD 进行查询 查询速度非常快 800 个寄存器 1 秒 如果我通过 JDBC 使用字符串文字 不是参
  • 使用 post 方法打开 URL android

    我必须向网址发送一些参数并打开它 但我不知道该怎么做 var variables URLVariables new URLVariables variables param1 param1 variables param2 param2 v
  • 文件上传流从哪里获取内容?

    我有一个关于文件上传的问题 这与它的工作原理更相关 而不是代码问题 我在互联网上查看 但找不到正确的答案 我有一个在 tomcat 上运行的 Web 应用程序 它处理文件上传 通过 servlet 假设我现在想要上传大文件 gt 1 GB
  • 画一条线连接两个矩形

    我正在 Swing AWT 中制作自己的类图应用程序 但我停在了这个功能上 I want to draw a line between the Class rectangle that already selected and to the
  • java并发:多生产者一消费者

    我遇到一种情况 不同的线程填充一个队列 生产者 并且一个消费者从该队列中检索元素 我的问题是 当从队列中检索这些元素之一时 某些元素会丢失 丢失信号 生产者代码是 class Producer implements Runnable pri
  • JFrame背景图片

    我正在创建一个简单的 GUI 我希望有一个背景图像 2048 X 2048 填充整个窗口 并在左上角有一个正方形 可以偶尔加载 64 X 64 图像 如何才能做到这一点 我已经知道如何设置 JFrame 的大小 它的图像加载我需要帮助 这是
  • Spring批处理返回自定义进程退出代码

    我有一个包含多个作业的 jar 我只想每次只执行一个作业并检索自定义退出代码 例如 我有基本工作 retrieveErrorsJob 配置 只需一步即可读取输入 XML 文件并将数据写入特定数据库表中 应用类 SpringBootAppli
  • 带红色圆圈的 Intellij Idea 文件

    我的 Intellij Idea 在 Project Explorer 中的文件名都有一个红色小圆圈 上面写着 J 那代表什么 IntelliJ 识别出这是一个 java 文件 但它没有标记为项目源的一部分 检查您的项目是否遵循 Maven
  • 用于匹配文件中的十六进制数字的 Java 正则表达式

    所以我正在读取一个文件 例如java程序 58 68 58 68 40 c 40 48 FA 如果我幸运的话 但更常见的是 它在每行之前和之后都有几个空白字符 这些是我正在解析的十六进制地址 我基本上需要确保我可以使用扫描仪 缓冲阅读器等来
  • 创建对象时抛出异常

    执行catch语句时是否会创建异常对象 例如 catch ArithmeticException someObject 该对象是否不必显式创建为实例 有两件事创建异常的实例第二抛出异常 创建异常的实例例如 看起来像创建类的任何实例NullP
  • Java 中的 \x 转义?

    我想知道 Java 中是否有类似 C 中的十六进制 x 转义 例如 char helloworld x48 x45 x4C x4C x4F x20 x57 x47 x52 x4C x44 printf s helloworld 从目前看来
  • JSF 2.0 无法从 primefaces 渲染对话框

    最近我在使用 primefaces 组件时遇到了很多问题 我不知道为什么 我使用glassfishV3 0 我的primefaces版本是2 2 1 我现在的问题是 当我单击表行时 我无法使 primefaces 的 p dialog 呈现
  • JacksonFeature 破坏了 JsonIgnoreProperties

    我有这样的 pojo JsonIgnoreProperties ignoreUnknown true public class SNAPIResponse public String status public String message

随机推荐

  • MySQL 高级原理: MySQL执行过程及执行顺序

    一 MySQL执行过程 MySQL整体的执行过程如下图所示 1 1 连接器 1 1 1连接器的主要职责 1 负责与客户端的通信 是半双工模式 这就意味着某一固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据 而不能同时进行 其中My
  • 文件的打开与关闭

    对于文件的打开与关闭 我们可以通过鼠标来控制 但是 在我们写代码的时候 总不能来用鼠标来打开关闭文件 并且还能将代码放在那个文件里面吧 因此 我们需要一个文件指针来帮助我们来打开和关闭文件 1 文件指针 缓冲文件系统中 关键的概念是 文件类
  • Ubuntu命令行修改网络配置,静态ip,hostname ,解决hostname ping不通的办法

    打开后里面可设置DHCP或手动设置静态ip 前面auto eth0 让网卡开机自动挂载 1 以DHCP方式配置网卡 编辑文件 etc network interfaces sudo vi etc network interfaces 并用下
  • Ms08067漏洞复现

    Ms08067漏洞复现 首先安装好测试环境xp的镜像文件 nmap扫描 首先确定靶机所在的网段 然后在kali中利用命令扫描出IP nmap sP 192 168 229 0 24 得到 IP 192 168 229 168 其次在利用nm
  • 字节、字、位、比特的概念和关系

    1 位 bit 来自英文bit 音译为 比特 表示二进制位 位是计算机内部数据储存的最小单位 11010100是一个8位二进制数 一个二进制位只可以表示0和1两种状态 21 两个二进制位可以表示00 01 10 11四种 22 状态 三位二
  • 如何避免服务器被恶意网络攻击

    服务器的IP是可公开透明的 很容易遭到黑客入侵或网络攻击 对服务器的恶意网络行为包括两个方面 首先是恶意的攻击行为 如DDoS攻击 网络病毒等等 这些行为旨在消耗服务器资源 影响服务器的正常运作 甚至服务器所在网络的瘫痪 另外一个就是恶意的
  • STM8L151的IAR工程编译报错Fatal Error[Pe035]: #error directive: “Please select first the target STM8L...

    项目场景 STM8L151G4XX单片机IAR工程编译报错 问题描述 编译报错 Fatal Error Pe035 error directive Please select first the target STM8L device us
  • token的使用流程以及 JWT构成和构建

    1 什么是token token是一个令牌 是前后端开发时的一个验证工具 就是一个字符串 我们先解释一下他的含义 1 Token的引入 Token是在客户端频繁向服务端请求数据 服务端频繁的去数据库查询用户名和密码并进行对比 判断用户名和密
  • Linux的诞生和发展&开源模式的流行

    Linux的诞生和发展 Linux的诞生 1991年最初由Linus Torvalds针对386 个人计算机 开发 Linus Torvalds那时是芬兰的一名研究生 20世纪80年代 计算机硬件的性能不断提高 PC的市场不断扩大 当时可供
  • axivion和astree_Axivion架构分析及验证工具

    德国Axivion公司 德国Axivion 公司是一家完全自主的技术公司 公司保持持续增长 在软件开发解决方案领域拥有超过10年的经验 作为源于斯图加特大学的公司 Axivion公司提供了一个良好的学术背景 开发专业完整的解决方案 以确保软
  • 2011年终总结-DIY 苹果手机铃声

    一首 月亮之上 红遍中国南北 只要这铃声响起 100个人得有10个人掏出手机看看 当之无愧的山寨歌王 当IPhone变成街机 出厂铃声数量不多 铃声总是撞车 DIY个性铃声很有必要的 只要不选择 月亮之上 就没问题 IPhone设置铃声的方
  • IDEA 打war包部署时子模块jar包没依赖上

    使用IDEA在tomcat中部署maven多模块时出现的一个莫名的bug 首先在server中打印下 可以看见 context startup failed due to previous error see server log for
  • <Python>PyQt5,多窗口之间参数传递和函数调用

    PyQt5的多窗口之间参数如何传递 函数如何调用 之前在学习PyQt5的过程中 试着自己编写一个音乐播放器 基本功能实现后 希望添加一个独立的播放列表 然后实现播放列表和播放主界面之间的函数调用 双击播放列表的歌曲 主窗口播放歌曲 这虽然是
  • 数据库应用:MySQL高级语句(三)存储过程

    目录 一 理论 1 存储过程 2 存储过程操作 3 存储过程的参数 4 存储过程的控制语句 二 实验 1 创建和调用存储过程 编辑 编辑 2 存储过程的参数 3 存储过程的控制语句 三 总结 一 理论 1 存储过程 1 概念 存储过程是一组
  • Android 删除文件

    删除文件 代码逻辑实现 一 首先是将数据给 查 出来 二 删除操作 一 删除系统数据库表对应的索引 二 删除成功后需要更新MediaStore 不然下次查出来的数据有发现怎么删除了的还在 三 根据个人需求 重新查一遍数据 更新数据列表 注意
  • matlab向量生成和运算

    向量的生成 1 直接输入 a 1 2 3 4 2 冒号运算符 3 从矩阵中抽取行或者列 4 线性等分法 利用元素间的等差值来实现 利用函数的形式来实现的 语法格式如下 向量名 linespace 第一个元素数值 最后一个元素数值 向量位数
  • Java架构师之旅(二十九 附录《MyBatis3 用户指南》中文版)

    夜光序言 岁月波光粼粼 赋予爱与生命 唯有生活不能被他人代替 只会有寂寞相随 正文 MyBatis 3 2010 08 01 翻译的一个版本 虽难比较老了 但是有一些基础还是值得学习 毕竟是中文版 Contents MyBatis是什么 6
  • SpringBoot项目启动后执行指定方法的四种实现

    今日的好天气 文章目录 方式一 方法上添加注解 PostConstruct 1 定义 2 PostConstruct和 Autowired 构造函数的执行顺序 3 PostConstruct使用时注意事项 4 几点建议 方式二 实现Comm
  • 深度学习03-卷积神经网络(CNN)

    简介 CNN 即卷积神经网络 Convolutional Neural Network 是一种常用于图像和视频处理的深度学习模型 与传统神经网络相比 CNN 有着更好的处理图像和序列数据的能力 因为它能够自动学习图像中的特征 并提取出最有用
  • Java RSA加密解密及签名验证

    一 简介 RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥 在公开密钥密码体制中 加密密钥 即公开密钥 PK是公开信息 而解密密钥 即秘密密钥 SK是需要保密的 加密算法E和解密算法D也都是公开的 虽然解密密钥SK是由公开密钥PK决