生成密钥、配送密钥和更新密钥

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/82989409

一 生成密钥

1 用随机数生成密钥

生成密钥最好的方法就是使用随机数,因为密钥需要具备不易被他人推测的性质。在可能的情况下最好使用能够生成密码学上的随机数硬件设备,但一般我们都是使用伪随机数生成器这一专门为密码学用途设计的软件。

在生成密钥时,不能自己随便写出一些像“3F 23 53 34 E3...”这样的数字。因为尽管你想生成的是随机数字,但无论如何都无法避免人为的偏差,而这就成为了攻击者的目标。

尽管生成伪随机数的算法有很多种,但密码学用途的伪随机数生成器必须是专门针对密码学用途设计的。例如,有一些伪随机数生成器可以用于游戏和模拟算法,尽管这些伪随机数生成器所生成的数列看起来也是随机的,但只要不是专门为密码学用途设计的,就不能用来生成密钥,因为这些伪随机数生成器不具备不可预测性这一性质。

2 用口令生成密钥

有时我们也会使用人类可以记住的口令来生成密钥。

严格来说,我们很少直接用口令来作为密钥使用,一般都是将口令输入单向散列函数,然后将得到的散列值作为密钥使用。

在使用口令生成密钥时,为了防止字典攻击,需要在口令上附加一串称为盐的随机数,然后再将其输入单向散列函数。这种方法称为“基于口令的密码”。

二 配送密钥

在使用对称密码时,如何在发送者和接收者之间共享密钥是一个重要的问题(即密钥配送问题)。要解决密钥配送问题,可以采用事先共享密钥、使用密钥分配中心、使用公钥密码等方法。除上述方法之外,还有一种解决密钥配送问题的方法称为DH密钥交换。

三 更新密钥

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

在更新密钥时,发送者和接收者使用单向散列函数计算当前密钥的散列值,并将这个散列值用作新的密钥。简单说,就是用当前密钥的散列值作为下一个密钥。

进行密钥更新的好处:我们假设在通信过程中的某个时间点上,密钥被窃听者获取了,那么窃听者就可以用这个密钥将之后的通信内容全部解密。但是,窃听者却无法解密更新密钥这个时间点之前的通信内容,因为这需要用单向散列函数的输出(即当前密钥)反算出单向散列函数的输入(即上一个密钥)。由于单向散列函数具有单向性,因此就保证了这样的反算是非常困难的。

这种防止破译过去的通信内容的机制,称为后向安全。

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/82989409