Skip to content

Instantly share code, notes, and snippets.

@mylamour
Created September 27, 2021 03:34
Show Gist options
  • Save mylamour/791d075ae7135435110ee24c2ddd55f2 to your computer and use it in GitHub Desktop.
Save mylamour/791d075ae7135435110ee24c2ddd55f2 to your computer and use it in GitHub Desktop.

0x01 密码学基础

以下章节中的密码学基础部分的知识主要总结自《图解密码技术》读书笔记,图片系原文所载。有个朋友说这个是神书,我觉得大可不必,不过确切是本好书,因为能够帮助数学基础不是很好的读者快速了解密码学基础。

1. 受到的部分威胁和对应的密码技术

image

2. 基本的密码技术与常识

基本密码技术分为六部分:对称密码(Symmetric Cryptography),非对称密码(Asymmetric Cryptography),单向散列函数,消息认证码,数字签名,伪随机数生成器。

image image

大部分密钥技术中都需要密钥,这里面有个值得参考的观点是————密钥与明文是等价的 (即如果明文价值100w,那密钥也就值100w。)

以下是各种不同的密钥:

  1. 对称密码的密钥与公钥密码的密钥
  2. 消息认证码的密钥与数字签名的密钥
  3. 用于确保机密性的密钥与用于认证的密钥
  4. 会话密钥与主密钥
  5. 用于加密内容的密钥与用于加密密钥的密钥
  6. 基于口令的密码(Password Based Encryption)

对于这些密钥的

  • 密钥配送 (Diffie-Hellman密钥交换:分为离散对数问题的和椭圆曲线上的离散对数问题)

3. 对称密码

对称密码可以分为两类:序列密码和分组密码。如其名,序列密码单独加密每个位,分组密码加密明文分组。 分组密码(Block Cipher)每次只能处理特定长度的一块(Block),下面主要介绍分组密码。

对称密码的加解密主要依赖是比特的异或计算, 假设明文是010101,密钥是111111, 那么异或得到的密文就是101010, 翻过来密文进行解密时候同密钥进行异或就可以得到010101

0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0

3.1 DES与3DES

DES全称是Data Encryption Standard, 1977年被FIPS采用,基本结构为Feistel网络/结构。目前不应被用于现有或新的加密用途。

Feistel网络中,加密和解密可以用完全相同的结构实现,加密的各个步骤被称为轮,轮数可以任意增加。

image

DES就是一种16轮循环的Feistel网络。 即每次输入输出后左右侧对调,然后使用新的子密钥通过轮函数进行异或。 下面是一个三轮的Feistel网络。记住DES是16轮的。 image

而3DES就是将DES重复3次得到的。 image

不过可以发现3DES加密过程是加密-解密(这一步是为了能够向下兼容)-加密,如果DES密钥1,2,3相同那么其实3DES就和DES是一样的。 如果1,2,3完全使用不同的密钥就叫DES-3DES,如果1,3相同,2不同就是DES-EDE2。

3DES目前暂时允许使用,但不应用于新用途。

3.2 AES

全称是Advanced Encryption Standard,由NIST选拔作为FIPS标准。我最开始的时候以为AES是一种,其实AES是由一系列算法选拔得到的。1997年开始募集(15个算法中5个入围),2000年选定分组密码Rijndael(by比利时密码学家Joan Daemen & Vincent Rijmen)。

Rijndael也是由多个轮构成,不过用的是SPN结构,不再是Feistel网络。主要分为SubBytes(16字节分组进行处理,获得一张拥有256个值的替换表S-Box), ShiftRows(以4字节为单位的行进行某种规则向左平移,每一行平移的字节数不同), MixColumns(对1个4字节值进行比特运算), AddRoundKey(将MixColumns的输出与轮密钥进行异或)。完成从SubBytes->AddRoundKey算是1轮,Rijndael结构需要重复10-14轮,解密时顺序相反,方向相反即可。AddRoundKey -> InvMixColumns -> InvShiftRows -> InvSubBytes

3.3 填充模式的优劣对比

分组意味着能处理特定长度的,针对任意长度的就要对分组密码进行迭代,迭代的方式成为模式。

image

OFB模式与CTR模式的对比 image

CFB模式与OFB模式的对比 image

4. 非对称密码

又称为公钥密码(Public-Key Cryptography), 主要是依托于人类目前尚无法快速求解离散对数的原理。

image

4.1 RSA

4.1.1 RSA的加密和解密

image image

4.1.2 签名与验签

image

一般有两种形式,一种是直接对消息签名,另一种是对消息的散列值进行签名。 image

4.2 ECC

全称为Elliptic Curve Cryptography 椭圆曲线密码。

主要包含三个方面:

  • 基于椭圆曲线的公钥密码
  • 基于椭圆曲线的数字签名
  • 基于椭圆曲线的密钥交换

4.2.1 DH交换

image

4.3 应用与攻击方式:

应用:

  • 公钥证书
  • SSL/TLS

攻击方式:

  • 中间人攻击
  • 对单向散列函数的攻击
  • 利用数字签名攻击公钥密码
  • 潜在伪造

4.4 混合密码系统

简单来说就是用非对称密码保护对称密钥,用对称密钥进行对数据的加解密。

加密 image

解密 image

5. 单向散列函数

英文名 One-way hash function,又称作消息摘要函数(Message digest function)、哈希函数、杂凑函数。 输入成为消息(message)也成为原像(Message digest), 输出为散列值(hash value)也成为消息摘要(Message digest)或者指纹(fingerprint)

能够辨别出是否被篡改,但无法识别伪装。

特性:

  1. 根据任意长度的消息计算出固定长度的散列值
  2. 能够快速计算出固定长度的散列值
  3. 消息不同散列值不同(抗碰撞性)
  4. 具备单向性

应用:

  • 检测软件是否篡改
  • 基于口令的加密
  • 消息认证码
  • 数字签名
  • 伪随机数生成器
  • 一次性口令

常见的单向散列函数:

  • MD4、 MD5
  • SHA-1、SHA-256、SHA-384、SHA-512
  • RIPEMD-160
  • SHA-3

6. 消息验证码

英文名 Message Authentication Code, 输入为任意长度的消息和一个发送者与接收者之间共享的密钥,输出为固定长度的数据,即MAC值。

能够辨别篡改和伪装,但无法解决对第三方证明,以及防止否认

6.1 实现方法

  1. 使用单向散列函数实现 使用SHA1、SHA-224、SHA-256、SHA-384、SHA-512所构造的HMAC分别称为HMAC-SHA1、HMAC-SHA-224、HMAC-SHA-256、HMAC-SHA-384、HMAC-SHA-512 image
  2. 使用分组密码实现
  3. 其他方法(流密码,公钥密码)

6.2 应用与攻击方式

应用:

  • SWIFT (参考电子支付基础的一些分享资料)
  • IPsec
  • SSL/TLS

攻击方式:

  • 重放攻击
  • 密钥推测攻击

7. 伪随机数生成

很多地方都会用到随机数,生成密钥,密钥对,初始化向量,Nonce,盐。但是软件是没有办法生成真正的随机数的,软件生成的都是伪随机数。

image

生成伪随机数有以下几种方法:

  • 杂乱的方法
  • 线性同余法
  • 单向散列函数法
  • 密码法
  • ANSI X9.17

8. PGP

略,可参考,PGP: Pretty Good Privacy - Garfinkel Simson

9. 关于密码系统的信息安全常识

  • 不要使用保密的密码算法
  • 使用低强度的密码比不进行任何加密更危险
  • 任何密码总有一天都会被破解
  • 一次性密码本理论上是无法破译的,但实际过程因为面临密钥配送问题,保存问题,重用问题,同步问题,生成问题而没有得到使用。
  • 盐主要是防御字典攻击的
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment