#digest #hash #hash-values

no-std fdh

Full Domain Hash (FDH) 用于将哈希摘要的长度扩展到任意长度

13个版本 (7个不兼容)

0.8.1 2021年1月31日
0.8.0 2020年11月24日
0.7.3 2020年8月23日
0.7.2 2020年6月21日
0.5.1 2019年3月24日

#15#hash-values

Download history 115/week @ 2024-03-15 200/week @ 2024-03-22 123/week @ 2024-03-29 91/week @ 2024-04-05 85/week @ 2024-04-12 77/week @ 2024-04-19 98/week @ 2024-04-26 88/week @ 2024-05-03 88/week @ 2024-05-10 99/week @ 2024-05-17 86/week @ 2024-05-24 72/week @ 2024-05-31 50/week @ 2024-06-07 67/week @ 2024-06-14 61/week @ 2024-06-21 30/week @ 2024-06-28

每月下载 222
7 个crate中使用(通过 rsa-fdh

MIT/Apache

235KB
508

Full Domain Hash

checks codecov docs patreon flattr

Full Domain Hash (FDH) 是一种有用的密码学结构,它限制了哈希函数摘要的域(例如确保RSA中的摘要小于模数 n)。其次,它还可以用于将哈希摘要的长度扩展到任意长度,将常规哈希函数转换为XOF哈希函数。

我们通过计算多个循环来构造FDH

循环=(目标长度)/(摘要长度) + 1

然后我们计算

FDH(M) = HASH(M||0) || HASH(M||1) || ... || HASH(M||cycles−1)

其中 HASH 是任何哈希函数,M 是消息,|| 表示连接,数值是单字节 u8

FDH通常与RSA签名方案一起使用,其中目标长度是密钥的大小,域小于模数 n。参见 https://en.wikipedia.org/wiki/Full_Domain_Hash

此crate广泛使用digest crate的密码学哈希特征,因此大多数有用方法都作为digest特征的一部分实现。这些特征为了方便起见被重新导出。有关兼容哈希的列表,请参阅https://github.com/RustCrypto/hashes

应注意,FDH与消息无关。虽然FDH的变量时间性质不能用于恢复消息(除非在病理情况下),但它可以用于从消息的所有可能值集中消除某些值。

示例

  use sha2::Sha256;
  use fdh::{FullDomainHash, VariableOutput, Input};

  // Expand SHA256 from 256 bits to 1024 bits.
  let output_bits = 1024;
  let output_bytes = 1024 / 8;
  let mut hasher = FullDomainHash::<Sha256>::new(output_bytes)?;
  hasher.input(b"ATTACK AT DAWN");
  let result = hasher.vec_result();

no_std

此crate也支持no_std,因此可以在无分配的嵌入式或其他环境中使用。

#![no_std]
use sha2::Sha256;
use fdh::{FullDomainHash, Input, ExtendableOutput, XofReader};

// Expand SHA256 from 256 bits to 512 bits (and beyond!), reading it in 16 byte chunks.
let mut hasher = FullDomainHash::<Sha256>::default();
hasher.input(b"ATTACK AT DAWN");
let mut reader = hasher.xof_result();
let mut read_buf = <[u8; 16]>::default();

// Read the first 16 bytes into read_buf
reader.read(&mut read_buf);

// Read the second 16 bytes into read_buf
reader.read(&mut read_buf);

// If we want, we can just keep going, reading as many bits as we want indefinitely.
reader.read(&mut read_buf);
reader.read(&mut read_buf);

受限域

此crate还支持获取特定域内的摘要。它遵循以下算法

fn digest_in_domain(message, iv):
    digest = fdh(message, iv)
    while not in_domain(digest):
        iv++
        digest = fdh(message, iv)
    return digest, iv

提供了方法 results_in_domain() 来实现这一功能。提供了辅助方法 results_between()results_lt()results_gt() 用于常见情况,即摘要必须在某个范围内。

一个生成奇数摘要的示例

use sha2::Sha512;
use fdh::{FullDomainHash, Input, VariableOutput};
use num_bigint::BigUint;
use num_integer::Integer;

// Get a full domain hash that is odd
let mut hasher = FullDomainHash::<Sha512>::new(64).unwrap();
hasher.input(b"ATTACKATDAWN");

fn digest_is_odd(digest: &[u8]) -> bool {
    BigUint::from_bytes_be(digest).is_odd()
}
let iv = 0;

let (digest, iv) = hasher.results_in_domain(iv, digest_is_odd).unwrap();

贡献者

  1. Patrick Hayes (linkedin) (github) - 可雇佣。

依赖项

~320–760KB
~17K SLoC