有人可以在这里解释“背景”的含义吗?
当数据经过哈希处理时,它会独立地给予每个哈希值 上下文。由于上下文已经以不同方式初始化,因此它们 将每个产生不同的哈希输出。**一旦密码是 哈希,连接多个哈希的输出数据, 最左边的第一个哈希,用于产生任何多余八位字节的密钥数据 在右边丢弃。
答案 0 :(得分:1)
您可以在链接的同一文档的前一部分中看到它:
3.7.1.1。简单的S2K
这会直接散列字符串以生成关键数据。见下文 这个哈希是如何完成的。
Octet 0: 0x00
Octet 1: hash algorithm
简单S2K对密码进行哈希处理以生成会话密钥。该 完成此操作的方式取决于会话密钥的大小 (这取决于使用的密码)和散列的大小 算法的输出。如果散列大小大于会话密钥 size,哈希的高阶(最左边)八位字节用作 键。
所以说你在128位的会话密钥之后,但是哈希算法输出256位值,你只需要删除128个高位,并将它们用作会话密钥。 / p>
如果散列大小小于密钥大小,则为多个实例 创建哈希上下文 - 足以生成所需的密钥数据。 这些实例预先加载了0,1,2,...八位字节的零(即 也就是说,第一个实例没有预加载,第二个实例没有预加载 预加载1个八位组的零,第三个预加载两个 零的八位字节,等等。)
假设我们在512位会话密钥之后并且哈希算法输出128位值,我们创建4个哈希上下文,因为4个哈希输出将一起提供所需的512位。我们基本上将使用相同的哈希算法来生成四个值,但为了确保四个值正在添加一些值,我们以不同方式初始化/播种它们。在面向对象编程中,如果你想象哈希算法体现在一个类中,你就可以做类似这样的伪代码......
Hash my_hash(seed);
for (word in data)
my_hash.feed(word);
use my_hash.output();
...然后您可以将每个Hash
对象视为上下文,对于比哈希输出宽度更宽的会话密钥,您只需执行此类操作:
Hash my_hashes[4] = { seed1, seed2, seed3, seed4 };
for (word in data)
for (my_hash in my_hashes)
my_hash.feed(word);
512_bit_hash = my_hash[0] + my_hash[1] + my_hash[2] + my_hash[3];