非对称加密算法 --- RSA签名算法
目录
- 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签名算法相关推荐
- 非对称加密算法RSA公钥私钥的模数和指数提取方法
生成非对称加密算法RSA公钥.私钥的方法: 1. 通过OpenSSL库生成,可参考 https://github.com/fengbingchun/OpenSSL_Test/blob/master/ ...
- python实现非对称加密算法_Python3非对称加密算法RSA实例详解
本文实例讲述了Python3非对称加密算法RSA.分享给大家供大家参考,具体如下: python3 可以使用 Crypto.PublicKey.RSA 和 rsa 生成公钥.私钥. 其中 python ...
- 网络安全_密码学实验_非对称加密算法RSA
网络安全_密码学实验_非对称加密算法RSA 一.实验环境 二.非对称加密RSA 1.理解RSA算法原理 2.加密过程 解密过程 一.实验环境 PyCharm 2019.2.4 (Professiona ...
- Java加密技术(四)——非对称加密算法RSA
转自:http://snowolf.iteye.com/blog/381767 接下来我们介绍典型的非对称加密算法--RSA RSA 这种算法1978年就出现了,它是第一个既能用于数据加密也能 ...
- java js 非对称加密算法_Java加密技术(四)——非对称加密算法RSA
Java非对称加密算法rsa 接下来我们介绍典型的非对称加密算法--RSA RSA 这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字 ...
- Java进阶(七)Java加密技术之非对称加密算法RSA
Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...
- 非对称加密算法-RSA
2019独角兽企业重金招聘Python工程师标准>>> 1.概述 RSA有两个密钥,一个是公开的,称为公开密钥:一个是私密的,称为私密密钥. 特点: 公开密钥是对大众公开的,私密密钥 ...
- 在非对称加密算法RSA中,假设“大”素数p=5,q=11,试给出计算过程。
文章目录 1. 题目在非对称加密算法RSA中,假设"大"素数p=5,q=11,试给出计算过程. 2. 分析步骤 3. 抄作业简单粗暴看这里 4. 参考 1. 题目在非对称加密算法R ...
- Java实现非对称加密算法-RSA加解密
RSA是由三位数学家Rivest.Shamir 和 Adleman 发明的非对称加密算法,这种算法非常可靠,秘钥越长,就越难破解. 目前被破解的最长RSA秘钥是768个二进制位,长度超过768位的秘钥 ...
最新文章
- 每个即将成为或想成为网络工程师最想看的文章
- RabbitMQ(二)工作队列
- Spring中Bean的后置处理器
- JS之Boolean的valueOf方法
- 关于微信小程序下拉出现三个小点
- 【Office Word】论文排版有关技巧
- 如何给一家公司做定性研究?
- 学习 Python 第八天
- 【Matlab学习笔记】【函数学习】max()和max(max())的区别
- java调用win32_java调用win32api操作windows窗口
- 惠普打印机换硒鼓(墨盒)
- 计算一幅图像的信噪比
- MYSQL UPDATE使用子查询
- px和毫米的换算_px与mm换算(px换成mm)
- 海量数据处理技巧-转载
- 升级IOS15.4出现更新验证失败如何解决
- 计算机投针实验程序,蒲丰投针问题
- 学会网页制作,web开发,你需要掌握这3个编程语言
- 线性代数系列讲解第七篇 正交向量及正交空间
- 相关性系数及其python实现