第一部分:RSA算法原理与加密解密

一、RSA加密过程简述

A和B进行加密通信时,B首先要生成一对密钥。一个是公钥,给A,B自己持有私钥。A使用B的公钥加密要加密发送的内容,然后B在通过自己的私钥解密内容。

二、RSA加密算法基础

整个RSA加密算法的安全性基于大数不能分解质因数。

三、数学原理

(一)  互质关系:两个数a和b没有除1外的其他公约数,则a与b互质

1.        任意两个质数构成互质关系

2.        两个数中,如果大数为质数,则两数必定互质

3.        1和任意整数互质

4.        当p>1时,p与p-1互质(相邻两数互质)

5.        当p=2n+1(n>0且n为整数)时,p与p+2互质(相连的两个奇数互质)

(二)  求欧拉函数:

定义:与正整数n互质且小于正整数n的正整数的个数。通常使用ψ(n)表示。

求取与正整数n互质的正整数的个数ψ(n),且ψ(n)满足ψ(n)∈(2,n)

1.        如果n=1,则ψ(n)=1

2.        如果n是质数,则ψ(n)=n-1

3.        如果n是质数p的次方,则:ψ(p^k)=p^k-p^(k-1) = p^k*(1-1/p)

4.        若p1和p2互质,n=p1*p2,则ψ(n)= ψ(p1*p2)= ψ(p1) ψ(p2)

5.        任意一个大于1的正整数都可以写成一系列质数的积

6.        根据定理5,推导欧拉定理:

因为

n = (p1^k1)* (p2^k2)*……(pr^kr)   (p1~pr都是质数)

所以

ψ(n)= ψ((p1^k1)) ψ(p2^k2) ……ψ(pr^kr)   定理4

ψ(n)= (p1^k1)*(1-1/p1) * (p2^k2)(1-1/p2)……(pr^kr)*(1-1/pr)   定理3

ψ(n)= (p1^k1)* (p2^k2)*……(pr^kr) * (1-1/p1) (1-1/p2)…… (1-1/pr)

ψ(n)=n (1-1/p1) (1-1/p2)…… (1-1/pr)

(三)  欧拉定理:

正整数a与n互质,则下式恒成立

a^ψ(n) ≡1(mod n)

即:

a的ψ(n)次幂除以n,余数恒为1

(四)  模反元素

如果两个正整数a和n互质,则必定存在整数b使得a*b-1被n除余数为1

ab ≡1(mod n)

其中b被称为a的模反元素

四、RSA算法详解:假设A和B要通信

(一)  生成密钥

1.        公钥

1)        随机生成两个不相等的质数p和q(质数越大越安全)

2)        计算n,n=p*q 则n的二进制位数就是密钥的长度。

3)        计算n的欧拉函数ψ(n)

因为

n=p*q

所以

ψ(n) =ψ(p)* ψ(q)    定理4

又p和q为质数

所以

ψ(p)=p-1    定理2

ψ(q)=q-1    定理2

所以

ψ(n) = (p-1)(q-1)

4)        获取随机正整数e,e满足  e∈(1, ψ(n))且e与ψ(n)互质(通常选择65537)

将n和e封装成公钥

2.        私钥

1)        计算e对于ψ(n)的模反元素d

e*d=1(modψ(n));

设正整数k, e*d = kψ(n)+1;

则ed-kψ(n)=1

d = (kψ(n)+1) / e;

对于不定方程ax+by=c,设gcd(a,b)=d,如果ax+by=c有解,则d|c----->也就是说如果ed-kψ(n)=1 有解,则gcd(d,-k)能够整除1,而1显然可以被任何整数整除,所以该二元一次方程必定有解(d,k)

(欧几里得定理和扩展欧几里得定理计算二元一次方程)

2)        将n和d封装成私钥

五、RSA算法可靠性论证

从上文可以统计出整个算法涉及到的量有6个,其中三个为由私钥持有者生成,三个是私钥持有者推导出来的

生成量:p,q,e

推导量:n, ψ(n),d

密钥中只有公钥被发布,所有人都可以获取。而公钥由n和e封装起来,因此,如果要破解一份RSA加密过的密文,我们必须使用私钥(私钥由n和d封装而成)

n可以从公钥获取。

(假设mc为明文,c为密文,则公钥由n和e封装则意味着求取密文的运算中,n,e和mc是已知数,只有c是未知数;私钥由n和d封装,同上,解密密文的运算中,n,d和c是已知的,只有mc是未知数。)

因此,破解私钥的关键就是破解e对于ψ(n)的模反元素d。

其数学关系是:  e*d=1(modψ(n));

因此需需要先求出ψ(n),而求出ψ(n)需要知道ψ(p)和ψ(q)(因为ψ(n)= ψ(p* ψ(q))

而p和q只能通过分解n的质因数获得。所以,整个RSA算法都基于n这个大数不能分解质因数这个基础上。

因此,只要n够大,私钥就不会被破解

六、加解密过程:假设明文是m,c是密文

(一)  加密:使用公钥(n,e)

先将其换算成asc码或者unicode等其他数值。且m必须小于n

则加密算法是

m^e=c(mod n)

推出

m^e / n = k ……c这里c就是密文,k我们不关心

(二)  解密:使用私钥(n,d)

1.        简单的说解密就是通过下式求m。(一定可以求解出m)

c^d = m(mod n)

推出
c^d / n = k … … m    m就是明文编码,不关心k

查表得出明文

第二部分:RSA算法签名与验签

假设A要想B发送消息,A会先计算出消息的消息摘要,然后使用自己的私钥加密这段摘要加密,最后将加密后的消息摘要和消息一起发送给B,被加密的消息摘要就是“签名”。

B收到消息后,也会使用和A相同的方法提取消息摘要,然后使用A的公钥解密A发送的来签名,并与自己计算出来的消息摘要进行比较。如果相同则说明消息是A发送给B的,同时,A也无法否认自己发送消息给B的事实。

其中,A用自己的私钥给消息摘要加密成为“签名”;B使用A的公钥解密签名文件的过程,就叫做“验签”。

数字签名的作用是保证数据完整性,机密性和发送方角色的不可抵赖性

下面是对签名和验签过程的简要描述:

l  签名过程:

1.        A计算消息m的消息摘要,记为 h(m)

2.        A使用私钥(n,d)对h(m)加密,生成签名s ,s满足:

s=(h(m))^d mod n;

由于A是用自己的私钥对消息摘要加密,所以只用使用s的公钥才能解密该消息摘要,这样A就不可否认自己发送了该消息给B。

3.        A发送消息和签名(m,s)给B。

l  验签过程:

1.        B计算消息m的消息摘要,记为h(m);

2.        B使用A的公钥(n,e)解密s,得到

H(m) = s^e mod n;

3.        B比较H(m)与h(m),相同则证明

第三部分:总结

下面简单总结加密和解密的完整过程。

l  签名过程:

1.        A提取消息m的消息摘要h(m),并使用自己的私钥对摘要h(m)进行加密,生成签名s

2.        A将签名s和消息m一起,使用B的公钥进行加密,生成密文c,发送给B。

l  验证过程:

1.        B接收到密文c,使用自己的私钥解密c得到明文m和数字签名s

2.        B使用A的公钥解密数字签名s解密得到H(m).

3.        B使用相同的方法提取消息m的消息摘要h(m)

4.        B比较两个消息摘要。相同则验证成功;不同则验证失败。

下面是借鉴一个网友的Demo,加上我自己注释后,打包的一个Demo。

EnAndDe.java

package com.joe.main;import java.io.*;
import java.math.BigInteger;
import java.util.ArrayList;/*** <p>* Company: 建工学院* </p>* * @author 04信息(1)程晟* @modify Joe* @Description Demo说明:*              1、按照加密解密和签名验签的逻辑,编写简单的demo,不涉及java中继承的RSA相关类和Sigesture签名类*              2、只能对数字和字母进行加密, 不涉及编码和解码问题 。 3、不做数字签名和验证了,涉及到提取信息摘要。*/
public class EnAndDe {private long p = 0;private long q = 0;private long n = 0;private long t = 0; // 欧拉函数private long e = 0; // 公匙private long d = 0; // 密匙private String mc; // 明文private long c = 0; // 密文private long word = 0; // 解密后明文// 判断是一个数 x 否为素数素数就是判断在 (2,√x)范围内有没有除1外的因数,如果没有则x数素数public boolean isPrime(long t) {long k = 0;k = (long) Math.sqrt((double) t);for (int i = 2; i <= k; i++) {if ((t % i) == 0) {return false;}}return true;}// 随机产生大素数(1e6数量级,注意,太大了要超出范围)public void bigprimeRandom() {do {p = (long) (Math.random() * 1000000);} while (!this.isPrime(p));do {q = (long) (Math.random() * 1000000);} while (p == q || !this.isPrime(q));}// 输入PQpublic void inputPQ() throws Exception {this.bigprimeRandom();System.out.println("自动生成两个大素数p,q分别为:" + this.p + " " + this.q);this.n = (long) p * q;this.t = (long) (p - 1) * (q - 1);System.out.println("这两个素数的乘积为p*q:" + this.n);System.out.println("所得的t=(p-1)(q-1):" + this.t);}// 求最大公约数public long gcd(long a, long b) {long gcd;if (b == 0)gcd = a;elsegcd = gcd(b, a % b);return gcd;}// 生成公匙public void getPublic_key() throws Exception {do {this.e = (long) (Math.random() * 100000);// e满足 e∈(1, ψ(n))且e与ψ(n)最大公约数为1,即 e与t互质} while ((this.e >= this.t) || (this.gcd(this.t, this.e) != 1));System.out.println("生成的公钥为:" + "(" + this.n + "," + this.e + ")");}// 生成私钥 e*d=1(modψ(n))==> d = (kψ(n)+1) / epublic void getPrivate_key() {long value = 1; // value 是e和d的乘积outer: for (long k = 1;; k++) {value = k * this.t + 1;if ((value % this.e == 0)) {this.d = value / this.e;break outer;}}System.out.println("产生的一个私钥为:" + "(" + this.n + "," + this.d + ")");}// 输入明文public void getText() throws Exception {System.out.println("请输入明文:");BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));mc = stdin.readLine();}// 解密密文public void pascolum() throws Exception {this.getText();System.out.println("输入明文为: " + this.mc);// 加密ArrayList cestr = new ArrayList();for (int i = 0; i < mc.length(); i++) {this.c = this.colum((long) mc.charAt(i), this.n, this.e);cestr.add(c);}System.out.println("加密后所得的密文为:" + cestr);// 解密StringBuffer destr = new StringBuffer();for (int j = 0; j < cestr.size(); j++) {this.word = this.colum(Long.parseLong(cestr.get(j).toString()),this.n, this.d);destr.append((char) word);}System.out.println("解密后所得的明文为:" + destr);}// 加密、解密计算public long colum(long mc, long n, long key) {BigInteger bigy = new BigInteger(String.valueOf(mc));BigInteger bign = new BigInteger(String.valueOf(n));BigInteger bigkey = new BigInteger(String.valueOf(key));return Long.parseLong(bigy.modPow(bigkey, bign).toString());// 备注1}public static void main(String[] args) {try {EnAndDe t = new EnAndDe();t.inputPQ();t.getPublic_key();t.getPrivate_key();t.pascolum();} catch (Exception e) {e.printStackTrace();}}}

备注1:modPow(a,b)是java类BigInteger中的一个方法,返回结果是:调用该方法的对象的a次幂,模b的结果

转载于:https://www.cnblogs.com/pang-blog/p/4092143.html

RSA加密算法原理及RES签名算法简介(转载)相关推荐

  1. RSA加密算法原理及其Java实现

    RSA加密算法原理及其Java实现 RSA加密算法的基本原理 主要步骤 解密过程证明 java实现 简单介绍了RSA加密算法的原理及其Java实现:原文过长时,进行了分段加密. RSA加密算法的基本原 ...

  2. RSA 加密算法原理简述

    概述 本文旨在说明RSA加密算法的原理及实现,而其相关的数学部分的证明则不是本文内容. 版权说明 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Q-WHai 发表日期: ...

  3. 密码学——RSA加密算法原理

    前言:之前在做密码学题的时候了解了一下RSA,但总感觉那时总结的过少,而且也理解的不到位,这次就再来详细的了解一下,并通过做题来巩固一下. 一.对称加密与非对称加密 对称加密: 加密和解密用的是同一密 ...

  4. AES加密算法原理解析

    转自: https://blog.csdn.net/qq_28205153/article/details/55798628 AES简介 高级加密标准(AES,Advanced Encryption ...

  5. RSA加密算法——密码学笔记(四)

    一.数学知识 1. 质数 质数,又称素数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数. 2. 互质数 百度百科上的解释是:公因数只有1的两个数,叫做互质数. 维基百科上的 ...

  6. RSA加密算法加密与解密过程解析

    1.加密算法概述 加密算法根据内容是否可以还原分为可逆加密和非可逆加密. 可逆加密根据其加密解密是否使用的同一个密钥而可以分为对称加密和非对称加密. 所谓对称加密即是指在加密和解密时使用的是同一个密钥 ...

  7. AES加密算法原理分析

    明文:任何人见字符(文)知意:暗文:没有密钥解码则见字符(文)不知意. AES(Advanced Encryption Standard)高级加密标准为常见的对称型加密算法(微信小程序加密传输是用AE ...

  8. RSA算法原理——(2)RSA简介及基础数论知识

    上期为大家介绍了目前常见加密算法,相信阅读过的同学们对目前的加密算法也算是有了一个大概的了解.如果你对这些解密算法概念及特点还不是很清晰的话,昌昌非常推荐大家可以看看HTTPS的加密通信原理,因为HT ...

  9. rsa加密原理数学证明_非对称加密算法——RSA加密原理及数学推导

    说明:原创不易,著作权仅归作者本人所有,转载请注明出处. 建议:建议阅读时间15min+.证明过程可能看着枯燥,需要动手. 一.  RSA是什么? 看到标题的第一瞬间,先想一下,RSA是什么呢?百度百 ...

最新文章

  1. 如何高效快速搞散一个团队?
  2. 导出数据库数据成txt格式
  3. multiple Rational objects
  4. 网络营销外包专员浅析网络营销外包如何防止发布的外链被删除呢?
  5. Oracle中删除数据的一个小技巧
  6. Windows XP硬盘安装Ubuntu 11.10双系统全程图解
  7. java poi 设置公式_poi公式处理
  8. 为什么 Dapper 的批量插入比我预期的要慢很多?
  9. 代码运行错误及解决方法
  10. 如何将原图和json融合_用 base64 进行图片和字符串互转,并保存至 json
  11. 3D打印切片软件支撑算法研究
  12. Halcon实战之车牌识别
  13. DIY的U盘量产CD-ROM做PE启动盘教程(银灿IS903-A4主控+东芝SLC颗粒)
  14. 学了这么久的编程,编程语言创始人你知道几个?
  15. python求15 17 23 65 97的因数_python练习题-答案
  16. 群晖docker给showdoc添加ssl证书
  17. 立体图形3D动画和绘制
  18. 计算机网络(16)数据链路层:数据链路层的功能
  19. 2021年G2电站锅炉司炉最新解析及G2电站锅炉司炉找解析
  20. android添加悬浮窗,在Android中使用WindowManager实现悬浮窗口

热门文章

  1. python ddt mysql_Python数据驱动DDT的应用
  2. Kubernetes 已经成为云原生时代的安卓,这就够了吗?
  3. ArgoCD + KubeVela:以开发者为中心的 GitOps
  4. 如何使用 Istio 进行多集群部署管理:多控制平面
  5. linux运维技巧,Linux运维需要掌握的17个实用技巧
  6. 简书markdown支持html,简书上使用Markdown(超详细)
  7. 学php需要哪些基础,学习php需要什么基础?(附php学习路线图)
  8. php @socket_write,FluffOS 中文站 | socket_write() 函数
  9. webpack搭建php服务器,webpack搭建react开发环境步骤详解
  10. 【杂谈】我在有三AI从学生到老师