MD5 算法 C 语言版
转 自 : 百 度 文 库
摘 要: 本文主要介绍了 MD5 算法 C 语言版。对 MD5 算法简要的叙述可以为:MD5 以
512 位分组来处理输入的信息,且每一分组又被划分为 16 个 32 位子分组,经过了一系列的处
理后,算法的输出由四个 32 位分组组成,将这四个 32 位分组级联后将生成一个 128 位散列
值
关键词: 哈希函数MD5 算法C 语言版
对 MD5算 法 简 要 的 叙 述 可 以 为 : MD5以 512位 分 组 来 处 理 输 入 的 信 息 , 且 每 一 分 组 又 被 划
分 为 16个 32位 子 分 组 , 经 过 了 一 系 列 的 处 理 后 , 算 法 的 输 出 由 四 个 32位 分 组 组 成 , 将 这 四 个
32位 分 组 级 联 后 将 生 成 一 个 128位 散 列 值 。
在 MD5算 法 中 , 首 先 需 要 对 信 息 进 行 填 充 , 使 其 位 长 对 512求 余 的 结 果 等 于 448。 因 此 , 信
息 的 位 长 ( Bits L ength] 将 被 扩 展 至 N*512+448, 即 N*64+56个 字 节 ( Bytes] , N为 一 个 正 整
数 。 填 充 的 方 法 如 下 , 在 信 息 的 后 面 填 充 一 个 1和 无 数 个 0, 直 到 满 足 上 面 的 条 件 时 才 停 止 用 0
对 信 息 的 填 充 。 然 后 , 在 在 这 个 结 果 后 面 附 加 一 个 以 64位 二 进 制 表 示 的 填 充 前 信 息 长 度 。 经 过
这 两 步 的 处 理 , 现 在 的 信 息 的 位 长 N*512+448+64(N+1)*512, 即 长 度 恰 好 是 512的 整 数 倍 。
这 样 做 的 原 因 是 为 满 足 后 面 处 理 中 对 信 息 长 度 的 要 求 。
M D5中 有 四 个 3 2位 被 称 作 链 接 变 量 ( C h a i ni n g Va r i a bl e] 的 整 数 参 数 , 他 们 分 别 为 :
A0x01234567, B0x89abcdef, C0xfedcba98, D0x76543210。
当 设 置 好 这 四 个 链 接 变 量 后 , 就 开 始 进 入 算 法 的 四 轮 循 环 运 算 。 循 环 的 次 数 是 信 息 中
512位 信 息 分 组 的 数 目 。
将 上 面 四 个 链 接 变 量 复 制 到 另 外 四 个 变 量 中 : A到 a, B到 b, C到 c, D到 d。
主 循 环 有 四 轮 ( MD4只 有 三 轮 ] , 每 轮 循 环 都 很 相 似 。 第 一 轮 进 行 16次 操 作 。 每 次 操 作
对 a、 b、 c和 d中 的 其 中 三 个 作 一 次 非 线 性 函 数 运 算 , 然 后 将 所 得 结 果 加 上 第 四 个 变 量 , 文 本 的
一 个 子 分 组 和 一 个 常 数 。 再 将 所 得 结 果 向 右 环 移 一 个 不 定 的 数 , 并 加 上 a、 b、 c或 d中 之 一 。 最
后 用 该 结 果 取 代 a、 b、 c或 d中 之 一 。
以 一 下 是 每 次 操 作 中 用 到 的 四 个 非 线 性 函 数 ( 每 轮 一 个 ] 。
F(X,Y,Z) (X&Y)|((~X)&Z)
G(X,Y,Z) (X&Z)|(Y&(~Z))
H(X,Y,Z) X^Y^Z
I(X,Y,Z)Y^(X|(~Z))
( &是 与 , |是 或 , ~是 非 , ^是 异 或 ]
这 四 个 函 数 的 说 明 : 如 果 X、 Y和 Z的 对 应 位 是 独 立 和 均 匀 的 , 那 么 结 果 的 每 一 位 也 应 是
独 立 和 均 匀 的 。
F是 一 个 逐 位 运 算 的 函 数 。 即 , 如 果 X, 那 么 Y, 否 则 Z。 函 数 H是 逐 位 奇 偶 操 作 符 。
假 设 Mj表 示 消 息 的 第 j个 子 分 组 ( 从 0到 15] , <<
FF(a, b, c, d, Mj, s, ti)表 示 a b + ((a + F(b, c, d) + Mj + ti) << s)
1 / 9
MD5 算法 C 语言版