05-密码学(1)

2021-04-18  本文已影响0人  深圳_你要的昵称

前言

本篇开始,将给大家介绍密码学相关的知识点,这也是为后面学习安全攻防前做的准备,只有了解清楚了加密算法,你才能知道如何去防止破解,是吧!本篇文章首先会大致介绍密码学的发展史,接着会重点介绍RSA加密算法,包括这个算法推算过程

一、密码学

什么是密码学?

密码学是指研究信息加密破解密码的技术科学。

密码学的起源可追溯到2000年前,而当今的密码学则是以数学为基础的。

发展历史

相传古罗马名将凯撒大帝为了防止敌方截获情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应表👇

上图就好比一个密码本,如果不知道密码本,即使截获一段信息也看不懂。所以,密码本存在两个问题👇

  1. 密码本泄漏
  2. 如果截取足够多的密文可以看字母出现的频率,也可以破解,这就是所谓的暴力破解

凯撒大帝时代上世纪70年代这段很长的时间里,密码学的发展非常的缓慢,因为设计者基本上靠经验,没有运用数学原理。当今的密码学是以数学为基础的👇

二、RSA

上世纪70年代产生的一种加密算法。其加密方式比较特殊,需要两个密钥:公开密钥简称公钥(publickey)私有密钥 简称私钥(privatekey)公钥加密,私钥解密;私钥加密,公钥解密。这个加密算法就是伟大的RSA

2.1 RSA数学原理

2.1.1离散对数问题

为什么要提到离散对数这个概念呢?这个和加解密有什么关系?带着这样的问题,我们一步步来看,最理想的加解密情况应该是这样的 👉 加密简单,解密很难。怎样才能做到这点呢,首先我们来看看mod运算👇

mod运算就是求2个数xy余数

例如:如果用质数17做模数(17就好比y),x3的幂数,并且它们的余数是12,求x到底是3的几次方?👇

接着我们按顺序尝试写出来👇

最终求得是13次方。根据上图,我们可以发现一个规律👇

3的n次方mod17结果永远在1~16之间,就好比一个时钟👇

所以mod运算也称作时钟算法

这里的3称作是17的原根,这里的结果是12,反推n的话,需要我们一条条的计算出来,根据穷举求n。假如模数变大,那么反推破解难度也会变的很大,这个就是离散对数问题

2.1.2欧拉函数

欧拉函数概念👇

任意给定正整数n,在<= n的正整数之中,有多少个n构成互质关系

互质关系 👇

如果两个正整数,除了1以外,没有其他公因数,就称这两个数是互质关系coprime)。

计算多少个这个值的方式就叫做欧拉函数,使用φ(n)(φ发音同fai三声)表示。例如👇

欧拉函数特点

1.当n是质数的时候φ(n)=n-1。

  1. 如果n可以分解成两个互质的整数,如n=A*B则👇
    φ(A*B)=φ(A)* φ(B)

根据以上两点得到:

如果N是两个互质数P1和 P2的乘积,则 👉 φ(N)=φ(P1)* φ(P2)=(P1-1)*(P2-1)

欧拉定理

如果两个正整数m和n互质,那么m的φ(n)次方减去1,可以被n整除。

欧拉定理
费马小定理

欧拉定理的特殊情况 👉 如果两个正整数m和n互质,而且n为质数!那么φ(n)结果就是n-1。

验证:m = 6,n = 5(5是质数) --> 6^4%5 --> 24*24%5 -->24*24的结果看个位数是66%5 = 1

公式转换

接着我们公式转换👇

  1. 欧拉定理 👉 mφ(n) % n ≡ 1 (m和n互质) ,并且 1k % n ≡ 1,我们在mφ(n) % n ≡ 1 两边各乘以1k👇
  1. 我们又知道1*m ≡ m,两边各乘以m,那么👇

⚠️注意:这种情况必须满足2个条件

  1. m和n互质
  2. m < n
模反元素

如果两个正整数 ex 互质,那么一定可以找到整数d,使得 ed-1 被x整除。此时,d就是e对于x模反元素。公式如下👇

假设商为k则可以得到以下公式👇

φ(n) == x 时,那么 e * d = k * φ(n) + 1k * φ(n) + 1熟悉不?👇

是不是就等价于👇

验证:m:4 , n:15, φ(15) = 8
通过模反元素,假设 e:3, d是多少?
8k + 1 = 3d --> d = (8k + 1)/3 --> k = 4 时 d = 11,k=7 时d = 19。

小结

整个推导过程如下图👇

2.1.3 迪菲赫尔曼密钥交换

上图是结合之前的例子,将数据的传递过程展示出来,基本分为以下几步👇

  1. 服务端随机数15(保密,不告诉任何人),315%17得到的结果(6)发送给客户端。中间三方可能截获6
  2. 客户端取随机数13(保密,不告诉任何人),313%17得到12发送给服务端。中间三方可能截获12
  3. 客户端拿到服务端发送的6进行613%17得到数据10
  4. 服务端拿到客户端发送的12进行1215%17也能得到10

在这个过程中客户端服务端得到了相同的值10,单中间第三方截获的是612,这就是 迪菲赫尔曼密钥交换。客户端和服务端实际想交换的是数据10

整个过程的原理如下图👇

找到了3和17原根,这个时候就相当于进行了拆分

2.1.4 RSA

RSA诞生

通过迪菲赫尔曼密钥交换拆分了me*d % n ≡ m,如下图👇

说明

  1. n 会非常大,长度一般为1024个二进制位。(目前人类已经分解的最大整数,232个十进制位,768个二进制位)
  2. 由于需要求出φ(n),所以根据欧拉函数特点,最简单的方式n由两个质数相乘得到 👉 质数p1、p2 👉 Φ(n) = (p1 -1) * (p2 - 1)
  3. 最终由φ(n)得到 e 和 d。

总共生成6个数字:p1、p2、n、φ(n)、e、d

关于RSA的安全

除了公钥用到了ne, 其余的4个数字不公开的。

目前破解RSA得到d的方式如下:

  1. 要想求出私钥 d 。由于e*d = φ(n)*k + 1,那么必须要知道eφ(n)
  2. e是知道的,但是要得到 φ(n),必须知道p1p2
  3. 由于 n=p1*p2。只有将n因数分解才能算出。

这个时候就需要穷举了,很难破解。

2.2 RSA终端命令

由于Mac系统内置OpenSSL(开源加密库),我们可以直接在终端上使用命令进行RSA操作。OpenSSLRSA算法常用指令主要有三个👇

示例

openssl genrsa -out private.pem 1024

openssl rsa -in private.pem -pubout -out public.pem

openssl rsa -in private.pem -pubout -text -out private.txt

打开 private.txt查看👇

加密:openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
解密:openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt

上图中指令的过程👇

  1. vi message.txt 新建message.txt文件,点击按键 i进入插入模式,输入密码:LGPerson,再点击Esc按键退出编辑模式,再输入":wq"保存退出
  2. cat message.txt查看message.txt文件内容,确认密码:LGPerson写进去了
  3. 使用公钥 public.pem 进行加密,生成加密文件enc.txt
  4. 查看加密文件enc.txt
  5. 使用私钥private.pem解密,生成解密文件dec.txt
  6. 查看解密文件dec.txt

再看看文件enc.txt和文件dec.txt的大小👇

enc.txt文件128字节dec.txt文件16字节

签名:openssl rsautl -sign -in message.txt -inkey private.pem -out sign.txt
验证:openssl rsautl -verify -in sign.txt -inkey public.pem -pubin -out verify.txt

以上生成的所有文件的目录👇

总结

上一篇 下一篇

猜你喜欢

热点阅读