2019计算机安全学鄙记

根据SCNU斌头老师课件及《密码编码学与网络安全——原理与实践(第七版)》整理
整理者:0.H.P

零、基本概念

0.1 三大目标(C.I.A)

  1. 机密性/Comfidentiality(防止数据泄露)
    数据机密:信息不能被非授权者泄露
    隐私性:确保个人信息哪些可以被怎样操作,向哪些人公开
  2. 完整性/Integrity(防止数据被篡改)
    数据完整:信息、程序能被特定授权改动
    系统完整:系统以预定功能执行,避免被非授权者操作
  3. 可用性/Availability(确保资源可用)
    确保系统能够工作,不能拒绝授权者

0.2 两个概念

  1. 认证性/Authenticity:一个实体具备可被验证可被信任的特征;于信息接收方而言:接受的信息及来源是正确的。
  2. 可追溯性/Accountability:实体的行为可以被唯一追踪。

0.3 OSI安全框架

目的:评价一个机构的安全需求,对不同安全产品进行选择评价,管理员制定某种系统方法以定义需求和满足的措施,且有以下概念。

  1. 安全攻击:危害信息系统安全的行为
    被动攻击:对传输进行窃听和检测
    主动攻击:对数据流进行篡改或伪造数据流
  2. 安全服务:加强数据处理系统和传输安全性服务,有:认证(包括对等实体认证,如TCP连接传输;数据源认证,如UDP传输)、访问控制、数据保密、数据完整、不可否认(防止发送或接收方否认自己的通信行为)、可用性。其目的是用安全机制进行反攻击。
  3. 安全机制:检测、阻止攻击;恢复被攻击的系统为正常状态的过程或实现设备。(机制提供服务)

0.4 攻击surfaces与攻击树

攻击surfaces实例:
开放端口、接口、服务、工程师、雇员等.
分类:软件、网络、人
攻击树:
根:攻击目标
分支结点:方法,或者子目标
叶子结点:攻击初始化

0.5 网络安全模型

model0.png

保证安全的方法包括以下几点:

  • 被发送的信息的相关交换;如将信息加密
  • 发送与接收双方共享秘密信息;如密钥,加密算法等
  • 可靠的第三方,用于分配秘密信息,仲裁等。可选。

设计安全服务}包含以下四点:

  • 算法:执行安全传输的相关算法
  • 算法产生的秘密信息
  • 秘密信息的共享方式
  • 指明协议,利用算法以及秘密信息实现安全服务

0.6 密码学基本概念

两个定义:
1.密码编码学
2.密码分析学
方法:(攻击强度依次递增)

  • 唯密文攻击:用已知密文恢复出明文或者密钥
  • 已知明文攻击:从已知密文和部分明文-密文对中分析明文
  • 选择明文攻击:从任意明文-密文对中攻击
  • 选择密文攻击:从不同的密文,恢复对应解密的明文(用于公钥体制)
  • 穷举法

0.6.1 密码系统

crymodel.png

密码系统公式表示:
加密:E(M,K)=C
解密:D(C,K)=M
且有:D(E(M,K),K)=M
秘钥空间:秘钥K的取值范围,且所有算法的安全性都基于密钥安全性,而非算法细节。

0.6.2 密码体制分类

  • 单钥体制(对称算法):发送方与接收方的密钥相同

    sm0.png

    加密方式:流密码(明文按位加密);对称密码(明文按分组加密)

  • 双钥体制(公钥算法):发送方与接收方的密钥不同


    sm1.png

用于加密
加密:E(M,public key)=C
解密:D(C,private key)=M
且有:D(E(M,public key),private key)=M

用于认证:M=E(D(M,private key),public key)

0.6.3 古典密码

两大构造模块:
1.代换/substitution:明文被其他字符代替\rightarrow 混淆
2.置换/Permutation:明文序列改变\rightarrow 扩散
3.乘积密码(为现代密码学打下基础):迭代使用代换和置换构造算法,即是S \times P的网络,简称SPN

一、数论

1.1 数论基础

屠龙宝刀,号令天下

1.2 伽瓦罗域

(1) 元素集合:F = \{0,1 \}^8,即 [0,256)
(2) 元素表示形式:
f(x)=a_{n-1}x^{n-1}+a_{n-2}x^{n-2}+...+a_1x+a_0=\sum_{i=0}^{n-1}a_ix^i
其中:a=0,1
(3) 加法操作:异或运算(XOR),且(F,+)成群
(4) 减法操作:与加法相同
(5) 乘法操作:位移和异或,且(F^*,\times)成群

  • A\times 2
    A左移一位:当最高位为0时,结束;当最高位为1时,结果异或283(十进制),其中:283表示为x^8+x^4+x^3+x+1,称不可约多项式。也可以用其他,不一定是283.
  • A \times B(B \neq 2)
    将B分解为若干个2的组合

(6) 除法
多项式除法,无借位操作。(跟CRC校验码的计算相同)

#multilpy in GF(2^8)
def mul(a,b):
    r=0
    while b:
        if b%2:
            r=r^a #add operation : XOR
        b=b>>1
        if a&int('10000000',2)==0: #first bit's value = 0
            a=a<<1
        else: #first bit's value = 1
            a=a<<1
            a=a^283
    return r
#compute the max index number which < 2^count
#return count, from 0
def highest_bit(n):
    count = 0
    while n:
        count+=1
        n=n>>1
    return count-1
#division about polymerization
#return quotient and remainder
def div(a,b):
    if a==b:
        return 1,0
    if a<b:
        return 0,a
    a_bit = highest_bit(a)
    b_bit = highest_bit(b)
    result = 0
    while not a_bit<b_bit:
        move=a_bit-b_bit
        temp=b<<move
        result=result+(1<<move)
        a=a^temp
        a_bit=highest_bit(a)
    return result,a

二、对称加密

2.1 AES算法

AES算法:一种采用对称密钥对数据分组进行加密和解密的算法。
参数:数据分组:每组128bits;密钥:128、192、256bits。

基本结构如下(以128bits密钥为例):

AES.png

简单描述:便是数据分组首先经过与密钥计算,后经过十轮加密,每一轮的密钥也都不同,最后输出数据。
每一轮的加密经过以下几个过程:(第十轮只执行前三步)
(1) 字节代换(SubBytes):用一个S盒代换每一字节的值。
(2) 行位移(ShiftRows):置换过程
(3) 列混淆(MixColums):利用GF(2^8)的算数特性进行代换
(4) 轮密钥加(AddRoundKey):分组与密钥XOR运算

2.1.1 字节代换 (SubBytes)

该步骤,用一个 S 盒 (16*16 的矩阵), 将分组的每一个字节进行替换。替换 时,将每字节的值分为高四位与低四位,然后对应于 S 盒的索引进行替换。(解密 时,用逆 S 盒即可)。例如:输入 95,返回 2A。


SBOX.png

S盒的构造方法:
(1) 按字节升序初始化 S 盒。第一行是 00,01...0F... 第十六行是 F0...FF。
(2) 将每个字节求在 GF(28) 中的逆元。
(3) 每一字节进行如下运算。
\begin{bmatrix} b_0'\\ b_1'\\ b_2'\\ b_3'\\ b_4'\\ b_5'\\ b_6'\\ b_7'\\ \end{bmatrix} = \begin{bmatrix} 1&0&0&0&1&1&1&1\\ 1&1&0&0&0&1&1&1\\ 1&1&1&0&0&0&1&1\\ 1&1&1&1&0&0&0&1\\ 1&1&1&1&1&0&0&0\\ 0&1&1&1&1&1&0&0\\ 0&0&1&1&1&1&1&0\\ 0&0&0&1&1&1&1&1\\ \end{bmatrix} \begin{bmatrix} b_0\\ b_1\\ b_2\\ b_3\\ b_4\\ b_5\\ b_6\\ b_7\\ \end{bmatrix} + \begin{bmatrix} 1\\ 1\\ 0\\ 0\\ 0\\ 1\\ 1\\ 0\\ \end{bmatrix}

2.1.2 行位移(ShiftRows)

将16个字节编排成4*4矩阵,第一行按字节单位左移0位;第二行左移1字节;第三行左移2字节;第四行左移3字节。
例如:


ShiftRows.png

2.1.3 列混淆 (MixColums)

将上述计算后的矩阵再乘以一下矩阵。即按一下计算方式计算

Mix.png

2.1.4 轮密钥加(AddRoundKey)

将128bits数据与每一轮的密钥异或运算,得到新的数据值。
以下是扩展每一轮的密钥算法。

AESKey.png

此图中k_0-k_{15}是初始密钥128bits,按以下三个步骤进行拓展,最后输出44个32bits的拓展密钥,每一轮用128bits,供十轮之用。
w_0-w_3的构成是将k_0-k_{15}矩阵按列拼接而得,k_i是8bits数据,拼接后w_i是32bits数据。构造扩展密钥时,
主要用以下g函数进行扩展,g函数包括以下几步
(1) 将每一个字中的四个字节左移一个字节
(2) 用S盒进行字节代换
(3) 用轮常量异或运算
AESRound.png

2.2 工作模式

  1. 电码本模式/ECB:直接将分组与同一密钥加密
  2. 密文分组连接模式/CBC:将分组与上一分组异或后再加密,K仍然相同
  3. 密文反馈模式/CFB:将明文分为每组s位。首先用一初始值,用K加密后,得到b位数据,
    然后取前面s位,与明文异或得到密文,且作为下一分组的初值传入。传入后,将s位的数据左
    移b-s位得到b位数据参数。以此循环。每次K相同
  4. 输出反馈模式/OFB:用一个初值与K加密,然后与分组异或,并且作为下一分组加密值的参数传入
  5. 计数器模式/CTR:用一个随机数,与密钥加密再与分组异或,然后将随机值+1用于下一分组的计算

三、非对称加密

3.1 RSA

算法步骤

  1. 选择两个素数p和q
  2. 计算n=p*q
  3. 计算\phi(n)=\phi(p)*\phi(q)
  4. 选择e与\phi(n)互素且小于\phi(n)
  5. 计算e模\phi(n)的乘法逆元d
  6. 得到公钥(e,n),私钥(d,n)

加密时:C=M^e\ mod\ n
解密时:M=C^d\ mod\ n

3.2 攻击RSA

大致攻击角度:暴力穷举,计时攻击,数学攻击(分解p和q)
数学攻击的三个角度:
(1) 分解n得到p,q,求\phi(n),进而求私钥
(2) 直接确定\phi(n),求私钥
(3) 直接确定私钥

有以下攻击方法:

  1. 大整数分解(见第二章:数论)
  2. 利用素数生成的不合理性:即假若p和q过于接近,直接对n开根号,然后遍历试探。
  3. 共模攻击:条件:已知两组或以上密文采用相同的模数n进行秘钥生成,且公钥gcd(e_1,e_2)=1
    共模攻击原理:例如已知密文C_1,C_2
    gcd(e_1,e_2)=1以及拓展欧几里得公式可得:
    存在s_1,s_2使得e_1*s_1 + e_2*s2 = 1
    由于C_1 = m^{e_1}\ mod\ n C_2 = m^{e_2}\ mod\ n
    所以(C_1^{s_1}*C_2^{s_2})\ mod\ n=((m^{e_1}\ mod\ n)^{s_1}*m^{e_2}\ mod\ n)^{s_2}) (C_1^{s_1}*C_2^{s_2})\ mod\ n=(m^{e_1*s_1 + e_2*s2})\ mod\ n (C_1^{s_1}*C_2^{s_2}) = m
  4. 利用e和d选取的不合理性(太小)分解n
  5. 选择密文攻击:该方法不用分解参数,利用用户可签名的功能,得知传输的明文攻击方得知密文C,篡改信息为c=2^eC,然后发给解密方。解密方利用私钥对攻击方的信息解密得D=c^d=2^{ed}m^{ed}=2m传给攻击者,攻击者得到2m,除以2得到明文。

3.3 Diffie-Hellmam密钥交换

[图片上传中...(DH.png-29f7e2-1627718453801-0)]
场景:用户A和B要交换密钥
算法步骤:

1.选定公开参数:一个素数p及其本原根\alpha

  1. 用户A选择临时密钥X_A,计算公开值Y_A=\alpha^{X_A}\ mod\ p
  2. 用户B选择临时密钥X_A,计算公开值Y_B=\alpha^{X_B}\ mod\ p
  3. 接着用户A计算密钥K=Y_B^{X_A}\ mod\ p
  4. 用户B计算密钥K=Y_A^{X_B}\ mod\ p

密钥交换协议
该协议利用Diffie-Hellman算法,当然,在通信前通信双方应知模数p以及其本原根,方法之一是用户A选择这两个参数,并将其放在首次通信的信息中,大致算法如图。

DH.png

中间人攻击
中间人攻击,就是在通信双方A和B中间截获信息的攻击,过程如下

  1. 攻击方C生成自己的X_{CA}X_{CB}
  2. A将Y_A发给B,C截获,给B发送Y_{CA},自己计算K_B=Y_A^{X_{CB}}\ mod\ p
  3. B接收Y_{CA},计算K=Y_{CA}^{X_B}\ mod\ p,发给A是Y_B
  4. C截获,计算K_A=Y_B^{X_{CA}}\ mod\ p,并计算Y_{CA}发给A

3.4 ElGamal密码体系

与DH类似,利用离散对数的加密机制,算法步骤如下

  1. 选定素数p以及其本原根\alpha
  2. 用户A有私钥X_A,以p和\alpha,生成公钥(\alpha,p,Y_A),其中Y_A=\alpha^{X_a}\ mod\ p
  3. 用户B利用以上参数对信息加密,选定随机数k,计算K=Y_A^k\ mod\ p,C_1=\alpha^k\ mod\ p,C_2=MK\ mod\ p并传输密文对(C_1,C_2)
  4. 用户利用A得到密文对,恢复成明文:K=C_1^{X_A}\ mod\ p,M=C_2K^{-1}\ mod\ p

3.5 椭圆曲线密码学/ECC

3.5.1 基本概念

方程:y^3=x^2+ax+b
为使该方程有意义,需要判别式:2^2a^3+3^3b^2=4a^3+27b^2 \neq 0.
以此为基础定义一个群,代数集为E(a,b)(所有元素皆为\textbf{点集}),操作为加法。
该判别式保证了任意直线与该椭圆相交,都有三个根(包含三个不同的根和二重根的情况);
除此之外,椭圆曲线还定义了一个无穷远点/零点O(x,0)。(此点为单位元)

3.5.2 群定义

单位元:O;有-O=O,P+O=P
逆元:定义P(x,y),那么P的逆元为-P(x,-y).有P-P=O(x,0)\
加法的几何描述:
R=P+Q表示为有一条直线相交于该椭圆曲线,有椭圆曲线最高次数是x^3以及判别式得,必有三个交点;
且只有三个不同交点或有二重根两种情况。
该直线交过P和Q,那么必然与椭圆曲线有第三个交点,此交点便是-R.

ECC.png

3.5.3 Z_p上的椭圆曲线

p是素数,群操作是模p加法,该群表示为E_{p}(a,b);
加法操作:假若计算R=P+Q,公式如下
x_R=\Delta^2-x_P-x_Q\ mod\ p y_R=\Delta(x_P-x_R)-y_P\ mod\ p
\Delta是直线斜率

  • 假若P=Q;
    此时R=P+P=2P,即直线与P点相切,有二重根,用偏导数求斜率y^2=x^3+x+1求偏导2ydy=3x^2dx+dx
    \frac{dy}{dx}=\frac{3x^2+1}{2y}\Delta=\frac{3x_P^2+1}{2y_P}\ mod\ p
  • 假若P\neq Q
    \frac{dy}{dx}=\frac{y_P-y_Q}{x_P-x_Q}\Delta=\frac{y_P-y_Q}{x_P-x_Q}\ mod\ p
    乘法操作:乘法定义为重复加法

3.5.4 ECCDH

思路与Diffie-Hellmam相同;只是换成在E_p(a,b)上的操作。用户A产生一个私钥X_A,并计算公钥x_A*G,G是群上的一点(类似于DH中的g^{x_A})
传给用户B,用户B产生私钥X_B,计算公钥x_B*G(类似于DH中的g^{x_B})传给A,自己计算x_B*x_A*G作为密钥
A收到B传来的x_B*G,计算x_A*x_B*G作为密钥。

ECCDH.png

四、HASH函数

4.1 基本概念

HASH函数:输入变长数据,输出固定位数数据的一种算法。使用压缩函数进行迭代,压缩函数。
分为两类:HASH专用以及对称分组密码算法,其目的是产生数字指纹。
碰撞攻击:不同的信息输入,产生相同的HASH值;即消息A\neq B,H(A)=H(B)

单向性:用A计算HASH(A)可行,用HASH(A)计算A计算上不可行
弱抗碰撞性:寻求任意A'\neq A,使得H(A')=H(A)计算上不可行。
强抗碰撞性:寻求任意(A,A')对,使得H(A)=H(A')计算上不可行。
理解强与弱:在此强与弱是指要求,即弱抗碰撞是指希望不容易发生的事情不发生,
所以实现此是容易的,称为弱抗碰撞;而强抗碰撞是指希望容易发生的事情不发生,所以实现此是
困难的,是强需求的,称为强抗碰撞。
应用:

1.消息认证:使用带密钥的Hash函数(消息认证码/MAC)实现,MAC函数将密钥与消息作为数据块输入,然后产生哈希值附于消息后面,传送给另一方;接收方利用共享的密钥进行相同操作,验证生成的哈希值与传来的是否一致。是则代表消息是完整的。
2.数字签名:基于非对称密码学,需要被认证的一方用自己的私钥对信息的哈希值加密,认证的一方用公钥解密后得到哈希值,与消息生成的哈希值对比,看是否相等,若是,则证明该签名有效。

4.2 SHA-3

倚天不出,谁与争锋

4.3 消息认证码/MAC

认证是用来防止主动攻击,针对开放系统设计的。消息认证是用来验证信息完整性,而消息认证码是用来验
证发送方非冒犯者。目的是实体认证和报文认证。
其算法是输入可变长度的消息以及密钥,输出固定长度的认证码。
构造方法一:Hash函数以某种方式与密钥捆绑
构造方法二:使用对称分组密码,将可变长度的输入,变成固定长度的输入。

4.3.1 基于哈希函数的MAC/HMAC

基本思想:输入密钥和信息,输出固定长度nbits认证码。
整体框架:HMAC(K,M)=H(K^+XOR\ opad||H(K^+XOR\ ipad||M))
算法步骤:
假定消息分组长度为b,若秘钥长度l,输出哈希长度为n.

  1. 若密钥长度大于b,哈希至n位;填充0至b位,得到K^+
  2. K^+与00110110*(b/8)异或
  3. 将消息接在K^+后面
  4. 哈希得到n为哈希值
  5. 填充哈希值至b位
  6. K^+与01011100*(b/8)异或
  7. 接第(5)步哈希值
  8. 再哈希的最终结果
HMAC.png

4.3.2 基于加密的MAC/CMAC

利用对称分组加密算法(如AES)对消息进行运算,得认证码。
算法步骤:
假定消息分组长度b位,共n组,K为k位加密算法秘钥。K_1,K_2为b位常量

1.C_1=E(K,M_1)
2.C_2=E(K,M_2xor\ C_1)以此循环至
3.C_n=E(K,M_nxor\ C_{n-1}xor\ K_1)
4.T=MSB_{Tlen}(C_n)

T是认证码,Tlen是T位长度,MSB_{Tlen}(C_n)是指前Tlen位。
假若消息长度无法整除b,那么填充10*使其可整除b。然后在最后一步用K_2计算,
关于K_1K_2的生成:
L=E(K,0^b)
K_1=L\cdot x
K_2=L\cdot x^2(乘法是伽瓦罗域上的乘法)

4.3.3 认证加密CCM与GCM

CCM=CMAC+AES+CTR,发送方采用先认证后加密模式;接收方采用先解密后认证模式。
通信双方要共享密钥K,计数器初始值CTR_0,临时量N,相关数据A
发送方算法如下:

1.N,A,与明文拼接,得可模b位的数据
2.然后用K以CMAC得认证值T
3.CTR_0用K加密,前len(Tag)位与Tag异或
4.对明文进行AES-CTR加密
5.后拼接(3)的数据,传给接收方

GCM=GCTR+GHASH,模式采用先加密后认证(再加密)。以GCTR和GHASH为基本算法模块.
加密函数GCTR_k(ICB,X)表示输入密钥K,计数器值ICB,明文X,输出与X一样长的密文Y
算法步骤如下:

1.加入X为空,直接输出空
2.将X分组为X_1||X_2...||X_n(其中n小于或等于128bits)
3.初始化计数器值:CB_1=ICB
4.CB_i=inc_{32}(CB_{i-1})CB_{i-1}低32位加一后模2^{32}
5.Y_i=X_i\ xor\ E(K,CB_i)除了最后一组
6.Y_n=X_n\ xor\ MSB_{len(X_n)}(E(K,CB_n))
7.输出Y=Y_1||Y_2...||Y_n

哈希函数GHASH需要哈希秘钥H,以及不定长数据串,输出固定长度(128bits)的哈希值,
算法步骤如下:

1.将数据分组:X=X_1||X_2||...X_n
2.初始化Y;Y_0=0^{128}
3.Y_i=(X_i\ xor\ Y_{i-1})\cdot H
4.输出Y_n

GCM利用此两个函数,先将明文用GCTR加密,后填充相关参数数据,然后用GHASH哈希,然后在用GCTR加密,最后输出需求长度的验证码。


GCM.png

五、数字签名

数字签名的思路:利用哈希算法与非对称加密算法

5.1 ElGamal数字签名

对于签名的一方A:要有消息哈希值:m=H(M),素数q及其本原根\alpha,以及临时私钥X_A,随机数K,K满足gcd(K,q-1)=1,即K与q-1互素。
计算S_1=\alpha^K\ mod\ q,类似于ElGamal加密算法。
计算S_2=K^{-1}(m-X_AS_1)\ mod\ q-1S_2作用于指数上,所以根据离散对数原理,包含X_A,以及模q-1.计算完毕后,A将(S_1,S_2)作为签名,以(\alpha,q,Y_A)作为公钥。
对于认证的一方:收到A的消息、签名及公钥。做出如下计算:
V_1=\alpha^m\ mod\ q
V_2=Y_A^{S_1}S_1^{S_2}\ mod\ q
假若V_1=V_2那么,认证通过。

5.2 Schnorr数字签名

Schnorr签名采用先计算,在哈希的方法以提高计算效率。
对于签名的一方A:要有两个素数p,q,且q|p-1,选择整数\alpha ^q=1\ mod\ p,(\alpha,q,p)
构成公开参数;然后,选取0<s<q作为私钥,计算v=\alpha^{-s}\ mod\ p为公钥。
产生签名算法如下:
随机生成0<r<q,计算x=\alpha^r\ mod p,计算哈希值e=H(M||x);计算y=r+se\ mod\ q
签名便是(e,y);
认证方利用公钥和已知参数进行验证:计算x'=\alpha^yv^e,e'=H(M||x').
假若e=e',那么,签名认证成功。

5.3 DSA数字签名

首先需要公开参数:素数对p,q,且q|p-1;
签名方需要私钥x,0<x<q,随机数k,0<k<q,g,g=h^{(p-1)/q}\ mod\ p, g\neq 1;
生成公钥y=g^x\ mod\ p,r=(g^k\ mod\ p)\ mod\ q,s=k^{-1}[H(M)+xr]\ mod\ q
得签名(r,s)
验证方计算(主要思路是计算到r=g^k):
需要指数上:w=s^{-1}\ mod\ q,u_1=H(M)w\ mod\ q,u_2=wr\ mod\ q
然后计算:g^{u_1}y^{u_2}\ mod\ p\ mod\ q若与r相同,即签名成功。

六、认证协议

6.1 弱认证/口令认证

用户传输一个口令,计算机根据该口令验证是否与该用户对应,以此确保用户身份。(例如:登陆操作)
安全性:口令认证主要存在字典攻击(在线,离线);字典攻击即通过穷举字典中的口令,猜测出用户的口令
故此,需要对口令进行加盐哈希操作。
用户将口令填充数据(加盐),然后将整个数据加密,并将“盐”和密文放进口令文件中。然后传输。
每次用户需要被认证时,服务器通过传输过来的口令,从口令文件中得盐再加密,与口令文件中密文比对,看是否一致,以此认证。
这样做的好处是防止重复口令被发现;增加字典攻击难度。

基于口令的秘钥交换:
公共参数:Z^*_p上的生成元g,M,M^{-1}
用户A有口令pw,且产生一个私钥x,计算公钥g^x*M^{pw}\ mod\ p,传送口令和公钥给B。
用户B产生一个私钥y,根据公钥以及口令计算秘钥g^y*M^{-pw}*g^x*M^{pw}\ mod\ p=g^{xy}
并将产生的公钥g^y*M^{-pw}传给A;
A采用同样算法产生密钥g^{xy}

6.2 强认证/质询-应答

认证与被认证双方协商好秘密sk以及加密函数f,每一次用户需要被认证时,系统向用户发送一个质询
(challenge)消息m,用户以r=f(m,sk)作为应答。系统通过验证r来确认用户的身份。

6.2.1 基于硬件

“token”:对消息提供哈希和加密机制,需要硬件支持时间戳,能保存密钥,以及生成同步信息。

  • 基于时间戳的单边认证
    A \rightarrow B:E_k(t,B)
  • 基于随机数(单边认证)
    B \rightarrow A:r
    A \rightarrow B:E_k(r,B)
  • 基于随机数的双边认证
    B \rightarrow A:r_B
    A \rightarrow B:E_k(r_A,r_B,B)
    B \rightarrow A:E_k(r_B,r_A)
  • 基于哈希函数的双边认证
    B \rightarrow A:r_B
    A \rightarrow B:r_A,H(r_A,r_B,B)
    B \rightarrow A:H(r_A,r_B,A)

6.2.2 基于公钥密码体制

  • 单边:
    B \rightarrow A:H(r),B,P_r(r,B)
    A \rightarrow B:r
  • 双边/Needham-Schroeder协议
    A \rightarrow B:P_B(r_A,A)
    B \rightarrow A:P_A(r_A,r_B)
    A \rightarrow B:r_B

6.2.3 基于签名

  • 基于时间戳
    A \rightarrow B:cert_A,t,B,sign_A(t,B)(sign是签名算法)
  • 基于随机数的单边认证:
    B \rightarrow A:r_B
    A \rightarrow B:cert_A,r_A,B,sign(r_A,r_B,B)
  • 基于随机数的双边认证:
    B \rightarrow A:r_B
    A \rightarrow B:cert_A,r_A,B,sign_A(r_A,r_B,B)
    B \rightarrow A:cert_B,A,sign_B(r_B,r_A,A)

6.2.4 基于公钥体制认证的秘钥交换协议/HMQV

类似于DH。针对双方A和B:公私钥对(A=g^a,a)(B=g^b,b)
A \rightarrow B:X=g^x
B \rightarrow A:Y=g^y
A根据B传输的信息:Y以及公钥B利用自己的私钥a与随机数x计算密钥:(YB^{H(Y)})^{(x+aH(X))}
B根据A传输的信息:X以及公钥A利用自己的私钥b与随机数y计算密钥:(XA^{H(X)})^{(y+bH(Y))}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容