SHA-256 的纯 Rust 实现
出于了解 SHA-256 算法及学习 Rust 的目的,用纯 Rust 实现了一个 SHA-256 库。
SHA-256 算法简介
首先简单介绍一下 SHA-256 算法,SHA-256 是 SHA-2 系列算法中的一种,关于 SHA-2 的相关介绍可以查看其维基百科,其中也详细介绍了 SHA-256 的算法。
简单的说, SHA-256 算法分为以下几步:
- 对消息进行填充预处理,先附加 bit 1,然后填充可变数量(0-511)的 bit 0,最后附加
u64
(big-endian, 64 bits)类型的原始消息长度的 bit 数,使填充后的消息长度为 512 bits 即 64 bytes)的整数倍 - 对预处理后的消息进行分片,每 512 bits 为一个分片
- 对每个分片进行迭代处理,每次迭代以该分片及 8 个
u32
为输入,并输出 8 个u32
作为下一个迭代的输入 - 最后一个分片处理完成输出的 8 个
u32
既是最后的结果
要用到的两组常量
其中第 3 步对各个分片的迭代处理又要用到两组常量:
一是对第一个分片进行处理时作为输入的 8 个初始的 u32
:
const H: [u32; 8] = [
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
];
它们是自然数中前 8 个质数 2、3、5、7、11、13、17、19 平方根的小数部分取前 32 bits。