RSA公钥私钥的生成及其加密解密过程详解(公司级别质数,原理一样)

前言:为了大家更好的学习,我尽量采用图文和代码的形式为大家详细而又简单的讲解,与你相遇倍感荣幸,因为成长历程需要你我一起见证,欢迎大家一起讨论

首先:我们进行RSA算法的原理剖析:

总所周知RSA算法,是一种非对称加密算发 之所以为非对称,是因为加密和解密的两把钥匙不同,在这个过程的中,密钥的产生是实现过程中的关键:
公式原路为:
明文+public key=密文:
密文-private kēy=明文

过程实现:

1.生成公私钥      (关键)
2.用公钥对指定编码集的字节流进行加密产生密文;
3.用私钥对密文进行解密得出密文;

引用一个百度百科的一张图片进行步骤解析;

RSA公钥私钥的生成及其加密解密过程详解(公司级别质数,原理一样)_第1张图片

现在开始实现:

第一步 :密钥的生成:分别使用6个步骤实现:

1.随机取两个不相等的质数pq;为了更贴近企业级别;我们取两个大质数:
P:
106697219132480173106064317148705638676529121742557567770857687729397446898790451577487723991083173010242416863238099716044775658681981821407922722052778958942891831033512463262741053961681512908218003840408526915629689432111480588966800949428079015682624591636010678691927285321708935076221951173426894836169
q
106697219132480173106064317148705638676529121742557567770857687729397446898790451577487723991083173010242416863238099716044775658681981821407922722052778958942891831033512463262741053961681512908218003840408526915629689432111480588966800949428079015682624591636010678691927285321708935076221951173426894836169
2.取两个数的乘积
n=15451829866871637157835322285981368257909662702017179618938441893812851839135701007414707361242660160726516425982157617888395496297175564092494360771780789356530407344198651072794547134768749456960016822143151487852505415103282680142588791649018023314678806465404604863356330006297098883982004525047307441769849519455298373632470316136183314905468165805443248580301483600783264377812159448601179288205780106055575592759850520179438931325137509505409000578746718044163844933796688752995186209440200810671836319989244095544524426281446540439152873791764107025517382490712194797558551469166407875602487428429334974134321
3.根据欧拉函数算出φ(n):
φ(n) = φ(pq) = φ(p)φ(q)=15451829866871637157835322285981368257909662702017179618938441893812851839135701007414707361242660160726516425982157617888395496297175564092494360771780789356530407344198651072794547134768749456960016822143151487852505415103282680142588791649018023314678806465404604863356330006297098883982004525047307441769598002811700051151557898146487265141500919930165451354112742084112634421290530304261774352407733921876510894230578725305967639802190000637787751711519541066361896663331753421775366005510927218869208233453121408029247555902127555741567278204463766437571952333558427196578303404535803120800191248101905768922944
4.随机取一个整数,要求1

我们在此区间取一个质数,根据质数性质得知,质数与其他数互质;我们取3889;

5.我们计算对e 的φ(n)模反元素d;
再次我们推荐蒙哥马利算法。我们直接使用即可;无序深究,其作用:超大整数超大次幂然后对超大的整数取模,简单来说对极大数取模反元素;我们得到一个数据为:
d=1156205320457610288745198967657644166379972189839804389074591563666634066646564410685955217825048626066190866536592405966964024022236587593447122392540038493893121248948780525117822889230574978651418075403357439692743398250207060920929117606033490559159560987768768324823011579283223392964454439904542675637683985296529882973798752471233683249209762843835985174607047556306705224118165162905676610067022517682197138138621344578050034245933990790845007906416093198845798901781830868021761765904777531676765131379495584915533823288125255520904108500256867069512326595285549579378834222350197662163243932424184772115345
6.我们对公钥、私钥进行封装

公钥匙为(n,e):

(n,e)=(15451829866871637157835322285981368257909662702017179618938441893812851839135701007414707361242660160726516425982157617888395496297175564092494360771780789356530407344198651072794547134768749456960016822143151487852505415103282680142588791649018023314678806465404604863356330006297098883982004525047307441769849519455298373632470316136183314905468165805443248580301483600783264377812159448601179288205780106055575592759850520179438931325137509505409000578746718044163844933796688752995186209440200810671836319989244095544524426281446540439152873791764107025517382490712194797558551469166407875602487428429334974134321
,
3889)

私钥:(n,d)

(n,d)=(15451829866871637157835322285981368257909662702017179618938441893812851839135701007414707361242660160726516425982157617888395496297175564092494360771780789356530407344198651072794547134768749456960016822143151487852505415103282680142588791649018023314678806465404604863356330006297098883982004525047307441769849519455298373632470316136183314905468165805443248580301483600783264377812159448601179288205780106055575592759850520179438931325137509505409000578746718044163844933796688752995186209440200810671836319989244095544524426281446540439152873791764107025517382490712194797558551469166407875602487428429334974134321
,
1156205320457610288745198967657644166379972189839804389074591563666634066646564410685955217825048626066190866536592405966964024022236587593447122392540038493893121248948780525117822889230574978651418075403357439692743398250207060920929117606033490559159560987768768324823011579283223392964454439904542675637683985296529882973798752471233683249209762843835985174607047556306705224118165162905676610067022517682197138138621344578050034245933990790845007906416093198845798901781830868021761765904777531676765131379495584915533823288125255520904108500256867069512326595285549579378834222350197662163243932424184772115345);

至此我们的密钥生成完毕,密钥自己持有,公钥可以公开:

实现的过程比较简单:我们学会使用欧拉定理便足以:

前提:我发消息(100),你生成了上面的密钥;;我通过下面发消息得到你的公钥,

我:发消息:询问你公钥--------------------------------------》你

我:《-------------------------------------回应消息公钥(n,e)你

我 :
	加密过程(见下面实现过程):······(加密100)生成密文
	
我:发密文------------------------------------------------》你

                     解密过程(下面实现解密过程)--------------你
                     得到原文m=100;

加密实现过程:

我们都知道在通信传输中只能传输0和1,取值过程中:所以m=为数字,m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。如果偏大,可以分段加密:

所谓”加密”,就是使用下面的加密公式算出下式的密文c:

m^e≡c(modn)

	将m,e,n代入进去:m^e≡c(modn)  :求解c ,c即为密文
通过计算机:得到密文 C=7324912566865827911434015470920501076302615692199539281786381421715525131603160713826556628426756079492510782486299478910651164413388719112244016424825225093931404174547028443992396294821300751150733491267481238249218316116275806860692298580461232287755615972921855281529257965891149196310273942412893721292007767794740807061133818257889327160551121056164099705034699305851136664436066788843754640603280628657620094893168217838761283609777708958412830141489818157791432186034643925192802567469785624571871058682290862470479715511663142412326624119526687770657072861595055720228651770941979144965166039113797543318667;

那么我将密文发给你C

加密实现过程:

你拿到我发过来的密文C,就用下面的欧拉定理公式进行解密出明文m:

C^d=m(mod n)

使用自己的私钥,将d,c,n代入求解M,M即为明文

通过计算得到m=100;与原明文一样,则解密成功;

至此密钥的生成,加密解密的过程全部运算完毕RSA算法实现成功;

下期介绍RSA的安全性

另外:博文持续不断更新中,绝对的干货,欢迎大家相互讨论交流

你可能感兴趣的:(算法的世界)