`
enefry
  • 浏览: 36597 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

DES 加密解密 ( C语言实现 )

阅读更多



 Des算法介绍: http://zh.wikipedia.org/wiki/DES

维基百科中des算法的介绍很详细了.

 

 

1轮的 des 采用 56 位有效的密钥(密钥本来是64位,其中第8,16,24,32,40,48,56,64位不影响结果) 对 64 位(8字节) 数据 进行加密, 加密解密算法是统一算法(过程一样,使用密钥次序不同)。

 

算法过程:

概述:

通过图比较容易 理解

 

 

① 算法开始对 输入数据进行初始的位置换 , IBM 已经给出置换表(下面大量置换都是查表置换 )置换之后得到初始数据。

{

置换表:

  char table_IP[]    /* 初始置换表 IP */
   = { 
    58, 50, 42, 34, 26, 18, 10,  2, 60, 52, 44, 36, 28, 20, 12,  4,
    62, 54, 46, 38, 30, 22, 14,  6, 64, 56, 48, 40, 32, 24, 16,  8,
    57, 49, 41, 33, 25, 17,  9,  1, 59, 51, 43, 35, 27, 19, 11,  3, 
    61, 53, 45, 37, 29, 21, 13,  5, 63, 55, 47, 39, 31, 23, 15,  7 
   };

   所以现在查表一位一位置换,比如 :

   原始数据存在 data1-data64 这 64 位中,置换后数据存在 to1 - to64 中:

   则有: to1 = data58, to2 = data50, to42 = data42 ... to64 = data7 .

   这样就可以得到新数据。

 

}//第一步结束

              

 

② 初始置换后将进行 16 轮的加密过程(16 轮是一样的)<这个过程中初始数据先被分成左右两部分 各 32位 >

  {

   2.1  对右边部分进行扩展置换 (通过查表,将32位数据变换为 48 位)

     过程如:

 char table_E[]
 = {
          32,  1,  2,  3,  4,  5,  4,  5,  6,  7,  8,  9,
          8,  9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
          16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,
          24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32,  1  
    };

    原始数据存在 data1-data32 这 32 位中,置换后数据存在 to1 - to48 中:

     则有: to1 = data32,   to2 = data1,   to42 = data2  ... to64 = data1 .

    其实其中就是重复去了一些值,将32位扩展到48位。

 

 

   2.2 现在得到 48 位扩展数据,将它和这一轮的密钥进行异或运算  得到还是48位的数据  (密钥怎么得到 ?得到什么样的密钥 ?后面再说)

  

 

   2.3 这里是一个很精妙的 S 盒置换 , IBM 提供了8张表,将48位的数据压缩为 32 位

   { // 这里 也是采用分组的方法 ! 48位分成 8组,每组 6 位压缩后这个分组是 4 位 过程如下:

     ( S表很大,这里不写出来 ,源码中有 : char table_S[8][64] )

    

     从与密钥异或后的数据中中 取出 一个分组  

       比如 第 i  = 1 个分组 为: 1 0 1 0 1 0    则 我们先选择 S盒中的 第 1 张表 《 S盒的表选择 》

      

        然后再从 第 i 张表中取出 置换值

       {

          这个分组中的 第1位和第6为决定所在行 10 则是 第 2 行  (行是:0,1,2,3 行)

          这个分组中的 第2-5位决定所在列  0101 这是     第 5 列  (列是:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 列)

          则我们可以 从 表 1 选出 第 2 行,第 5 列 的值,是 6

        }

 

        6 的二进制值为:0110 这个值就是我们置换后的值 !       

    

      

   }//  S盒 结束

  

   2.4 P-盒置换 , 对S盒产生的 32位数据进行置换。( 和前面的置换是一样的,只是表不同)

  

   2.5 将 P 盒置换出来的数据与 左半部分进行置换 。

  

   2.6 将2.5产生的数据放置到左边数据块中。

 

   2.7 将左右两部分进行交换。  

 

  }//第二步  结束循环 

 

 

③ 末置换 ,置换方法和前面的置换方法一样。

 

 

/// 第二步详细图

 



 

 

 

 

 

每一轮用于异或密钥产生方法:

 

 

 

 

密钥处理只有 3 步 :

 

① 初始置换(有且只有 1 次)《这里是64位进行置换》

 

② 分成左右两部分进行循环移位

 {

    循环只在 有效位中进行循环移位《关键是 :两部分,有效位》       

 }

 

③ 从 56 有效位 中提取 48 位 《 这里的细节是 56 位 !从置换表中可以开出 》

 

 

 

实现算法:

 

代码用了大量位运算 :

 

关键 一个是取指定位的值 比如 从 data【0】开始取第 37 位 : ( 37 = 0010 0101 ) (从 0 位开始)

/// 解释   这里的位顺序可能比较奇怪 :  一个字节 是 8  位 比如 1000  1100  这里 第 0 位 是 1000 中的 1 ,

/// 第 1 位是 1000 中的红色字,以此类推

 

第 37 为则是 : data[4]  中的 5 位 

所以可以这样计算    ( data[ k>>3 ]  >> ( 7 - ( k & 0x07 ) ) )&0x01  ;

 

其中: data[ k>>3 ]  得到第 n 个数, ( 7- (  k & 0x07 )) 得到第 m位 ,将这一位移到最低位 和 0x01与就可以得到这个位的值。

 

 

 

 

实现算法中的 函数 和 上图对应

 

---------------------------------------  密钥  ------------------------------------------------------

//密钥置换
void fun_InitReplacementKey

 

//对密钥进行移位,并存在接下来下面的字节中
void fun_MoveKey

 

 

//对密钥进行压缩置换并保存到指定位置
void fun_ReplacementCompressKey

 

----------------------------------------- 过程函数 -------------------------------------------------

 

//初始置换 ip
void fun_initReplacement

 

//扩展置换
void fun_expandReplacement_32To48

 

//加 密钥 异或
void fun_xor_48

 


// s盒置换
void fun_S_Replacement

 

//P盒置换
void fun_P_Replacement

 

//左右域异或
void fun_xor_32

 

 

 

 

//末置换 fp
void fun_finalReplacement

 

 

------------------------------------------------------------------------------------------------------

 

最后还有几个函数:

 

//设置 密码

void setKey

 

 

//des 加密
char* des

 


// 解密
char * dedes

 

 

 

日志输出控制 宏:

 

//打印过程中 <数据日志>
//#define __LOGDATA__

 

 

//打印过程中 <Debug日志>
//#define __DEBUG__

 

 

//打印过程中<每一轮结果的日志>
//#define __LOG__

 

 

//打印 <结果日志>
//#define __LOGRESULT__

 

 

//打印 <密钥日志>
//#define __LOGKEY__

 

 

具体实现过程在 附件中:

采用c语言在 vs2010 中 编译运行通过

 

 

 

 

  • 大小: 35.9 KB
  • 大小: 26.9 KB
  • 大小: 15.8 KB
0
0
分享到:
评论

相关推荐

    DES加密解密 c语言实现

    在C语言中实现DES加密解密,需要理解并编码DES的核心步骤,这些步骤包括初始置换(IP)、扩展置换(E-Box)、轮函数(Feistel Function)、逆初始置换(IP^-1)等。 1. **初始置换(IP)**:这是DES的第一步,将64...

    C语言实现DES加密解密算法

    DES加密解密算法的C语言实现 DES(Data Encryption Standard)是一种对称密钥 BLOCK 加密算法,使用 56 位密钥对 64 位数据块进行加密。下面是 DES 加密解密算法的 C 语言实现的知识点总结。 字节与二进制转换 在...

    3DES加密算法C语言实现

    - `3des.c`:C语言实现的3DES加密算法源代码。 - `3des.h`:头文件,包含函数声明和必要的宏定义。 - `jni_interface.c`:JNI接口文件,用于Android平台的调用。 - `Android.mk` 或 `CMakeLists.txt`:构建文件,...

    DES加密解密算法的C语言实现

    DES 加密解密算法的 C 语言实现 本文档介绍了 DES 加密解密算法的 C 语言实现,提供了完整的源代码,能够加密字符串或者文件,已经通过测试使用。DES 加密算法是一种对称加密算法,既可用于加密又可用于解密。 一...

    DES加密解密算法 C语言源代码

    这篇C语言源代码实现了DES加密解密算法,特别适合于资源有限的环境,如STM32或51单片机。STM32系列是基于ARM Cortex-M内核的微控制器,而51单片机则是早期广泛应用的8位微处理器。在这些平台上,由于内存(RAM)资源...

    DES_3DES加解密算法C语言实现

    用C语言实现了DES、三重DES(3DES)的加解密,支持ECB、CBC模式。 ECB支持64位密钥; CBC支持128和192位密钥

    DES加密算法—实现(C语言)

    5. **C语言实现**:在C语言中,你需要创建结构体来存储原始数据、密钥和中间结果,定义相应的函数来执行初始置换、子密钥生成、Feistel网络的每一轮操作以及逆初始置换。注意,由于C语言没有内置的大整数类型,处理...

    3des加密的C语言算法

    3des加密算法的C语言实现,很好很实用

    DES加解密C语言版

    DES加解密的C语言实现,并且以txt文档的形式输出所有加解密过程,方便查看

    Des加密解密算法(C语言互通)

    Android Des加密解密算法

    3des加密算法C语言实现

    C语言实现时,需要注意以下几点: - **内存管理**:确保正确分配和释放内存,避免内存泄漏。 - **安全性**:处理密钥和敏感数据时,要确保其安全,例如,不要明文存储密钥。 - **性能优化**:虽然3DES相对较慢,但...

    des加密解密算法 c语言实现

    在提供的压缩包文件中,"复件 DES"可能是一个源代码文件,包含了C语言实现的DES算法。"libei"可能是一个库文件或头文件,包含了支持DES算法所需的一些辅助函数或数据结构。这些文件提供了完整的加密和解密功能,你...

    C语言实现Des加解密

    ### C语言实现DES加解密 #### DES简介 DES(Data Encryption Standard,数据加密标准)是一种对称密钥算法,用于加密和解密数据。它最初由IBM开发,并于1977年被美国国家标准局采纳为官方标准。DES算法采用64位块...

    DES加密解密算法(可加解密中文字符)(C语言实现)

    纠正了过去下载DES源码中加解密中文字符错误的代码,使用VS2010编译测试通过。

    DES加密算法C语言代码实现

    希望大家能够将这两个名词区别开来,很多时候我们说的DES都是在指DES算法,而不是DES数据加密标准。DES算法是一种典型的分组密码,即将固定长度的明文通过一系列复杂的操作变成同样长度密文的算法。

    C语言实现DES算法DES加密算法实验报告.doc

    C语言实现DES算法DES加密算法实验报告.doc

    c语言实现记事本文件的 DES加密 解密 工程项目

    c语言实现记事本文件的 DES加密 解密 工程项目

    DES.rar_C语言 Des算法_DES 加密_DES加密_c语言实现的加密解密_des.

    利用C语言程序实现DES加密算法的加密解密功能。能够实现56位或56*n密钥的des算法,可以通过该程序提供的接口进行数据的加密,保证数据在传送过程的安全性

    DES加密解密算法(C语言实现)

    C语言实现的DES算法可以提供一个底层的、高效的加密解密解决方案。 在C语言实现DES算法时,首先要理解DES的基本工作原理。DES使用64位的块大小进行操作,但其中包含8位的奇偶校验位,实际用于加密的有效数据只有56...

Global site tag (gtag.js) - Google Analytics