0%

Diffie–Hellman密钥交换

算法描述

1、有两个全局公开的参数,一个素数q和一个整数a,a是q的一个原根。

2、假设用户A和B希望交换一个密钥,用户A选择一个作为私有密钥的随机数XA< q,并计算公开密钥YA=a^XA mod q。A对XA的值保密存放而使YA能被B公开获得。类似地,用户B选择一个私有的随机数XB< q,并计算公开密钥YB=a^XB mod q。B对XB的值保密存放而使YB能被A公开获得。

3、用户A产生共享秘密密钥的计算方式是K = (YB)^XA mod q。同样,用户B产生共享秘密密钥的计算是K = (YA)^XB mod q。这两个计算产生相同的结果:
结果图示

            K = (YB)XA modq

            = (aXB modq)XA mod q

            = (aXB)XA modq                  (根据取模运算规则得到)

            = aXBXA modq

            = (aXA)XB modq

            = (aXA modq)XB mod q

            = (YA)XB modq

所以 (YB)XA modq = K =(YA)XB modq

因此相当于双方已经交换了一个相同的秘密密钥。

4、因为XA和XB是保密的,一个敌对方可以利用的参数只有q、a、YA和YB。因而敌对方被迫取离散对数来确定密钥。例如,要获取用户B的秘密密钥,敌对方必须先计算

           XB = inda ,q(YB)

然后再使用用户B采用的同样方法计算其秘密密钥K。

Diffie-Hellman算法具有两个吸引力的特征:

1、仅当需要时才生成密钥,减小了将密钥存储很长一段时间而致使遭受攻击的机会。

2、除对全局参数的约定外,密钥交换不需要事先存在的基础结构。

算法存在的问题

1、没有提供双方身份的任何信息。

2、它是计算密集性的,因此容易遭受阻塞性攻击,即对手请求大量的密钥。受攻击者花费了相对多的计算资源来求解无用的幂系数而不是在做真正的工作。

3、没办法防止重演攻击。

4、容易遭受中间人的攻击。第三方C在和A通信时扮演B;和B通信时扮演A。A和B都与C协商了一个密钥,然后C就可以监听和传递通信量。中间人的攻击按如下进行:

(1)B在给A的报文中发送他的公开密钥。

(2)C截获并解析该报文。C将B的公开密钥保存下来并给A发送报文,该报文具有B的用户ID但使用C的公开密钥YC,仍按照好像是来自B的样子被发送出去。A收到C的报文后,将YC和B的用户ID存储在一块。类似地,C使用YC向B发送好像来自A的报文。

(3)B基于私有密钥XB和YC计算秘密密钥K1。A基于私有密钥XA和YC计算秘密密钥K2。C使用私有密钥XC和YB计算K1,并使用XC和YA计算K2。

(4)从现在开始,C就可以转发A发给B的报文或转发B发给A的报文,在途中根据需要修改它们的密文。使得A和B都不知道他们在和C共享通信。

对Diffie-Hellman密钥交换算法的优化:Oakley算法

Oakley算法具有五个重要特征:

1、它采用称为cookie程序的机制来对抗阻塞攻击。

2、它使得双方能够协商一个全局参数集合。

3、它使用了现时来保证抵抗重演攻击。

4、它能够交换Diffie-Hellman公开密钥。

5、它对Diffie-Hellman交换进行鉴别以对抗中间人的攻击。

Oakley可以使用三个不同的鉴别方法:

1、数字签名:通过签署一个相互可以获得的散列代码来对交换进行鉴别;每一方都使用自己的私钥对散列代码加密。散列代码是在一些重要参数上生成的,如用户ID和现时。

2、公开密钥加密:通过使用发送者的私钥对诸如ID和现时等参数进行加密来鉴别交换。

3、对称密钥加密:通过使用某种共享密钥对交换参数进行对称加密,实现交换的鉴别。

这种算法的关键是在这个式中

b=ai mod p, 0<=i<=p-1

如果知道a, i, p可以很方便的算出b的值,但是知道b, a, p的情况下想要算出i的值却非常难。所以如果只要突破这个点,就需要能在足够短的时间内算出i的值是多少。我相信不久的将来,随着量子计算机的发展,破解这种加密方式将不再是问题,任何一种依靠计算复杂度来保证数据安全性的加密方式都将会被淘汰,应运而生的将是更加先进可靠的加密方式。

数字签名

什么是数字签名

数字签名采用非对称密码体制(公钥密码体制),即发送者 使用 私钥加密数据 ,接收者 使用 对应的公钥 解密数据,它具有以下功能:

数字签名的用途

① 报文鉴别 : 用于 证明来源 , 接收者 可以 通过签名 确定 是哪个发送者 进行的签名 ;

② 防止抵赖 : 防止 发送者 否认签名 , 发送者 一旦签名 , 标记就打上了 , 无法抵赖 ;

③ 防止伪造 : 防止 接收者 伪造 发送者 的签名 。

数字签名验证过程

数字签名验证过程
上面过程中,用户A使用私钥对由文件生成的128位摘要进行加密的过程称为数字签名的过程,得到的”加密的摘要”,称为该文件的数据签名。

上面例子传输过程中,用户A使用数字签名时给用户B发送了一个数据包,数据包中包含了A的公钥、文件和加密的摘要。那么问题来了:用户B如何确定收到的公钥是用户A发送的,而不是他人冒充用户A发送的呢?这时就需要有一个双方都信任的第三方证书颁发机构来协调。

证书颁发机构,即认证中心CA (Certification Authority),将公钥与其对应的实体(人或机器)进行绑定(binding);即给公司或个人颁发证书。

认证中心一般由政府出资建立。每个实体都有CA 发来的证书(certificate),里面有公钥及其拥有者的标识信息。此证书被 CA 进行了数字签名。任何用户都可从可信的地方获得认证中心 CA 的公钥,此公钥用来验证某个公钥是否为某个实体所拥有。

经CA认证后数字签名验证过程

对称密码算法

对称算法是指加密秘钥和解密秘钥相同的密码算法,又称为秘密秘钥算法单密钥算法

分组密码算法

又称块密码算法

加密步骤一:将明文拆分为 N 个固定长度的明文块
加密步骤二:用相同的秘钥和算法对每个明文块加密得到 N 个等长的密文块
加密步骤三:然后将 N 个密文块按照顺序组合起来得到密文

常见算法:AES(安全强度较高,应用范围较广)、SM1、SM4、DES/3DES(已被淘汰或逐步淘汰)

流密码算法

又称序列密码算法

加密:每次只加密一位或一字节明文
解密:每次只解密一位或一字节密文

常见算法:RC4

非对称密码算法

非对称算法是指加密秘钥和解密秘钥不同的密码算法,又称公开密码算法公钥算法,使用一个密钥进行加密,用另一个进行解密

加密秘钥可以公开,又称为公钥
解密秘钥必须保密,又称为私钥

常见非对称算法包括 RSA、SM2、DH、DSA、ECDSA、ECC

python crypto模块实现RSA加密

1、安装模块
pip install pycryptodome
2、实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from Crypto import Random
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64

# 伪随机数生成器
random_generator = Random.new().read
# rsa算法生成秘钥对实例对象:1024是秘钥的长度
rsa = RSA.generate(1024, random_generator)

#生成私钥并保存到pem文件,如果知道秘钥值key3也可以不保存,拼接上begin/end标识后加载直接用,如key3 = '-----BEGIN PUBLIC KEY-----\n' + key3 + '\n' + '-----END PUBLIC KEY-----'
private_pem = rsa.exportKey()
with open("private.pem", "wb") as f:#wb,以二进制格式写入文件
f.write(private_pem)

#生成公钥并保存到pem文件,当然也可以不保存直接用,即key1
public_pem = rsa.publickey().exportKey()
with open("public.pem", "wb") as f: #wb,以二进制格式写入文件
f.write(public_pem)

#plaintext:需要加密的明文文本,公钥加密,私钥解密
plaintext = '123456'

#加密过程
# 1:加载公钥
with open("public.pem") as f1:
key1 = f1.read() #从pem文件中读取公钥内容,包括begin头/end尾标识
public_key = RSA.import_key(key1) #加载公钥key1

#:2:加密
cipher_rsa = PKCS1_v1_5.new(public_key)
cipher_text = base64.b64encode(cipher_rsa.encrypt(plaintext.encode('utf-8'))) #cipher_text 即为加密后的密文
#打印加密结果
print(cipher_text.decode('utf-8'))#Python3的字符串的编码语言用的是unicode编码,由于Python的字符串类型是str,如果直接打印出来print(cipher_text),会是b'字符串',解决方案是后面添加decode('utf-8')


# 读取私钥
with open("private.pem") as f2:
key2 = f2.read()#从pem文件中读取私钥内容,包括begin头/end尾标识
private_key = RSA.import_key(key2)#加载私钥key2

# 解密
cipher_rsa = PKCS1_v1_5.new(private_key)
text = cipher_rsa.decrypt(base64.b64decode(cipher_text),random_generator)
#打印解密结果
print(text.decode('utf-8'))#Python3的字符串的编码语言用的是unicode编码,由于Python的字符串类型是str,如果直接打印出来print(text),会是b'字符串',解决方案是后面添加decode('utf-8')

摘要算法

摘要算法是指把任意长度的输入消息数据转化为固定长度的输出数据的一种密码算法,又称为散列函数、哈希函数、杂凑函数、单向函数
摘要算法所产生的固定长度的输出数据称为 摘要值 、 散列值 或 哈希值 ,摘要算法无秘钥。

摘要算法 通常用来做数据完整性的判定,即对数据进行哈希计算然后比较 摘要值 是否一致。

摘要算法主要分为三大类:MD(Message Digest,消息摘要算法)、SHA-1(Secure Hash Algorithm,安全散列算法)和 MAC(Message Authentication Code,消息认证码算法

MD系列主要包括 MD2、MD4、MD5
SHA系列主要包括SHA-1、SHA-2 系列(SHA-1 的衍生算法,包含 SHA-224、SHA-256、SHA-384、SHA-512)
MAC系列主要包括HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384 和 HmacSHA512 算法

python语言实现sha256加密

SHA256原理详细讲解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import hashlib

# 要加密的数据
data = b'Hello, World!'

# 创建 SHA-256 哈希对象
hash_object = hashlib.sha256()

# 对数据进行哈希计算
hash_object.update(data)

# 获取哈希值
hash_value = hash_object.hexdigest()

print(hash_value) # 输出哈希值

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment