试图理解“哈希上下文”的含义

时间:2014-07-31 03:23:32

标签: hash

有人可以在这里解释“背景”的含义吗?

  

当数据经过哈希处理时,它会独立地给予每个哈希值      上下文。由于上下文已经以不同方式初始化,因此它们      将每个产生不同的哈希输出。**一旦密码是      哈希,连接多个哈希的输出数据,      最左边的第一个哈希,用于产生任何多余八位字节的密钥数据      在右边丢弃。

来源:http://tools.ietf.org/html/rfc4880#section-3.7.1.1

1 个答案:

答案 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];