目录

一、RSA简介

二、加密、签名区别

三、公私钥生成

四、RSA工具类


一、RSA简介

  非对称加密算法,由一对密钥(公钥-私钥)来进行加密-解密、签名-验签的过程。公钥-私钥的生成与数学相关,算法的原理是依靠对极大整数做因数分解的困难性来保证安全性。

二、加密、签名区别

  加密和签名都是为了信息传递途中的安全,原理略有不同,加密是防止信息明文传输被泄露,签名是防止信息被篡改。

加密场景:A服务器向B服务器传递一指令。

过程如下:

(1)B生成一对密钥(公钥-私钥),私钥B自己保留,公钥任何人可以获取。

(2)B传递自己的公钥给A,A用B的公钥对消息进行加密。

(3)B接收到A加密的消息,利用B自己的私钥对消息进行解密。

整个流程含两次传递过程,第一次是B传递公钥给A,第二次是A传递加密消息给B,即使都被第三方非法截获,也没有危险性,因为只有B的私钥才能对消息进行解密,防止了消息内容的泄露。

验签场景:B服务器收执行完A服务器发的指令后,向A回复执行结果。

过程如下:

(1)B用自己的私钥对回复的消息加签,形成签名,并将签名和消息本身一起传递给A。

(2)A收到回复后,使用B提供的公钥进行验签,如果验签解析出的内容与消息本身一致,证明消息是B回复的。

即使回复的消息被第三方非法截获,也没有危险性,因为接收方A使用的是B的公钥进行验签,只有B的私钥生成的签名才能通过A的验签,即使第三方非法获取消息内容,也无法伪造带签名的回复给A,防止了消息内容被篡改。

  但是不难发现,加密场景中,可以利用截获的公钥,将假指令进行加密,然后传递给B。验签场景中,虽然截获的消息不能被篡改,但是消息的内容可以利用公钥验签获得,并不能防止泄露。所以实际应用中要根据情况使用,最好同时使用加密和签名,比如A和B都有一套自己的公钥和私钥,当A要给B发送消息时,先用B的公钥对消息加密,再对加密的消息使用A的私钥加签名,达到既不泄露也不被篡改,从而保证消息的安全性(公钥加密、私钥解密、私钥签名、公钥验签)。

三、公私钥生成

1.下载openssl工具,通过工具生成RSA的公钥和私钥,安装简单,不再赘述,安装后如下图:

2.双击openssl.exe文件,打开命令窗口,输入命令:genrsa -out rsa_private_key.pem 1024   并回车,得到生成成功的结果,如下图:

此时再看文件路径,发现bin文件夹中多了一个名为rsa_private_key.pem的文件,这个是原始的私钥,如下图:

3、把RSA私钥转换成PKCS8格式

命令窗口,输入命令:pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt   并回车,得到生成功的结果,这个结果就是PKCS8格式的私钥,如下图:

右键点击命令窗口上边缘,选择编辑→标记,选中要复制的文字(如下图),再次右键点击窗口上边缘,选择编辑→复制,即可获得PKCS8格式的私钥。

4、生成公钥
命令窗口,输入命令:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem  并回车,得到生成成功的结果,如下图:

此时再看文件路径,发现bin文件夹中多了一个名为rsa_public_key.pem的文件,如下图:

以上,将公私密钥整理成没有换行的字符串,再配置到接口中使用即可。

四、RSA工具类

package com.common.utils.rsa;import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;import javax.crypto.Cipher;public class RSAUtil {public static final String SIGNATURE_INSTANCE = "SHA1WithRSA";/*** @Title: getPublicKey* @Description:实例化公钥* @author weny.yang* @date May 13, 2021*/public static PublicKey getPublicKey(String publicKey) throws Exception {byte[] publicKeyBytes = Base64.getDecoder().decode(publicKey.getBytes());X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");return keyFactory.generatePublic(keySpec);}/*** @Title: getPrivateKey* @Description:实例化私钥* @author weny.yang* @date May 13, 2021*/public static PrivateKey getPrivateKey(String privateKey) throws Exception {byte[] privateKeyBytes = Base64.getDecoder().decode(privateKey.getBytes());PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");return keyFactory.generatePrivate(keySpec);}/*** @Title: encryptByPublicKey* @Description:公钥加密* @author weny.yang* @date May 13, 2021*/public static byte[] encryptByPublicKey(byte[] content, String publicKey) throws Exception {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, getPublicKey(publicKey));return cipher.doFinal(content);}/*** @Title: decryptByPrivateKey* @Description:私钥解密* @author weny.yang* @date May 13, 2021*/public static byte[] decryptByPrivateKey(byte[] content, String privateKey) throws Exception {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, getPrivateKey(privateKey));return cipher.doFinal(content);}/*** @Title: sign* @Description:私钥签名* @author weny.yang* @date May 13, 2021*/public static byte[] sign(byte[] content, String privateKey) throws Exception {Signature signature = Signature.getInstance(SIGNATURE_INSTANCE);signature.initSign(getPrivateKey(privateKey));signature.update(content);return signature.sign();}/*** @Title: verify* @Description:公钥验签* @author weny.yang* @date May 13, 2021*/public static boolean verify(byte[] content, byte[] sign, String publicKey) throws Exception {Signature signature = Signature.getInstance(SIGNATURE_INSTANCE);signature.initVerify(getPublicKey(publicKey));signature.update(content);return signature.verify(sign);}public static void main(String[] args) throws Exception {String content = "这座城市每一个角落,都填满了若有所思的生活!";String privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBALJdXl5hVjEl8VLvwB1UaBRfzSetFch3Y6lQnmkV43XYGifRmrayM/JZWLA1ZGNXI+gqu73GYrMY8tLhQ7sneYF8rMdKqgYuBgwvYLtoNz8Rc8On/qkSssuCXXzRyOE1NHXheXeFBbkOvxXkzoG6Ry7O1205RD8Iw6ZWQV4OMPB7AgMBAAECgYBlgzQ5POakNDcDf8X0K1zM87U8NosmO6Sx8Vsm7bk2EZbZQLbv8b4U2Prb1pda3nZmJSQSnvz/d1yD3ocA1jeVIVUUEPhVPVVNFkF3Cq0I5Y/USAJFJAQjJRO71pwEO116PwDLmAVKwUFnhq7QKvvFMAq9kYSCrVQLnV3oDF+Z+QJBAOoOFU5ocGVSRCk+D3ub7vTm9nkIvIGjvQIzJV8l8Iz9S5PX1kVh7VF4pUJjVUsdB9gmmsJm//5QyvhbujULvL0CQQDDFpOUdtuYMAqTN4HJ3QUMdsVYs0yscu66bhrlYziJEjVNVD9H6Twm8Z20xqvbDT3955oe1UF/wP2pH7AzVWGXAkAlrmTBvdCyjz8IAMTPWrhq1zBBJiXrHShVzVQr8Fi86h6by7jkbLKfVjQM7x8RO7hClVx/BcQa9njm6SWeWqhlAkBQT2PzkzZ1IRnJXulUE2N3rREyoaUnvKygHKF/2ue0LcW5jrv6O36ivYZhnAO1Sm9Bre0ZUksDb4w86imcCEMDAkAdC7dQQPCElFsVIcIaw639LqPshy0J98t67z5NleTOnx1KvhpoG+7O92+PLNUWH+LmkiLuVRe0LNRY2vVVOk93";String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyXV5eYVYxJfFS78AdVGgUX80nrRXId2OpUJ5pFeN12Bon0Zq2sjPyWViwNWRjVyPoKru9xmKzGPLS4UO7J3mBfKzHSqoGLgYML2C7aDc/EXPDp/6pErLLgl180cjhNTR14Xl3hQW5Dr8V5M6BukcuztdtOUQ/CMOmVkFeDjDwewIDAQAB";byte[] encrypt = encryptByPublicKey(content.getBytes("UTF-8"), publicKey);byte[] decryp = decryptByPrivateKey(encrypt, privateKey);System.out.println("明文:"+new String(decryp));byte[] sign = sign(content.getBytes("UTF-8"), privateKey);boolean verify = verify(content.getBytes("UTF-8"), sign, publicKey);System.out.println("验签结果:"+verify);}}

RSA公私钥生成、加解密、签名及验签的原理及工具类相关推荐

  1. ios rsa加密 java解密_iOS RSA加密与解密 签名与验签(附Java端处理)

    本篇文章将涉及以下几个操作: 1.iOS端使用RSA公钥加密,iOS端使用RSA私钥解密. 2.iOS端使用RSA私钥加签,iOS端使用RSA公钥验签. 3.iOS端使用RSA公钥加密,Java端使用 ...

  2. 在openssl中对SM2的公私钥进行加解密的验证

    在上一篇文章中<通过openssl生成sm2的公私钥的方法>介绍了如何在openssl系统中生成公私钥对,如何对生成的公私钥对进行验证呢? 在ecparam.c中,添加加解密的代码就可以了 ...

  3. RSA公私钥加密加签顺序

    RSA是一种非对称加密的机制,是一对密钥对(公钥和私钥). 一.加密: 1.公钥加密,私钥解密.可以多人持有公钥进行数据加密,仅一人持有私钥进行数据解密: 2.可以确保数据传输的安全性. 二.加签: ...

  4. openssl gmssl SM2 公私钥生成 加密解密命令

    openssl 从 1.1.1 开始支持 sm2.gmssl 基于openssl 添加了对国密的支持. 检测 openssl 是否支持 SM2 openssl ecparam -list_curves ...

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

    目录 一.RSA加密简介 二.公钥与私钥的理解 三.RSA加密解密 四.RSA签名和验证 五.加密的作用 六.两种不同的加密与解密 七.RSA加密.签名区别 八.RSA加密.签名的方法,代码例子如下: ...

  6. STM32F103驱动RJMU401实现SM2加解密、签名与验签

    目录 前言 一.什么是加密.硬件加密以及加密芯片品牌? 二.开发记录 1.开发环境 2.开发流程 3.常见问题汇总 总结 前言 项目需要加密并且需要采用硬件加密,加密方式为非对称–SM2,之前只接触过 ...

  7. Java应用服务系统安全性,签名和验签浅析

    1 前言 随着互联网的普及,分布式服务部署越来越流行,服务之间通信的安全性也是越来越值得关注.这里,笔者把应用与服务之间通信时,进行的的安全性相关,加签与验签,进行了一个简单的记录. 2 安全性痛点 ...

  8. java中使用openssl生成的rsa公私钥进行数据加解密_使用openssl生成RSA公钥和私钥对...

    在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互界面 ...

  9. 分享一个RSA加解密工具类,公钥加密私钥解密、私钥加密公钥解密、私钥签名公钥验签、生成公钥私钥

    测试: public static void main(String[] args) {try {//生成公钥私钥Map<String, Object> map = RSAUtil.ini ...

最新文章

  1. Zookeeper watch机制
  2. 南京超过广州!4 月程序员工资统计出炉,平均 14596 元
  3. 一个专业处理字符串的IDEA插件
  4. 洋哥大讲堂之解决Windows10操作系统中,“启用或关闭windows功能”里没有IE选项的问题...
  5. python3入门与进阶笔记_16_变量进阶 — 黑马程序员《Python入门教程完整版》笔记...
  6. UIT信息容灾概论(6)
  7. 苹果封杀360应用 腾讯金山同时中枪
  8. 本周的比特币现金市场和商家支持
  9. 解决svn:E200030: sqlite[S11]:database disk image is malformed
  10. 2021-07-12 原来我用的是CPU,更改方法
  11. SIFT算法学习心得
  12. 关于Redis缓存和数据库一致性问题
  13. 计算机锁屏如何取消密码,笔记本电脑怎么取消锁屏密码
  14. 精密仪器及机械类毕业论文文献包含哪些?
  15. Android 反编译利器,jadx 的高级技巧
  16. 基于单幅图像的2D转3D算法研究
  17. 分类计数原理与分步计数原理_分类计数原理与分步计数原理
  18. JS中字符串的创建、操作及其方法
  19. PHP新浪乐居面试题,一个朋友去新浪乐居应聘时的面试题_PHP教程
  20. 小酌重构系列[3]——方法、字段的提升和降低

热门文章

  1. 【Proteus仿真】【51单片机】智能雨刷器设计
  2. 数字图像处理MATLAB大作业:基础版
  3. 认知无线电网络中的用户
  4. 计算机教学改革典型案例,高职计算机课程案例化与信息化融合的教学改革探讨...
  5. 创建自己的pk8, x509.pem并给app签名
  6. 坐标系转换矩阵和几何转换矩阵的关系
  7. 【U8+】用友U8-UFO报表录入关键字,计算后乱码
  8. Oracle中cursor(游标)总结
  9. 802.11n-技术概览
  10. http://www.