7.密钥

7.密钥什么是密钥各种不同的密钥对称密码的密钥vs.公钥密码的密钥消息认证码的密钥vs.数字签名的密钥用于确保机密性的密钥vs.用于认证的密钥会话密钥vs.主密钥用于加密内容的密钥vs.用于加密密钥的密钥密钥的管理生成密钥配送密钥更新密钥保存密钥作废密钥Diffie-Hellman密钥交换椭圆曲线 DH 密钥交换基于口令的密码PBE加密PBE解密盐的作用口令的作用通过拉伸来改良PBE如何生成安全的口令

什么是密钥

密钥(可以)是一个巨大数字,数字本身的大小并不重要,重要的是 密钥空间的大小 ,也就是可能出现的密钥的总量。

密钥空间越大,进行暴力破解就越困难。

密钥空间的大小由 密钥长度 决定。

密钥和明文是等价的 ,即,得到密钥就等于得到了明文。

信息的机密性不应依赖于密码算法本身,而是应该依赖于妥善保管的密钥。

各种不同的密钥

对称密码的密钥vs.公钥密码的密钥

对称密码中,加密和解密使用同一个密钥。也称 共享密钥密码

对称密码中所使用的密钥必须对发送者和接收者以外的人保密。

公钥密码中,公钥用于加密,私钥用于解密。公钥和私钥合称密钥对,密钥对中的公钥和私钥之间具有深刻的数学关系。

消息认证码的密钥vs.数字签名的密钥

消息认证码中,发送者和接收者使用共享的密钥来进行认证。

消息认证码只能由持有合法密钥的人计算出来。将消息验证码附加在通信报文后面,就可以识别通信内容是否被篡改或伪装。

消息认证码的密钥必须对发送者和接收者以外的人保密、

数字签名中,签名的生成和验证使用不同的密钥。只有持私钥的人才能生成签名,任何人都可以使用公钥验证签名。

用于确保机密性的密钥vs.用于认证的密钥

对称密码和公钥密码的密钥都是用于确保机密性的密钥 。没有密钥就无法得知明文内容。

消息认证码和数字签名的密钥则是用于认证的密钥 。没有密钥就不能修改数据、伪装本人身份。

会话密钥vs.主密钥

每次通信只能使用一次的密钥称为 会话密钥 (session key)。

一直被重复使用的密钥称为 主密钥 (master key)。

用于加密内容的密钥vs.用于加密密钥的密钥

CEK——Contents Encrypting Key,内容加密密钥,加密对象是用户直接使用的信息。

KEK——Key Encrypting Key,密钥加密密钥,加密对象是密钥。

密钥的管理

生成密钥

生成密钥的最好方法是使用随机数,具备不易被他人推测的性质。

在可能的情况下最好使用能够生成密码学上的随机数的硬件设备,但一般我们都是使用伪随机数生成器这一专门为密码学用途设计的软件。

密码学用途的伪随机数生成器必须是专门针对密码学用途而设计的 。否则不能用来生成密钥,因为它们不具备不可预测性。

口令 (password或passphrase)输入单向散列函数,将得到的散列值作为密钥使用。

在使用口令生成密钥时,为了防止字典攻击,需要在口令上加 (salt,一串随机数),然后再将其输入单向散列函数。这种方法称为【基于口令的密码】(Password Based Encryption,PBE)。

配送密钥

可以采用 事先共享密钥使用密钥分配中心使用公钥密码 等方法,也可以使用 Diffie-Hellman 密钥交换 方法。

更新密钥

密钥更新 (key updating)是一种提高通信机密性的技术。这种方法就是在使用共享密钥进行通信的过程中,定期(例如每发送1000个字)改变密钥。发送者和接收者必须同时用同样的方法改变密钥。

用当前密钥的散列值作为下一个密钥

基于单向散列函数的单向性,保证了反算的困难度,因此这种防止破译过去的通信内容的机制被称为 后向安全 (backward security)。

保存密钥

人类无法记住具有实用长度的密钥。

将密钥保存下来又可能被窃取。

一旦密钥被盗,为了能够让攻击者花更多的时间才能真正使用这个密钥,可以使用 将密钥加密后保存 的方法——KEK。

作废密钥

密钥的作废和生成是同等重要的。

不再需要的密钥必须妥善删除,否则以前用它加密的文件就可能面临泄密的危险。

Diffie-Hellman密钥交换

1976年由 Whitfield Diffie 和 Martin Hellman 共同发明的一种算法。使用这种算法,通信双方仅通过交换一些可以公开的信息就能够生成出共享的秘密数字,而这一秘密数字就可以被用作对称密码的密钥。

IPsec中使用了经过改良的Diffie-Hellman密钥交换。

实际上双方并没有真正交换密钥,而是通过计算生成出了一个相同的共享密钥。因此这种方法也称为 Diffie-Hellman 密钥协商 (Diffie-Hellman key agreement)。

DH步骤大致如下:

image-20250429162147954

  1. Alice向Bob发送两个质数 PG

    P 必须是一个非常大的质数,而 G 则是一个和 P 相关的数,称为 生成元 (generator)。

    G 可以是一个较小的数字。

    PG 不需要保密,且可以由Alice和Bob中的任意一方生成。

  2. Alice生成一个随机数 A

    A 是一个 1~P -2 之间的整数。这个数只能由Alice知道。

  3. Bob生成一个随机数 B

    B 是一个 1~P -2 之间的整数。这个数只能由Bob知道。

  4. Alice将 GA mod P 这个数发送给Bob

    这个数不需要保密

  5. Bob将 GB mod P 这个数发送给Alice

    这个数不需要保密

  6. Alice用Bob发过来的数计算 A 次方并求 mod P

    这个数就是共享密钥。

    Alice计算的密钥 = (GB mod P)A mod P = GAxB mod P

  7. Bob用Alice发过来的数计算 B 次方并求 mod P

    Bob计算的密钥 = (GA mod P)B mod P = GAxB mod P

最终得到的结果是,Alice计算的密钥 = Bob计算的密钥。

由于上述过程中的随机数 AB 是保密的,所以第三方无法计算出密钥(有限域的离散对数问题)。

有限域的离散对数问题的复杂度是支撑DH密钥交换算法的基础。

【关于生成元部分没看明白】

椭圆曲线 DH 密钥交换

DH密钥交换时利用【离散对数问题】的复杂度来实现密钥的安全交换的,如果将【离散对数问题】改为【椭圆曲线上的离散对数问题】,这样的算法就称为 椭圆曲线 Diffie-Hellman 密钥交换

椭圆曲线DH密钥交换在总体流程上是不变的,只是所利用的数学问题不同而已。

椭圆曲线DH密钥交换能够使用较短的密钥长度实现较高的安全性。

基于口令的密码

Password Based Encryption,PBE,根据口令生成密钥并用该密钥进行加密。加密和解密使用同一个密钥。

PBE加密

过程如下图所示:

image-20250429170438250

PBE加密包括下列3个步骤:

  1. 生成KEK

    用伪随机数生成器生成一个被称为 的随机数。将盐和Alice输入的口令一起输入单向散列函数,得到的散列值就是用来加密密钥的密钥(KEK)。

    加盐 是一种用于防御字典攻击的机制。

  2. 生成会话密钥并加密

    使用伪随机数生成器生成会话密钥。会话密钥是用来加密消息的密钥(CEK)。

    会话密钥需要用刚才步骤(1)中生成的KEK进行加密,并和盐一起保存在安全的地方。会话密钥加密后,KEK就会被抛弃,只要通过盐和口令就可以重建KEK。

  3. 加密消息

    最后,我们用步骤(2)中生成的会话密钥对消息进行加密。

PBE加密后所产生的输出包括下列三种:

【盐】和【用KEK加密的会话密钥】需要妥善保管。

PBE解密

解密过程如下图所示:

image-20250429171402228

PBE解密包括以下三个步骤:

  1. 重建KEK

    首先将之前保存的盐和口令一起输入单向散列函数,得到的散列值就是KEK。

  2. 解密会话密钥

    使用KEK解密【用KEK加密的会话密钥】得到会话密钥。

  3. 用会话密钥对加密的消息进行解密。

PBE加密过程中使用了两次伪随机数生成器,而解密过程一次也没用。

盐的作用

盐是由伪随机数生成器生成的随机数,在生成密钥(KEK)时会和口令一起被输入单向散列函数。

盐是用来预防字典攻击的

在生成KEK时加盐,盐的长度越大,候选KEK的数量也会随之增大,实现生成候选KEK就会变得非常困难。

口令的作用

便于记忆。

强度不如由伪随机数生成器生成的会话密钥,所以需要加盐、加密。

通过拉伸来改良PBE

在生成KEK时,通过多次使用单向散列函数就可以提高安全性。

对于用户来说,执行1000次散列函数并不会带来多大负担,与用户输入一次口令所花费的时间相比,可以忽略不计。

这种将单向散列函数进行多次迭代的方法称为 拉伸 (stretching)。

如何生成安全的口令