1、密钥的计算获取过程

密钥的计算过程为:首先选择两个质数p和q,令n=p*q。

令k=ϕ(n)=(p−1)(q−1),原理见2的分析

选择任意整数d,保证其与k互质

取整数e,使得[de]k=[1]k。也就是说de=kt+1,t为某一整数。

2、RSA加密算法原理解析

下面分析其内在的数学原理,说到RSA加密算法就不得不说到欧拉定理。

    欧拉定理(Euler’s theorem)是欧拉在证明费马小定理的过程中,发现的一个适用性更广的定理。
    首先定义一个函数,叫做欧拉Phi函数,即ϕ(n),其中,n是一个正整数。
    ϕ(n)=总数(从1到n−1,与n互质整数)
    比如5,那么1,2,3,4,都与5互质。与5互质的数有4个。ϕ(5)=4
    再比如6,与1,5互质,与2,3,4并不互质。因此,ϕ(6)=2
    对于一个质数p来说,它和1, 2, 3, …, p – 1都互质,所以ϕ(p)=p−1。比如ϕ(7)=6,ϕ(11)=10

欧拉定理叙述如下:

欧拉定理:如果n是一个正整数,a是任意一个非0整数,且n和a互质。那么,a^ϕ(n)−1可以被n整除。

推论1:如果m和n是互质的正整数。那么,ϕ(mn)=ϕ(m)ϕ(n)

推论2:[ab]n=[[a]n[b]n]n

证明:假设a和b除以n的余数为c1,c2。a和b可以写成a=nt1+c1,b=nt2+c2。那么,ab=n2t1t2+nt1c2+nt2c1+c1c2。因此ab除以n的余数为c1c2。即[ab]n=[a]n[b]n。

有以上定理后,由此可以推导出RSA算法的内在原理。

根据欧拉定理,对于任意z,如果z与n互质,那么:

[z^ϕ(n)]n=[z^k]n=[1]n

因此,

[z^(de)]n=[z^(kt+1)]n=[z^(kt)*z]n=[z^kt]n*[z]n= [z]n 因为[z^k]n = [1]n

上面主要使用了de=kt+1以及推论2。也就是说:

[z^(de)]n=[z]n

根据2的推论,有

([z^e]n)^d=[z]n

即d个余数相乘,因为其乘积可能大于n,所以由[ab]n=[[a]n[b]n]n,例如令a和b都为5,n为3,可知该结论

故上式可描述为[([z^e]n)^d]n=[z]n=z,就是原数字乘方求余数,然后再乘方求余数后得到原来数字的过程,得证。

公开的加密方式,私有的解密方式。RSA安全的关键在于很难对一个大的整数进行因子分解。

3、练习习题

按照RSA算法,若选两个奇数p=5,q=3,公钥e=7,则私钥d为:()

答案解析:

按RSA算法求公钥和密钥:
(1)选两质数p=5,q=3;
(2)计算n=p×q=5×3=15;
(3)计算(p-1)×(q-1)=8;
(4)公钥e=7,则依据ed=1 mod(p-1)×(q-1),即7d=1 mod 8。

结合四个选项,得到d=7,即49 mod 8=1。

4、Python代码实现

p =5
q = 3
e = 7
n = q*p
mod_value = (p-1)*(q-1)
# 依据 ed = 1 mod (p-1)*(q-1)
# d 现在是我们需要确定的密钥,那么逆推就是 e*d % ((p-1)*(q-1)) == 1,那么就输出d的值,因为它就是我们需要求得的密钥值
for d in range(0,n):
    if (e*d)%mod_value==1:
        print d

result >> 7

【密码学】RSA算法过程-求解密钥的更多相关文章

  1. 加密解密(6)RSA算法过程图解

    转自: http://blog.csdn.net/21aspnet/article/details/7249401 RSA算法 RSA公钥加密算法是1977年由Ron Rivest.Adi Shami ...

  2. 安全体系(二)——RSA算法详解

    本文主要讲述RSA算法使用的基本数学知识.秘钥的计算过程以及加密和解密的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 1.概述 ...

  3. 写给开发人员的实用密码学(七)—— 非对称密钥加密算法 RSA/ECC

    本文部分内容翻译自 Practical-Cryptography-for-Developers-Book,笔者补充了密码学历史以及 openssl 命令示例,并重写了 RSA/ECC 算法原理.代码示 ...

  4. RSA算法原理——(3)RSA加解密过程及公式论证

    上期(RSA简介及基础数论知识)为大家介绍了:互质.欧拉函数.欧拉定理.模反元素 这四个数论的知识点,而这四个知识点是理解RSA加密算法的基石,忘了的同学可以快速的回顾一遍. 一.目前常见加密算法简介 ...

  5. <密码学入门>关于RSA算法的加密解密及代码实现

    RSA算法 是一种公钥加密算法,RSA算法相比别的算法思路非常清晰,但是想要破解的难度非常大.RSA算法基于一个非常简单的数论事实:两个素数相乘得到一个大数很容易,但是由一个大数分解为两个素数相乘却非 ...

  6. 【密码学】RSA算法原理

    RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密. RSA的算法涉及三个参数,n.e1.e2. 其中,n是两个大质数p.q的积,n的二进制 ...

  7. 跨越千年的RSA算法

    转载自http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...

  8. RSA 算法

    RSA 算法  from http://www.matrix67.com/blog/archives/5100 所有工作都准备就绪,下面我们可以开始描述 RSA 算法了. 首先,找两个质数,比如说 1 ...

  9. [转载]RSA算法详解

    原文:http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...

随机推荐

  1. PAT 甲级 1106 Lowest Price in Supply Chain

    https://pintia.cn/problem-sets/994805342720868352/problems/994805362341822464 A supply chain is a ne ...

  2. Docker(二十六)-Docker Compose编排容器

    1. 前言 Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器. 使用Compose 基本上分为三步: Dockerfile 定义应用 ...

  3. 用宏实现C/C++从非零整数开始的数组

    相信大家在刚学习C/C++时,都会对数组下标从0开始编号有疑惑.尽管我是喜欢从0开始编号的“0党”,但是也有很多的人是喜欢从1开始编号. 意识到C/C++数组与指针具有一定的相似性后,我开始构思如何仿 ...

  4. Treasure Exploration POJ - 2594(最小边覆盖)

    因为是路  所以 如果 1——3  2——3    3——4   3——5 则 1——4  1——5  2——4   2——5 都是是合法的 又因为机器人是可以相遇的  所以 我们把所有的点 分别放在 ...

  5. Firefox download 乱码问题。

    import javax.mail.internet.MimeUtility; fileName = MimeUtility.encodeWord ( fileName ); response.add ...

  6. 【刷题】BZOJ 4946 [Noi2017]蔬菜

    Description http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf Solution 网上大部分都是并查集写法,但是有大神写了非并查集写 ...

  7. Kakfa的设计思想

    Kafka Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实 ...

  8. 【BZOJ1053】[HAOI2007]反素数(搜索)

    [BZOJ1053][HAOI2007]反素数(搜索) 题面 BZOJ 洛谷 题解 大力猜一下用不了几个质因子,那么随便爆搜一下就好了. #include<iostream> #inclu ...

  9. BZOJ 2440 [中山市选2011]完全平方数 | 莫比乌斯函数

    BZOJ 2440 [中山市选2011]完全平方数 | 莫比乌斯函数 题面 找出第k个不是平方数的倍数的数(1不是平方数, \(k \le 10^9\)). 题解 首先二分答案,问题就转化成了求\([ ...

  10. 获取C++类成员虚函数地址

    1.GCC平台 GCC平台获取C++成员虚函数地址可使用如下方法[1]: class Base{ int i; public: virtual void f1(){ cout<<" ...