RSA加解密,加签以及验签。

Jmeter-RSA加密、解密、加签、验签 RSA(全称:Rivest-Shamir-Adleman)是一种非对称加密算法,在加密/解密过程中使用不同的密钥,即公钥和私钥。公钥和私钥是成对生成的,一般公钥会存放在客户端,客户端可以使用公钥对内容进行加密,服务器端存放私钥,当服务器端收到加密的内容后,可以通过私钥进行解密。公钥可以公开,但为了安全私钥需要保密。加签是私钥放在客户端,使用私有对数据进行加签,服务器拿到数据后用公钥进行验签。,也可以通过代码生成公钥和私有。 阅读详情

由于RSA算法是不对称加密算法,所以每次加密得到的数据都不相同,同理加签得到的数据每次也不一样。

简单的说下不对称算法,就是两把不同,但是完全匹配的秘钥,去进行加解密,公钥对外提供进行数据加密,私钥自己保存,对加密的数据进行解密。所以私钥不要泄露。

RSA算法原理:

1、任意互质的两个质数p,q。

2、得到连个质数的乘积n。

3、得到两个质数的欧元函数f(n)=(p-1) * (q-1)。

4、任取一个小于f(n)并与其互质的质数e。

5、存在一个数d,使得e^d % f(n) = 1。

6、则(n,e)为公钥,(n,d)为私钥。

加密:待加密数据t:

t^te% n = m(m为加密后的数据);

解密:m^d % n = t(t为原数据)

Java实现RSA算法加密解密,加签以及验签代码如下:

1、Base64工具类:

//Base64加密
public static String encryptBase64(byte[] key){
    return new String(Base64.encodeBase64(key));
}

//Base64解密
public static byte[] decryptBase64(String key) throws IOException {
    return new BASE64Decoder().decodeBuffer(key);
}

2、获取RSA秘钥对:

public static Map<String, Object> keyMap()throws Exception{
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
    keyPairGenerator.initialize(1024);
    KeyPair keyPair = keyPairGenerator.generateKeyPair();
    PublicKey publicKey = keyPair.getPublic();
    PrivateKey privateKey = keyPair.getPrivate();

    Map<String, Object> keyMap = new HashMap<>(2);
    keyMap.put(PUBLIC_KEY, publicKey);
    keyMap.put(PRIVATE_KEY, privateKey);
    return keyMap;
}
3、获取RSA公钥以及私钥分别保存到文件中:

public static void keyToFile(Map keymap)throws Exception{
    PublicKey publicKey = (PublicKey) keymap.get(PUBLIC_KEY);
    PrivateKey privateKey = (PrivateKey)keymap.get(PRIVATE_KEY);
    String encryptBase64PublicKey = encryptBase64(publicKey.getEncoded());
    String encryptBase64PrivateKey = encryptBase64(privateKey.getEncoded());
    FileWriter fw = new FileWriter("src/main/resources/pubKey.txt");//按需要保存路径,下同
    FileWriter fw1 = new FileWriter("src/main/resources/priKey.txt");
    fw.write(encryptBase64PublicKey);
    fw.flush();
    fw.close();
    fw1.write(encryptBase64PrivateKey);
    fw1.flush();
    fw1.close();
}
4、从文件中获取公钥:

public static RSAPublicKey getPublicKeyForFile() throws Exception {
    File file = new File("src/main/resources/pubKey.txt");

    FileInputStream fis = new FileInputStream(file);
    BufferedReader br = new BufferedReader(new InputStreamReader(fis));
    String readLine = null;
    StringBuffer sb = new StringBuffer();
    while ((readLine = br.readLine()) != null) {
        sb.append(readLine);
    }
    String publicKeyStr = sb.toString();
    System.out.println("从文件获取到的公钥:" + publicKeyStr);
    //Base64解密
    byte[] decryptBase64 = GetKey.decryptBase64(publicKeyStr);
    //选取密钥编码规则
    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decryptBase64);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    RSAPublicKey rsaPublicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);
    return rsaPublicKey;
}

5、从文件中获取私钥:

//从文件中获取私钥
public static RSAPrivateKey getPrivateKeyForFile() throws Exception {
    FileInputStream fis = new FileInputStream("src/main/resources/priKey.keyStore");
    BufferedReader br = new BufferedReader(new InputStreamReader(fis));
    String readLine = null;
    StringBuffer sb = new StringBuffer();
    while ((readLine = br.readLine()) != null) {
        sb.append(readLine);
    }
    String privateKey = sb.toString();
    System.out.println("从文件获取到的私钥:" + privateKey);
    //Base64解密
    byte[] bytes = GetKey.decryptBase64(privateKey);
    PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(bytes);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8EncodedKeySpec);
    return rsaPrivateKey;
}

6.公钥加密/私钥解密:

public static byte[] encryptOrDecrypt(Key key, byte[] data, int mode) throws Exception {
    //加密算法:RSA/ECB/PKCS1Padding
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    //提供者
    Provider provider = new BouncyCastleProvider();
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", provider);
    cipher.init(mode, key);
    int blockSize = cipher.getBlockSize();
    int length = data.length;
    int num = length / blockSize + 1;
    int cache = blockSize;
    byte[] bytes = null;
    for (int i = 0; i < num; i++) {
        if (i == num - 1) {
            cache = length % blockSize;
            if (cache == 0) {
                return out.toByteArray();
            }
        }
        bytes = cipher.doFinal(data, i * blockSize, cache);
        out.write(bytes);
    }
    return out.toByteArray();
}
7.RSA私钥加签:

 public static String addSign(PrivateKey privateKey, String context)throws Exception{
        //加签算法:SHA1WithRSA
	Signature signature = Signature.getInstance("SHA1WithRSA");
        signature.initSign(privateKey);
        signature.update(context.getBytes("utf-8"));
        byte[] sign = signature.sign();
        return encryptBase64(sign);
    }
8.RSA公钥验签:

public static boolean verifySign(PublicKey publicKey, String context, String signData)throws Exception{
        Signature signature = Signature.getInstance("SHA1WithRSA");
        signature.initVerify(publicKey);
        byte[] bytes = decryptBase64(signData);
        signature.update(context.getBytes("utf-8"));
        boolean verify = signature.verify(bytes);
        return verify;
    }
9.主测试类:

public class Sign {
  private final static String PUBLIC_KEY = "PUBLIC_KEY";
  private final static String PRIVATE_KEY = "PRIVATE_KEY";
public static void main(String[] args) { try {
		Map<String, Object> map = keyMap();
		keyToFile(map);
		
		RSAPublicKey rsaPublicKey = getPublicKeyForFile();
		System.out.println("rsaPublicKey公钥是:" + rsaPublicKey);
		RSAPrivateKey rsaPrivateKey = getPrivateKeyForFile();
		System.out.println("rsaPublicKey私钥是:" + rsaPrivateKey);
		String data = "这是一个加密字符串"
		//加密
		byte[] encrypt = encryptOrDecrypt(rsaPublicKey, data.getBytes("utf-8"), Cipher.ENCRYPT_MODE);	
		String s = encryptBase64(encrypt);
		System.out.println("加密后的数据:" + s);
//解密 byte[] decrypt = encryptOrDecrypt(rsaPrivateKey, decryptBase64(s), Cipher.DECRYPT_MODE);
System.out.println("解密后的数据" + new String(decrypt));
		//加签
		String signData = addSign(rsaPrivateKey, data);	
		System.out.println("加签后的数据:" + signData);
		
		//验签
		boolean b = verifySign(rsaPublicKey, data, signData);
		System.out.println("验签得到的布尔值为:" + b);

 	} catch (Exception e) {
        e.printStackTrace();
    }
}
最后要说明的是要导入这个包:

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk16</artifactId>
    <version>1.46</version>
</dependency>

一张图了解RSA加解密与加验签 RSA加密验签是对安全性要求比较高的机构间通信常用的方式,密钥足够长的情况下,当前的计算能力还不足以解密(不过量子计算机...未来谁知道呢!)。然而,我发现还是有人对这种过程一知半解。比如你们的加签算法用的什么?回答RSA......比如有些机构会对生成的密钥对再用Base64进行编码,这样使用的时候就需要对应的解码,这个过程都被封装在工具类里面了,所以大家看代码的时候尽量多进去看看源码。RSA只 阅读详情

相关推荐

华硕三频万兆分布式路由组网实战:从AiMesh 2.0到全屋Wi-Fi 6覆盖

Mesh组网是解决大户型Wi-Fi覆盖难题的主流方案,其核心原理是通过多个节点构建网状网络,实现设备间的无缝漫游。在技术层面,Wi-Fi 6标准、三频设计(包括专属回程频段)和有线回程等技术,共同提升了网络的带宽、稳定性和抗干扰能力。这些技术的工程价值在于,能够为多设备并发、高带宽应用(如4K/8K流媒体、在线游戏、内网文件高速传输)提供可靠支撑。具体到应用场景,例如利用华硕AiMesh 2.0系统,配合三频万兆分布式路由器,可以实现智能的设备连接与负载均衡。通过合理规划节点位置、优先采用有线回程,并进行Q

weixin_34054866的博客 431

RSA加签解签方法

一、RSA签名的过程 (1)A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。 (2)A用自己的私钥对消息加签,形成签名,并将加签的消息和消息本身一起传递给B。 (3)B收到消息后,在获取A的公钥进行验签,如果验签出来的内容与消息本身一致,证明消息是A回复的。   在这个过程中,只有2次传递过程,第一次是A传递加签的消息和消息本身给B,第二次是B获取A的公钥,即使都被敌方截获,也没有危险性,因为只有A的私钥才能对消息进行签名,即使知道了消息内容,也无法伪造带签名的回

苍白的咏叹调的博客 4559

MATLAB射线追踪算法实战:从零搭建通信信号传播模型(附完整代码)

本文提供了一份详细的MATLAB射线追踪算法实战指南,指导读者从零开始搭建通信信号传播模型。内容涵盖场景建模、射线发射、路径追踪与信号计算等核心环节,并附有完整代码,帮助通信与电子工程领域的学习者和工程师快速掌握这一精确模拟电磁波传播的关键技术。

weixin_29092031的博客 198

RSA加密,解密,加签及验签

RSA后端加密,解密,加签及验签

m0_72167535的博客 3919

射频电源与等离子体技术:原理、应用与优化策略

射频电源(RF Power Supply)作为高频交流电信号发生器,在半导体制造和材料处理中扮演关键角色。其核心原理是通过高频电场激发气体产生等离子体,这种电离气体包含电子、离子和活性基团,具有独特的非平衡特性。技术价值体现在等离子体密度和电子温度的可控性上,使得在刻蚀和沉积工艺中能精确调控材料处理效果。应用场景广泛覆盖PECVD、深槽刻蚀等工业流程,其中13.56MHz ISM频段因其全球合规性成为行业标准。优化策略包括双频驱动和阻抗匹配网络设计,可显著提升工艺均匀性和设备效率。

weixin_29163797的博客 389

【机器学习】图神经网络(NRI)模型原理和运动轨迹预测代码实现

NRI模型利用VAE和GNN从观测数据中学习系统动态和交互图,展现出在无监督学习、图结构建模、多步预测和连续松弛方面的强大能力。未来工作可探索动态图结构学习、应用于更复杂系统、提高模型泛化能力和计算效率,以及与其他模型的结合。NRI作为新兴的图神经网络方法,在理解和预测相互作用系统方面潜力巨大,有望在各领域发挥重要作用。

MUKAMO的博客 2778

RSA加密、解密、签名、验签的原理及方法

一、RSA加密简介   RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。 二、RSA加密、签名区别   加密和签名都是为了安全性考虑,但略有不同。常有人问加密和签名是用私钥还是公钥?其实都是对加密和签名的作用有所混淆。简单的说,加密是为了防

扛麻袋的少年的博客 6271

红日-VulnStack靶场-ATT&CK(二):从Weblogic漏洞到域控渗透实战

本文详细解析了红日安全团队VulnStack靶场中从Weblogic漏洞到域控渗透的完整攻击链。通过实战演示Weblogic反序列化漏洞利用、Cobalt Strike持久化控制、域内信息收集及PsExec横向移动等关键技术,复现了企业内网渗透的典型场景,并提供了防御建议。

tgb3456789的博客 936

RSA基本介绍、加解密、加验签

比如A和B都有一套自己的公钥和秘钥,当 A 要给B发送消息时,先用 B 的 公钥对消息加密,再用A的私钥对消息签名。这个过程中也有2次传递,第一次A将私钥加密的信息传递给B,第二次 B 获取 A 的公钥,即使被恶意截获,也没有危险,即使知道了消息的内容,也无法伪造带签名的信息回复给B,因为只有A的私钥才能对信息进行签名,防止了信息被恶意篡改。这个过程,有两次传递,一次是A将公钥传给B,第二次是B将公钥加密后的信息传给A,即使两次均被恶意获取,也没有关系,只有A手中的私钥,可以解密出准确的信息。

SA的博客 2081

拉曼光谱入门:7.拉曼光谱仪光学系统结构详解

本文系统拆解了拉曼光谱仪从激光器输出经聚焦照明、二向色镜/陷波滤光片组滤除瑞丽散射、衍射光栅色散至CCD探测的完整光路,阐述了各光学模块在微弱非弹性散射信号提取、杂散光抑制及高分辨光谱成像中的工程原理与技术参数要求。

qq_53529450的博客 223

RK3588芯片:ALSA音频通路下HDMI与耳机自动切换的技术探索

摘要:本文详细探讨了基于RK3588芯片的HDMI与耳机自动切换方案。文章首先剖析了ALSA音频架构的核心组件与工作原理,接着介绍了RK3588芯片的硬件特性及音频处理优势。重点阐述了自动切换的实现原理,包括硬件检测机制、ALSA驱动处理逻辑和软件控制流程,并提供了详细的配置步骤。同时针对常见问题如切换异常、音频质量下降等给出了解决方案。该方案通过合理配置设备树和ALSA文件,实现了音频输出的智能切换,提升了用户体验,展现了RK3588在音频处理领域的强大性能。未来随着AI音频技术的发展,该方案在智能家居、

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 266

java中RSA分段加解密与加签验签

背景 RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以过长数据在加密和解密的过程中需要分块进行。 RSA加密对明文的长度是有限制的,如果加密数据过大会抛出如下异常: Exception in thread “main” javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes...

程序员小强的博客 7391

低功耗设计-ir drop的signoff corner怎么选择?

2.tt的(tt85 是比较接近芯片真实工作情况的);我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?有要求就用要求的就好,没要求前两种看公司需求。3.signoff文档要求的;有几个方向,看公司需求吧。

m0_61544122的博客 1594

springboot + vue 前后端加密传输 RSA互相加解密、加签验签、密钥对生成

springboot + vue RSA加密传输 加签 验签 非对称加密

nalanxiaoxiao2011的博客 5915

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

RSA加解密,加签以及验签

由于RSA算法是不对称加密算法,所以每次加密得到的数据都不相同,同理加签得到的数据每次也不一样。 简单的说下不对称算法,就是两把不同,但是完全匹配的秘钥,去进行加解密,公钥对外提供进行数据加密,私钥自己保存,对加密的数据进行解密。所以私钥不要泄露。 RSA算法原理: 1、任意互质的两个质数p,q。 2、得到连个质数的乘积n。 3、得到两个质数的欧元函数f(n)=(p-1) * (q-1)...

jianpan_zouni的博客 1773

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

前后端RSA互相加解密、加签验签、密钥对生成(Java)

PKCS#1和PKCS#8是两个不同的数字证书标准。PKCS#1是一个公钥加密标准,它定义了使用RSA算法进行加密和签名的格式。主要用于对数字签名、加密以及数字签名验证等应用。PKCS#8则是一个私钥保护标准,它定义了私钥的存储格式。它主要用于在文件中对私钥进行保护,以防止意外泄露或不当使用。总的来说,PKCS#1是针对公钥的标准,而PKCS#8是针对私钥的标准。

lingbomanbu_lyl的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

RSA加验签、加解密

apollo读取本地配置, 修改C:\opt\settings目录下的server.properties将env从DEV(开发环境)切换到(LOCAL)本地 修改C:\opt\data\jp-cashier\config-cache目录下 注:下图文件在第一次连接apollo就会在本地缓存服务器上的配置 将 valid.sign 属性设置为true 即开启验签   公私钥保存方...

kissandlove的博客 615

RSA加解密&加验签

简介 RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、*阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)*一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。 RSA 加密或签名后的结果是不可读的二进制,使用时经常会转为 BA...

qq_37209293的博客 23万+

rsa加解密、加验签

一、简介 RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。 二、加签、加密说明 加密和加签(签名)都是为了安全性考虑,但略有不同。简单的说,加密是为了防止信息被泄露,而加签(签名)是为了防止信息被篡改。 三、加密/解密 1、A生成一对密钥(

u013067015的博客 420

rsa加解密及加签验签

加密要用到Crypto安装包 pip install Crypto 新建两个模块rsautils.py, rsatest.py直接上代码, rsautils.py #!/usr/bin/env python3# coding=utf-8# Author: Luosu201803"""create_rsa_key() - 创建RSA密钥my_encrypt_and_decrypt() - 测试...

weixin_30682127的博客 700

rsa验签中文_RSA加解密&RSA加验签详解

RSA加密算法是目前最有影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案之一。RSA是第一个能同时用于 数据加密和数字签名的算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。1.1 密钥对生成RSA非对称加密密钥对,可以用OpenSSL的命令生成,也可以直接在线生成(http://web.chacuo.net/netrsakeypa...

weixin_30840919的博客 1541

使用支付宝SDK进行RSA加签验签以及加密解密

背景 支付宝开元SDK中提供了RSA工具类,可以方便的对数据进行加解密,经测试演示版本sdk支持分段加解密,并且提供了加签与验签的常用方法。并支持RSA与RSA2两种类的签名类型。 Maven 支付宝SDK依赖 注:maven中央库直达连接 https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java &amp;lt;dependen...

程序员小强的博客 1万+

rsa验签中文_5. RSA加解密和加签验签

RSA 是一种常用的非对称加密,一般采用公钥加密、私钥解密,具体非对称加密的介绍可参见文章常用的加密算法 。如下样例代码中包括如下功能:初始化RSA秘钥生成RSA公私钥使用公私钥进行加密和解密的操作具体应用场景中公私钥一般不会成对出现,系统双方会交换公钥,解密对方发过来的数据。当然,为了保证接口参数的正确性,一般来说还会对参数做一下签名的操作,这个后续再整理。package com.my.test...

weixin_34521351的博客 422

python RSA 密钥对的获取 数据加解密 加签验签

RSA加密算法是一种非对称加密算法。在公开密钥中RSA被广泛使用。 加密原理:数据使用公钥进行加密,只能使用对应的私钥才能进行解密数据。 加签验签的原理:数据进行私钥加签后,需使用公钥进行验签,加签使用的算法有: SHA-1,SHA-224,SHA-224,SHA-256,SHA-384,SHA-512,MD5 1、python 中的rsa库安装 #在线安装rsa库 pip inst...

superlchao的博客 2862

使用支付宝SDK进行RSAj加签验签以及加密解密

背景 支付宝开元SDK中提供了RSA工具类,可以方便的对数据进行加解密,经测试演示版本sdk支持分段加解密,并且提供了加签与验签的常用方法。并支持RSA与RSA2两种类的签名类型。 注:生产RSA签名请参考 https://docs.open.alipay.com/291/105971 Maven 支付宝SDK依赖 注:maven中央库直达连接 ht...

weixin_30878501的博客 2183
上一篇: maven工程导入本地maven库
下一篇: java实现MD5算法加密
S_First
博客等级 码龄9年 3粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值