DES 算 法 及 其 在 VC++6.0 下 的 实 现 (上 ) 上 摘要: 本 文 介 绍 了 一 种 国 际 上 通 用 的 加 密 算 法 —DES 算 法 的 原 理 , 并 给 出 了 在 VC++6.0 语 言 环 境 下 实 现 的 源 代 码 。 最 后 给 出 一 个 示 例 , 以 供 参 考 。 关 键 字 : DES 算 法 、 明 文 、 密 文 、 密 钥 、 VC; 本文程序运行效果图如下:
正文: 当今社会是信息化的社会。为了适应社会对计算机数据安全保密越来越 高 的 要 求 ,美 国 国 家 标 准 局 (NBS)于 1997 年 公 布 了 一 个 由 IBM 公 司 研 制 的一种加密算法,并且确定为非机要部门使用的数据加密标准,简称 DES(Data Encrypton Standard)。 自 公 布 之 日 起 , DES 算 法 作 为 国 际 上 商用保密通信和
计算机通信的最
常用算法,一直活跃在国际保密通信的 舞 台 上 , 扮 演 了 十 分 突 出 的 角 色 。 现 将 DES 算 法 简 单 介 绍 一 下 , 并 给 出 实 现 DES 算 法 的 VC 源 代 码 。 DES 算 法 由 加 密 、 解 密 和 子 密 钥 的 生 成 三 部 分 组 成 。 一.加密 DES 算 法 处 理 的 数 据 对 象 是 一 组 64 比 特 的 明 文 串 。 设 该 明 文 串 为
m=m1m2…m64 (mi=0 或 1)。 明 文 串 经 过 64 比 特 的 密 钥 K 来 加 密 , 最 后 生 成 长 度 为 64 比 特 的 密 文 E。 其 加 密 过 程 图 示 如 下 :
DES 算 法 加 密 过 程 对 DES 算 法 加 密 过 程 图 示 的 说 明 如 下 : 待 加 密 的 64 比 特 明 文 串 m, 经 过 IP 置 换 后 , 得 到 的 比 特 串 的 下 标 列 表 如 下 : 58 60 62 IP 64 57 59 61 63 50 52 54 56 49 51 53 55 42 44 46 48 41 43 45 47 34 36 38 40 33 35 37 39 26 28 30 32 25 27 29 31 18 20 22 24 17 19 21 23 10 12 14 16 9 11 13 15 2 4 6 8 1 3 5 7
该 比 特 串 被 分 为 32 位 的 L0 和 32 位 的 R0 两 部 分 。 子 密 钥 K1(子 密 钥 R0 的 生 成 将 在 后 面 讲 )经 过 变 换 f(R0,K1)( f 变 换 将 在 下 面 讲 )输 出 32 位 的 比 特 串 f1,f1 与 L0 做 不 进 位 的 二 进 制 加 法 运 算 。 运 算 规 则 为 :
f1 与 L0 做 不 进 位 的 二 进 制 加 法 运 算 后 的 结 果 赋 给 R1,R0 则 原 封 不 动 的 赋 给 L1。 L1 与 R0 又 做 与 以 上 完 全 相 同 的 运 算 , 生 成 L2, R2…… 一 共 经 过 16 次 运 算 。 最 后 生 成 R16 和 L16。 其 中 R16 为 L15 与 f(R15,K16) 做 不 进 位 二 进 制 加 法 运 算 的 结 果 , L16 是 R15 的 直 接 赋 值 。 R16 与 L16 合 并 成 64 位 的 比 特 串 。 值 得 注 意 的 是 R16 一 定 要 排 在 L16 前 面 。R16 与 L16 合 并 后 成 的 比 特 串 ,经 过 置 换 IP-1 后 所 得 比 特 串 的 下 标列表如下: 40 IP-1 39 38 8 7 6 48 47 46 16 15 14 56 55 54 24 23 22 64 63 62 32 31 30
37 36 35 34 33
5 4 3 2 1
45 44 43 42 41
13 12 11 10 9
53 52 51 50 49
21 20 19 18 17
61 60 59 58 57
29 28 27 26 25
经 过 置 换 IP-1 后 生 成 的 比 特 串 就 是 密 文 e.。 下 面 再 讲 一 下 变 换 f(Ri-1,Ki)。 它 的 功 能 是 将 32 比 特 的 输 入 再 转 化 为 32 比 特 的 输 出 。 过 程 如 图 所 示 : 其
对 f 变 换 说 明 如 下 : 输 入 Ri-1(32 比 特 )经 过 变 换 E 后 , 膨 胀 为 48 比 特 。 膨胀后的比特串的下标
列表如下: 32 4 E: 8 12 16 1 5 9 13 17 2 6 10 14 18 3 7 11 15 19 4 8 12 16 20 5 9 13 17 21
20 24 28
21 25 29
22 26 30
23 27 31
24 28 32
25 29 31
膨胀后的比特串分为 8 组,每组 6 比特。各组经过各自的 S 盒后,又变 为 4 比 特 (具 体 过 程 见 后 ), 合 并 后 又 成 为 32 比 特 。 该 32 比 特 经 过 P 变 换后,其下标列表如下: 16 29 1 P: 5 2 32 19 22 7 12 15 18 8 27 13 11 20 28 23 31 24 3 30 4 21 17 26 10 14 9 6 25
经 过 P 变 换 后 输 出 的 比 特 串 才 是 32 比 特 的 f (Ri-1,Ki)。 下面再讲一下 S 盒的变换过程。任取一 S 盒。见图:
在 其 输 入 b1,b2,b3,b4,b5,b6 中 , 计 算 出 x=b1*2+b6, y=b5+b4*2+b3*4+b2*8, 从 Si 表 中 查 出 x 行 , 列 的 值 Sxy。 Sxy 再 y 将 化 为 二 进 制 , 即 得 Si 盒 的 输 出 。 ( S 表 如 图 所 示 )
至 此 , DES 算 法 加 密 原 理 讲 完 了 。 在 VC++6.0 下 的 程 序 源 代 码 为 : for(i=1;i<=64;i++) m1[i]=m[ip[i-1]];//64 位 明 文 串 输 入 , 经 过 IP 置 换 。 下面进行迭代。由于各次迭代的方法相同只是输入输出不同,因此只给 出其中一次。以第八次为例: //进 行 第 八 次 迭 代 。 首 先 进 行 S 盒 的 运 算 , 输 入 32 位 比 特 串 。 for(i=1;i<=48;i++)//经 过 E 变 换 扩 充 , 由 32 位 变 为 48 位 RE1[i]=R7[E[i-1]]; for(i=1;i<=48;i++)//与 K8 按 位 作 不 进 位 加 法 运 算 RE1[i]=RE1[i]+K8[i]; for(i=1;i<=48;i++) { if(RE1[i]==2) RE1[i]=0; } for(i=1;i<7