目录

  • RSA原理
  • RSA应用场景
    • RSA加密场景
    • RSA签名场景
  • RSA加解密和签名算法的java实现

RSA原理

通过一定的规则,生成公钥和私钥,公钥和私钥总是成对出现。
公钥可以公开出去,任何人都可以知道。
私钥只有自己知道。
RSA算法能保证,公钥加密后的密文,只有对应的私钥才能解密。或者,私钥加密后的密文,只有对应的公钥才能解密。
而且不能通过公钥得到私钥,也不能通过私钥算出公钥。

关于为什么公私钥直接不能互相转换,请看我之前的一篇文章:
非对称加密算法之RSA算法实现

RSA应用场景

RSA加密场景

A给B传一条消息,要保证哪怕消息被截取了,也不能让别人知道消息的真正含义。
1、B生成公钥和私钥,私钥自己保留,把公钥传给A
2、A用公钥加密要传的消息,然后把密文传给B
3、B用私钥解密密文,得到真正的消息。
这样做的好处是,就算有人把中间的密文和公钥都拿到了,他也获取不到明文。
因为RSA的特点就是公钥加密,必须用对应的私钥才能解密。而私钥一直是B保管。

RSA签名场景

同样的,A给B传一条消息,可以明文传输,但要保证,B收到的,就是A发出的,不能被别人恶意修改。
1、B生成公钥和私钥,私钥自己保留,把公钥传给A
2、A用公钥对要传的信息进行签名,形成签名信息。A将签名信息和明文一起传给B
3、B收到明文和签名后,用私钥对签名进行验证,如果验证通过,则证明B收到的明文就是A发出的明文。
这样做的好处是,哪怕中间有人截取到明文和签名,只要修改任意一个,B那里最终都不会验证通过。

RSA加解密和签名算法的java实现


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 java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;public class TestRsa {// 私钥对象private PrivateKey sk;// 公钥对象private PublicKey pk;// 私钥字符串private String privateKeyStr;// 公钥字符串private String publicKeyStr;// 初始化公钥私钥public TestRsa() throws NoSuchAlgorithmException {KeyPairGenerator rsa = KeyPairGenerator.getInstance("RSA");rsa.initialize(1024);KeyPair keyPair = rsa.generateKeyPair();sk = keyPair.getPrivate();pk = keyPair.getPublic();privateKeyStr = new String(Base64.encodeBase64(sk.getEncoded()));publicKeyStr = new String(Base64.encodeBase64(pk.getEncoded()));}// 公钥加密public String encrypt(String str, String publicKey) throws Exception {//base64编码的公钥byte[] decoded = Base64.decodeBase64(publicKey);RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));return outStr;}// 私钥解密public String decrypt(String str, String privateKey) throws Exception {//64位解码加密后的字符串byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));//base64编码的私钥byte[] decoded = Base64.decodeBase64(privateKey);RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));//RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, priKey);String outStr = new String(cipher.doFinal(inputByte));return outStr;}// 私钥签名public String sign(String str) throws Exception {Signature signature = Signature.getInstance("SHA1withRSA");signature.initSign(this.sk);signature.update(str.getBytes());byte[] sign = signature.sign();return new String(Base64.encodeBase64(sign));}// 公钥验证public boolean verify(String str, String sign) throws Exception {Signature signature = Signature.getInstance("SHA1withRSA");signature.initVerify(this.pk);signature.update(str.getBytes());return signature.verify(Base64.decodeBase64(sign.getBytes("UTF-8")));}public static void main(String[] args) throws Exception {String str = "这是加密前的明文";TestRsa testRsa = new TestRsa();String encrypt = testRsa.encrypt(str, testRsa.publicKeyStr);System.out.println("加密后的密文:" + encrypt);String decrypt = testRsa.decrypt(encrypt, testRsa.privateKeyStr);System.out.println("解密后的明文:" + decrypt);// 签名String sign = testRsa.sign(str);System.out.println("签名结果:" + sign);// 验证boolean verify = testRsa.verify(str, sign);System.out.println("验证结果:" + verify);// true// 验证反例String str2 = "这是被恶意修改过的伪原文";boolean verify2 = testRsa.verify(str2, sign);System.out.println("验证结果2:" + verify2);// false}
}

最终结果:

加密后的密文:Pc/lj5beiojR1BIiEG1O9fooVOmwDgQixN9qX19ofU3Myq5iOViMqEM2lUZ+tmihms3BrLahZze2FeZVR1wrTSk24ZTK5rjKtL1GZLsQI6m/wNXmk9bA5gYbcR6ivZSTEw5a9+77mcAFuAgpeSmSM825NOTAt7epZeUt7i9FPNY=
解密后的明文:这是加密前的明文
签名结果:Oe2XuGCb5mBwE4JTRPcemipOSuXEsw+hxido6r3/FSyDhx371sdg6/iRYQk6C2FuOqOpltWBJ4gA7x+VfJSJoA94+EIu5WxOaupaPumzNrsfhC/ZtYRUw0PfUvR5j232LH5bfA+Dh6pGbo1gu6qMVf8EtS63BoGHi9SYP068uss=
验证结果:true
验证结果2:false

非对称加密算法 --- RSA签名算法相关推荐

  1. 非对称加密算法RSA公钥私钥的模数和指数提取方法

    生成非对称加密算法RSA公钥.私钥的方法: 1. 通过OpenSSL库生成,可参考  https://github.com/fengbingchun/OpenSSL_Test/blob/master/ ...

  2. python实现非对称加密算法_Python3非对称加密算法RSA实例详解

    本文实例讲述了Python3非对称加密算法RSA.分享给大家供大家参考,具体如下: python3 可以使用 Crypto.PublicKey.RSA 和 rsa 生成公钥.私钥. 其中 python ...

  3. 网络安全_密码学实验_非对称加密算法RSA

    网络安全_密码学实验_非对称加密算法RSA 一.实验环境 二.非对称加密RSA 1.理解RSA算法原理 2.加密过程 解密过程 一.实验环境 PyCharm 2019.2.4 (Professiona ...

  4. Java加密技术(四)——非对称加密算法RSA

    转自:http://snowolf.iteye.com/blog/381767 接下来我们介绍典型的非对称加密算法--RSA RSA     这种算法1978年就出现了,它是第一个既能用于数据加密也能 ...

  5. java js 非对称加密算法_Java加密技术(四)——非对称加密算法RSA

    Java非对称加密算法rsa 接下来我们介绍典型的非对称加密算法--RSA RSA 这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字 ...

  6. Java进阶(七)Java加密技术之非对称加密算法RSA

    Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...

  7. 非对称加密算法-RSA

    2019独角兽企业重金招聘Python工程师标准>>> 1.概述 RSA有两个密钥,一个是公开的,称为公开密钥:一个是私密的,称为私密密钥. 特点: 公开密钥是对大众公开的,私密密钥 ...

  8. 在非对称加密算法RSA中,假设“大”素数p=5,q=11,试给出计算过程。

    文章目录 1. 题目在非对称加密算法RSA中,假设"大"素数p=5,q=11,试给出计算过程. 2. 分析步骤 3. 抄作业简单粗暴看这里 4. 参考 1. 题目在非对称加密算法R ...

  9. Java实现非对称加密算法-RSA加解密

    RSA是由三位数学家Rivest.Shamir 和 Adleman 发明的非对称加密算法,这种算法非常可靠,秘钥越长,就越难破解. 目前被破解的最长RSA秘钥是768个二进制位,长度超过768位的秘钥 ...

最新文章

  1. 每个即将成为或想成为网络工程师最想看的文章
  2. RabbitMQ(二)工作队列
  3. Spring中Bean的后置处理器
  4. JS之Boolean的valueOf方法
  5. 关于微信小程序下拉出现三个小点
  6. 【Office Word】论文排版有关技巧
  7. 如何给一家公司做定性研究?
  8. 学习 Python 第八天
  9. 【Matlab学习笔记】【函数学习】max()和max(max())的区别
  10. java调用win32_java调用win32api操作windows窗口
  11. 惠普打印机换硒鼓(墨盒)
  12. 计算一幅图像的信噪比
  13. MYSQL UPDATE使用子查询
  14. px和毫米的换算_px与mm换算(px换成mm)
  15. 海量数据处理技巧-转载
  16. 升级IOS15.4出现更新验证失败如何解决
  17. 计算机投针实验程序,蒲丰投针问题
  18. 学会网页制作,web开发,你需要掌握这3个编程语言
  19. 线性代数系列讲解第七篇 正交向量及正交空间
  20. 相关性系数及其python实现

热门文章

  1. 如何修改服务器Tomcat的首页为项目
  2. 知识图谱最新权威综述论文解读:开篇部分
  3. Redis高可用详解:持久化技术及方案选择
  4. win10安装RabbitMQ
  5. python——面向对象相关
  6. bzoj1085骑士精神(搜索)
  7. Sprint2-3.0
  8. 一张图看懂AR至GL数据流
  9. 第一章 计算机系统概述 1.2.2 各硬件部分的介绍 [计算机组成原理笔记]
  10. 【剑指offer】面试题57 - II:和为s的连续正数序列(Java)