wr-web / des-algorithm

C 语言实现 DES 算法

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

DES 算法的程序设计和C语言实现

算法原理概述

  • DES 是一种典型的块加密方法:它以64位为分组长度,64位一组的明文作为算法的输入,通过一系列复杂的操作,输出同样64位长度的密文。
  • DES 使用加密密钥定义变换过程,因此算法认为只有持有加密所用的密钥的用户才能解密密文。
  • DES 采用64位密钥,但由于每8位中的最后1位用于奇偶校验,实际有效密钥长度为56位。密钥可以是任意的56位的数,且可随时改变。其中极少量的数被认为是弱密钥,但能容易地避开它们。所有的保密性依赖于密钥。
  • DES 算法的基本过程是换位和置换

总体结构

输入64位 -> 初始置换IP -> 16轮迭代T -> 交换置换W -> 逆置换IP_1 -> 输出64位

模块分解

初始置换 IP(initial permutation)

工具:IP 置换表 操作:置换(将输入的 64 位明文进行重排,即将第 58 位放到第 1 位,第 50 位放到第 2 位……以此类推。) 结果:64 位明文 -> 64 位

16轮迭代T + 交换置换W

  1. 子密钥生成:根据给定的 64 位密钥 K,生成 16 个 48 位的子密钥 K1 - K16,供 Feistel 轮函数调用
  2. Feistel 轮函数:产生 32 位输出,用于在每次迭代中产生下一个 R(64 位的右半部分)
  3. 交换置换 W:迭代时要将 64 位分割成左半部分 L 和右半部分 R,迭代结束时顺便进行左右交换

逆置换IP_1

工具:IP_1 置换表 操作:置换(将 64 输入进行重排,即将第 40 位放到第 1 位,第 8 位放到第 2 位……以此类推。) 结果:64位 -> 64位密文

数据结构

  1. 获取明文或密钥:使用 char 数组来读取 8 个字符的串,由于每个字符为 1 个字节,即 8 位,就可以得到 64 位的明文或密钥
  2. 位操作:使用 bool 数组来存储 64 位,数组的每个元素即为 1 个位,值为 0 或 1

编译运行结果

1)加密后,输入正确的密钥,解密成功

2)加密后,输入错误的密钥,解密失败,得到错误的明文

About

C 语言实现 DES 算法


Languages

Language:C 57.1%Language:Objective-C 38.6%Language:C++ 4.3%