网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
(
n
)
\varphi(n)
φ(n)的模反元素d](#5evarphind_37)
- [6、将e、n公开作为公钥进行加密](#6en_47)
- [7、将d,n作为私钥进行解密](#7dn_50)
前言
从古至今,如何用最有效的加密手段保护信息的安全性使之不被窃取、篡改或者破坏都是人们在信息传播中普遍关注的重大问题。最古老的文件加密手段莫过于对称加密,什么是对称加密,打个比方,有一个商人需要给合作伙伴送一批贵重的货物,他便将货物放在一个设置好密码的箱子中,这个密码只有商人知道,同时他又将设置好的密码提前告知合作伙伴,货物送达后,合作伙伴便可以用被告知的密码打开箱子取出货物。即用一种方法加密, 用同一种方法解密, 即为对称加密。对称加密从古至今都是比较广泛使用的一种加密方式,比如在宋朝就将代码法用于军事保密文件的传输,简而言之,比如双方约定某一本书,根据书中的字所在位子,比如“20页第2行第9个字”,破译的时候只要对照好,就能解码。如果不知道双方约定的解码书本,根本无法破解。这种方式现在还管用。比如在谍战片中,情报人员发出的电报,需要用对应的密码本来解译,如何密码本落入到地方手中,后果不堪设想。但是对称加密缺点在于,通过对称加密方法进行加密后,需要告知接收方加密方法才能解密,而将加密方法传输给接受方这一过程中,充满了各种泄密的可能。比如说在战争中,一旦密码本在传输的过程中被敌方截获,那么所有的电报内容都会被地方破解,以至于影响最终战争胜利的走向。所以,对称加密的安全性,最首先取决于加密方式的保密性,其次才是密码破译的难度。 如何能够消除了对称加密中用户交换密钥的需要的同时也能保证其保密性?因此,诞生的非对称加密。非对称加密算法需要两个密钥:公开密钥 (publickey:简称公钥) 和 私有密钥 (privatekey:简称私钥). 公钥与私钥是一 一对应的, 如果用公钥对数据进行加密, 只有用对应的私钥才能解密. 因为加密和解密使用的是两个不同的密钥, 所以这种算法叫作非对称加密算法. 基本过程为:甲方生成一对密钥与公钥, 并将公钥公开, 需要向甲方发送信息的其他角色(乙方, 丙方等) 使用甲方公开的公钥对机密信息进行加密后再发送给甲方. 甲方再用自己私钥对加密后的信息进行解密.甲方想要回复乙方时正好相反, 使用乙方公开的公钥对数据进行加密,同理,乙方使用自己的私钥来进行解密.本文中介绍非对称加密算法中的一种------RSA加密解密算法
一、RSA加密算法是什么?
RSA是1977年由罗纳德·李维斯特(Ron Rivest), 阿迪·萨莫尔(Adi Shamir)和 伦纳德·阿德曼(Leonard Adleman)一起提出的. 当时他们三人都在麻省理工学院工作. RSA就是他们三人姓氏开头字母拼在一起组成的.百度百科
加密过程
1、选择一对不相等且足够大的质数
选择一对不相等且足够大的质数,我们将它描述为p和q。
2、计算p、q的乘积
n=p*q
3、计算n的欧拉函数
φ
(
n
)
=
(
p
−
1
)
∗
(
q
−
1
)
\varphi(n)=(p-1)*(q-1)
φ(n)=(p−1)∗(q−1)
这个公式是如何得到的?那么就要从以下几个概念入手。
互质:如果两个整数的公约数只有1,此时它们叫做互质整数。
欧拉函数:欧拉函数是小于n的正整数中与n互质的数的数目。例如,与6互质且小于6的正整数有两个,分别是1和5,则
φ
(
6
)
=
2
\varphi(6)=2
φ(6)=2。如果n为质数,那么
φ
(
n
)
=
n
−
1
\varphi(n)=n-1
φ(n)=n−1,因为质数在大于1的自然数中,除了1和它本身以外不会再有其他因数的自然数。
此时如果n可以分解成2个互质的整数之积,那么n的欧拉函数等于这两个因子的欧拉函数之积。即若n=p*q,且p、q互质,则
φ
(
n
)
=
φ
(
p
∗
q
)
=
φ
(
p
)
∗
φ
(
q
)
\varphi(n)=\varphi(p*q)=\varphi§*\varphi(q)
φ(n)=φ(p∗q)=φ§∗φ(q)=(p-1)*(q-1)。
证明:p,2p,3p,…,(q−1)∗p有q−1个数整除pq,同理q,2q,3q,…,(p−1)∗q有p−1个数可以整除pq,再加上pq本身能整除pq,那么丢掉这些数剩余的数就与pq互质,一共有pq− (q−1+p−1+1) =(p−1)(q−1) 。
4、选择一个与
φ
(
n
)
\varphi(n)
φ(n)互质的整数e
1<e<
φ
(
n
)
\varphi(n)
φ(n)
5、计算出e对于
φ
(
n
)
\varphi(n)
φ(n)的模反元素d
de mod
φ
(
n
)
\varphi(n)
φ(n) =1
在这里解释下什么是模反元素。
如果两个正整数e和
φ
(
n
)
\varphi(n)
φ(n)互质,那么一定可以找到一个整数d,使得ed-1被
φ
(
n
)
\varphi(n)
φ(n)整除,或者说ed除以
φ
(
n
)
\varphi(n)
φ(n)所得的余数为1,此时,d就叫做e的模反元素。
也就是说在e和φ
(
n
)
\varphi(n)
φ(n)已知的情况下,d只要满足ed-1=k
φ
(
n
)
\varphi(n)
φ(n),k为任意整数,d便是e的模反元素。同时也可得到,e的模反元素d并不是唯一的。
例如,e=3,φ
(
n
)
=
11
\varphi(n)=11
φ(n)=11,则d=4
±
\pm
±k·11。
至此,公钥,私钥便都已经得到。
6、将e、n公开作为公钥进行加密
假设明文为M,密文为C,则加密过程为
M
e
m
o
d
n
=
C
M^e mod n =C
Memodn=C
7、将d,n作为私钥进行解密
C
d
m
o
d
n
=
M
C^d mod n =M
Cdmodn=M
二、RSA算法使用c++语言实现时遇到的问题以及解决方案
1.问题1:模反元素的求解
在第5步中,我们需要计算出e对于
φ
(
n
)
\varphi(n)
φ(n)的模反元素d。
如果使用暴力法求解,那么时间复杂度势必为O(n),这对于一个很大的整数来说,势必需要很长的时间去运行,效率低下,因此需要用一种更快的算法去优化该过程。
解决办法:在第四步中,我们随机产生一个整数e, e的范围是1 < e < φ(n), 并且e与 φ(n) 互质.互质的两个数的最大公约数为1,我们便可以用欧几里得算法去判断是否互质。
欧几里得算法可以用公式表示为gcd(a,b)=gcd(b,a mod b),利用辗转相除的思路。设F(x,y)表示为x,y的最大公约数,取k=x/y,b=x%y,那么x=ky+b,如果一个数能够整除x和y,那么一定可以整除y和b,也就是说,能够整除y和b的数,一定能够整除x和y,所以x和y的公约数和y和b的公约数相同,其最大公约数也相同,则有F(x,y)=F(y,x%y)(x>=y>0),这样就把求两个数的最大公约数转化为求两个更小的数的公约数,直到其中一个数为0,那么另一个数就是两者的最大公约数。
举个例子:
F(42,30)=F(30,12)=F(12,6)=F(6,0)=6
但对于以上过过程,我们如何用代码去实现,我们先从公约数的特点入手。
设x=
k
1
x
1
k_1x_1
k1x1,y=
k
1
y
1
k_1y_1
k1y1,则F(x,y)=
k
1
k_1
k1 F(x1,y1)。
设x=px
1
x_1
x1,(p为素数且y%p!=0)则F(x,y)=F(x1,y)。
现在取p=2。
若x,y均为偶数,则F(x,y)=2F(x/2,y/2)。
若x为偶数,y为奇数则F(x,y)=F(x/2,y)。
若x为奇数,y为偶数则F(x,y)=F(x,y/2)。
若x和y同时为奇数,F(x,y)=F(y,x-y)。(两个奇数相减后必定会出现一个偶数)
这种做法的算法复杂度为O(log2(max(x,y)))。
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int isoushu(long x)
{
if(x%2==0) return 1;
else return 0;
}
int fun(long long a,long long b)
{ if(b>a) return fun(b,a);
else if(a==0)return b;
else
{ if(isoushu(a))
if(isoushu(b))
{
return (fun(a>>1,b>>1)<<1);
}
else return fun(a>>1,b);
else
{ if(isoushu(b))
return fun(a,b>>1);
else return (a-b,b);
}
}
}
main()
{
long long a,b;
cin>>a>>b;
cout<<fun(a,b);
}
问题2:大数的幂运算
- 在计算机计算大数的指数的过程中, 计算的数字不断增大, 非常的占用我们的计算资源
- 我们计算的中间过程数字大的恐怖, 我们现有的计算机是没有办法记录这么长的数据的, 会导致溢出.
解决方案:在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快、计算范围更大的算法,产生了快速幂取模算法
从一个最简单的例子入手:求a^b % c = ?
int ans=1;
for(int i=1;i<=b;i++)
{
ans=ans\*a;
}
本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。
最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。
最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。
![](https://img-blog.csdnimg.cn/img_convert/311903982dea1d8a5d2c98fc271b5b41.jpeg)
### 学习路线图
其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。
相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。
![](https://img-blog.csdnimg.cn/img_convert/1ddfaf7dc5879b1120e31fafa1ad4dc7.jpeg)
#### 网络安全工具箱
当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份**我自己整理的网络安全入门工具以及使用教程和实战。**
![](https://img-blog.csdnimg.cn/img_convert/bcd1787ce996787388468bb227d8f959.jpeg)
#### 项目实战
最后就是项目实战,这里带来的是**SRC资料&HW资料**,毕竟实战是检验真理的唯一标准嘛~
![](https://img-blog.csdnimg.cn/img_convert/35fc46df24091ce3c9a5032a9919b755.jpeg)
#### 面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**