现充|junyu33

(已完结)应用密码学笔记

简称为“大网安数”。

密码学概述

现代密码学四性:机密性,完整性,鉴别和不可抵赖性。

三个时期为:古典密码(算法保密),近代密码(密钥保密)和现代密码时期。

对密码系统的攻击:唯密文攻击,已知明文攻击,选择明文攻击,选择密文攻击。

Kerckhoffs原则:安全性只取决于密钥的保密,而不是算法。否则是“受限制的密码算法”。

安全性分类:无条件安全性,计算安全性,可证明安全性。

密码算法的功能:加密,杂凑,数字签名,身份鉴别,密钥协商。

私钥用于签名,公钥用于验证。

作业(p14):

1-1,1-2,1-4,1-6,1-7

古典密码

单表替代密码

Caesar

c=m+k

m=ck

仿射密码

k=(k1,k2)

c=k1m+k2

m=(ck2)k11(mod26)

密钥短语密码

把密钥放在最前面,剩余字母排在密钥后作为替换表。

缺点

词频分析。

多表替代密码

Vigenere

ci=mi+ki

mi=ciki

Hill

C=KM

M=K1C(mod26)

其中CM为列向量,Kn为加密矩阵。

优缺点:

OTP (Vernam)

ci=miki

mi=ciki

不能重复使用密钥,理论上不可破译。

playfair

密钥字母去重,放在前面,剩下字母接上,i/j 一起占一个空,排成5*5的矩阵。

对明文两两分组(记为p1 p2),如果:

链式密码算法

利用一个明文加密的结果作为下一个明文加密密钥。

缺点:误码扩散。

置换密码

周期置换

密钥规定了位置的置换。

属于Hill的特例,即属于线性变换的密码。

列置换密码

把明文按行填入矩阵,密钥规定以列读取的顺序。

转轮机密码

不考。

作业:

2.1 2.4 2.5 2.7 2.8 2.10 2.11 2.13 2.14 2.15

分组密码

设计原则

S2=S则是幂等密码体制,如仿射密码、置换密码等。

迭代密码体制必须是非幂等的。

典型结构

Li+1=Ri

Ri+1=LiF(Ri,Ki)

DES(重点)

步骤:

优点:

互补对称性证明:

对于F函数,有F(k,R)=PS(kE(R))=PS(kE(R))=F(k,R)

从而轮函数Qk(L,R)=(R,LF(k,R))=(R,LF(k,R)),进而Qk(L,R)=(R,LF(k,R))=Qk(L,R)

D为左右块对换,x=(L,R),从而加密函数Ek(x)=DQk16Qk15...Qk1(x)=DQk16Qk15...Qk1(x)=DQk16Qk15...Qk1(x)=Ek(x)

改进:三重DES。

分组密码的工作模式

如何选择:

AES(重点)

数学基础

有限域 GF(28)的乘法:略。

x乘:由于 AES 选取的模数为 0x11b,即x8+x4+x3+x+1,当乘数高位为0时,相当于左移;反之相当于左移并异或0x1b.

叉乘:指GF(28)中两个四次式相乘,模数为x4+1。可以通过矩阵乘法简化过程,具体而言,对于多项式a3a2a1a0b3b2b1b0,乘积d3d2d1d0为:

[d0d1d2d3]=[a0a3a2a1a1a0a3a2a2a1a0a3a3a2a1a0][b0b1b2b3]

其中项与项的点乘就是GF(28)的乘法(使用x乘),加法就是异或。

步骤

密钥128位。

总过程:

AddRoundKey()

for i from 1 to 9:
  SubBytes()
  ShiftRows()
  MixColumns()
  AddRoundKey()

SubBytes()
ShiftRows()
MixColumns()

其它对称加密

非对称加密

对称的缺点

公钥的特点

公钥的作用

RSA

具体过程:略

用CRT实现RSA的快速计算

例:计算md(modn),其中n=pqp,q为互异素数,d为密钥。

解:分别用欧拉定理计算md(modp)md(modq)的值,然后用CRT计算md(modn)即可。

Miller-Rabin

费马小定理是模数为素数的必要条件。

二次探测定理:若p是奇素数,则x21(modp)的解只有x1x1.

伪代码:

# false rate: 1 - 4^(-s)
def WITNESS(a, n):
  if pow(a, n-1, n) != 1:
    return FALSE
  else while n % 2 == 0:
    n /= 2
    if pow(a, n-1, n) != 1 or -1:
      return FALSE
  return TRUE

for i from 1 to s:
  if WITNESS(integers[i], n) == FALSE
    return NOT_PRIME
return PRIME

ElGamal

description

系统参数:p,αZp.

选取私钥xA,公钥为yA=αxA(modp)

加密:

解密:

feature

ECC

SM2也使用了椭圆曲线密码体制

实数域上的椭圆曲线

y2=x3+ax+b 可记为E(a,b),简称为E

P,Q,R共线,则定义加法单位元O=P+Q+R,对曲线上任意一点有P+O=P

易得加法逆元与本身的y轴互为相反数

因此可得加法的定义:做过P,Q的直线交ER,则RP+Q,由加法可以类比倍加的定义(此处省略)。可以证明,这种加法满足交换律和结合律。

从代数角度而言P+Q=(x3,y3)=(λ2x1x2,λ(x1x3)y1)λ为直线斜率,若P,Q重合则λ=3x2+a2y

有限域上的椭圆曲线

重点GF(p)GF(2n)不考。

y2=x3+ax+b(modp) 可记为Ep(a,b),简称为Ep

可以证明,有限域上的椭圆曲线关于运算 + 构成循环群

加法的定义把对应坐标模 p 即可,倍加类似。

例:求E11(1,6)中点的个数:

答:一共有13个(不要忘了O点!)

椭圆曲线上的ElGamal

ord(P)为满足nP=O的最小整数n.

ECDLP: 已知α,β,求kα=βk[0,ord(α)1]是困难的。

类似于离散对数(DLP)问题,可以把点加类比于模乘,倍加类比于方幂。

系统参数:E(a,b),基点G(其阶为n)。

密钥生成:选取私钥dA,公钥为PA=dAG

加密:

解密:

Menezes-Vanstone

主要解决将明文m映射到Pm的问题

系统参数:E(a,b),基点G(其阶为n)。

密钥生成:选取私钥dA,公钥为PA=dAG

加密:

解密:

例:设E11(1,6)中基点G(2,7),密钥d=7,明文为(9,1),随机数k=6,计算密文。

解:计算公钥PA=dG=7(2,7)=(7,2)

c1=6G=(7,9)

Y=kPA=kdG=42G=3G=(8,3)

c2=8×9=6(modp)

c3=3×1=3(modp)

故密文为((7,9),6,3)

代码实现(晚上写作业时搞的)

# ECC en&decrypt in GF(p)
# 4/24/2023 junyu33
import gmpy2
a = 1
b = 6
p = 11
G = [2, 7]
d_A = 5
def Add(A: list, B: list) -> list:
    lamb = 0
    if A == B:
        lamb = (3*A[0]*A[0]+a)*gmpy2.invert(2*A[1], p) % p
    else:
        lamb = (B[1]-A[1])*gmpy2.invert(B[0]-A[0], p) % p
    s = (lamb**2 - A[0] - B[0]) % p
    t = (lamb*(A[0]-s) - A[1]) % p
    return [s,t]

def Mult(X: list, t: int) -> list:
    R = X
    t = t - 1
    while t:
        if t & 1:
            R = Add(R, X)
        X = Add(X, X)
        t >>= 1
    return R

def enc(M: list, G: list, k: int):
    c_1 = Mult(G, k)
    P_A = Mult(G, d_A)
    Y = Mult(P_A, k)
    c_2 = Y[0] * M[0] % p
    c_3 = Y[1] * M[1] % p
    print(c_1, c_2, c_3)

def dec(c_1: list, c_2: int, c_3: int):
    Y = Mult(c_1, d_A)
    z_1 = Y[0]
    z_2 = Y[1]
    m_1 = c_2 * gmpy2.invert(z_1, p) % p
    m_2 = c_3 * gmpy2.invert(z_2, p) % p
    print(m_1, m_2)

enc([7,9],G,3)

哈希

SHA-1(已被破解)

big-endian

2**64-1 -> 160 bit

steps

生日攻击

如果消息空间的大小为N,那么大概随机选择N个消息,就有一半的概率产生碰撞。

SM3

国内商用密码 Hash 函数。

分组 512 bit,输出 256 bit。

智能电表,TPM2.0

消息鉴别

消息鉴别码(Message Authentication Code, MAC)的分类:

数字签名

RSA

发送者使用sA=md(modn)进行签名。

接收者使用m=sAe(modn)进行验证。

ElGamal

初始化:eA=αdA(modp)

签名变换:

注意k不能被泄露,加密部分同理。

DSA

p,q,g公开,qp1的素因子,g=h(p1)/q(modp)

随机选取x作为私钥,公钥y=gx(modp)

签名变换:

ECDSA

E(Fp),G,n为系统参数。

随机选取d(1,n)作为私钥,Q=dG作为公钥。

特殊签名

密钥管理技术

Diffie-Hellman (非对称,只能用于两个用户的密钥交换)

系统参数:p,α

显然以上两个值相等,密钥协商完成。

易受中间人攻击。

Shamir 门限方案

系统参数:k,n,q

秘密:s,a1,a2,,ak1

因此可构造出秘密多项式:

f(x)=s+a1x+a2x2++ak1xk1

密钥分发者根据每个人的密钥xi计算出f(xi)的值,各自分发给他们。

由拉格朗日插值,只有任意取k个人才能还原出秘密多项式(重构),过程如下:

f(x)=i=1kf(xi)j=1,jikxxjxixj(modq)

特别的,当x=0时,可以计算出秘密s的值:

s=f(0)=(1)k1i=1kf(xi)j=1,jikxjxixj(modq)

不足:

身份鉴别技术

概念,威胁,攻击手段

质询——响应身份鉴别:

S/Key OTP 身份鉴别:

零知识证明协议

n=p×q,假设 Alice 知道 n 的因子,如果 Alice 想告诉 Bob 她知道但不具体告诉 Bob 因子是什么,可以执行以下步骤:

理论基础是计算 y(modn) 的难度等价于对 n 进行因式分解。

kerberos 身份鉴别

采用对称密钥体制,由可信第三方提供鉴别服务。

通过票据(ticket)给通信双方分发共享密钥。

安全通信

伪代码:

发送方:

# send.py
# Example usage:
with open("public_key_B.pem", "rb") as f:
  public_key_B = RSA.import_key(f.read())

with open('data', 'rb') as f:
  data = f.read()

# Party A encrypts the data and signs it
ciphertext = encrypt(data, key)
signature = sign(data, private_key_A)

# Party A encrypts the key using the public key of party B
encrypted_key = encrypt_key(key, public_key_B)

with open('encrypted_key', 'wb') as f:
  f.write(encrypted_key)

with open('ciphertext', 'wb') as f:
  f.write(ciphertext)

with open('signature', 'wb') as f:
  f.write(signature)

with open('public_key_A.pem', 'wb') as f:
  f.write(public_key_A.export_key('PEM'))

接收方

# receive.py
with open('public_key_A.pem', 'rb') as f:
  public_key_A = RSA.import_key(f.read())
with open('encrypted_key', 'rb') as f:
  encrypted_key = f.read()

with open('signature', 'rb') as f:
  signature = f.read()

with open('ciphertext', 'rb') as f:
  ciphertext = f.read()

# Party B decrypts the key and uses it to decrypt the data
key = decrypt_key(encrypted_key, private_key_B)
decrypted_data = decrypt(ciphertext, key)
with open('decrypted_data', 'wb') as f:
  f.write(decrypted_data)

# Party B verifies the signature of party A
is_valid = verify_signature(decrypted_data, signature, public_key_A)

if is_valid:
  print("The signature is valid")
else:
  print("The signature is not valid")

序列密码基础

又称流密码,属于对称密码体制,适合硬件实现。

分类

LFSR

注意是高位移向低位x1就是输出,f的值为下一个xn.

性质完全由反馈函数决定。nLFSR周期T2n1.

基于LFSR的序列密码生成器有:

RC4

两个算法:密钥调度算法KSA、伪随机数生成算法PRGA。