公钥,密钥原理学习(数学之美)

       最近在阅读《数学之美》,在看到信息指纹那一部分的时候被书中提到的公、密钥原理吸引住了。因为平时工作经常用Linux服务器,所以难免会用到SSH和SFTP,对于这两个工具一直只知道其底层数据传输使用的加密技术就是这种非对称加密方式,其大概的工程流程如下:

1. client与sever互联,client发送消息给sever,双方都产生一对用于加密和解密的公钥和私钥。

2. client将自己的公钥告诉sever,私钥保密;同样sever将自己的公钥告诉client,私钥保密。

3. client给sever发送消息的时候,会用sever的公钥加密信息。

4. client将消息发送给sever。

5. sever收到消息后用自己的私钥解密client的消息,因此只有sever拥有自己的私钥所以其他收到消息的人都无法解密该消息。

或许到这我们可以了解其运作方式,但是其如何加密和解密的过程却不是很了解,这里就其工作原理通过示例简单介绍一下。

    先说一下这种设计的意图,它主要是为了防止“敌人”拿到加密前,后的信息和密码本之后就可以彻底的破解通信中所有信息或者下一次通话的信息。下面是其加密和解密的步骤:

Step1:

 所有的字符串都是可以转成相应的ASCII码,单词Caesar就等于X=06707101115097114(每三位代表一个字母),这是明码。

Step2: 

找两个很大的素数(质数)P和Q,越大越好(质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。2017年12月26日,互联网梅森素数大搜索(GIMPS)项目宣布发现第 50 个梅森素数和已知最大的素数:2^77,232,917-1,共有 23,249,425 位)。

计算它们的乘积:

N=P*Q

M=(P-1)*(Q-1)

Step 3:

a) 找到一个和M互素的整数E,就是说M和E除了1以外没有公约数。

b) 找到一个整数D,使得E*D除以M余1,即E*D mod M = 1

这里的E就是公钥,谁都可以用它来加密,D是私钥用于解密,只有自己才有。乘积N是公开的,“敌人”知道也没有关系。

Step 4:

这里对明文X加密,得到加密后的信息Y。Y=(X^E) mod N

Step 5:

在接收到Y后,使用公式 X=(Y^D) mod N

Step 6: 

将X更具ASCII码转换成字符。

这里的优势:

    1. 运算简单,只有乘除。

    2. 可靠,无论给“敌人”多少条明文和对应的密文,也无法根据已知的明文和密文的对应来破译下一份消息。公钥E和N是可以空开给所有人的。破解的最好办法对大数N进行因式分解,即通过N反过来找到P和Q。目前只要保证50年内计算机破不了就可以满意了。前几年的RSA-158密码就是被因式分解的。

    3. 灵活,可以产生不同的公私钥组合给不同的使用者。


猜你喜欢

转载自blog.csdn.net/maizi1045/article/details/80609659