爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      DES密码算法实现(C语言)

      首页 知识中心 软件开发 文章详情页

      DES密码算法实现(C语言)

      2024-07-30 09:33:19 阅读次数:35

      C语言,编程开发

      算法介绍

      DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国公司研制的对称密码体制加密算法。 明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方。

      实现代码

      DES密码算法用C语言实现如下:

      //头文件、宏定义
      #include "stdio.h"  
      #include "memory.h"  
      #include "time.h"  
      #include "stdlib.h"  
      
      #define PLAIN_FILE_OPEN_ERROR -1   
      #define KEY_FILE_OPEN_ERROR -2  
      #define CIPHER_FILE_OPEN_ERROR -3  
      #define OK 1  
          
      //使用typedef定义基本数据
      typedef char ElemType; 
      
      //初始置换表IP  
      int IP_Table[64] = {  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,  
      56,48,40,32,24,16,8,0,  
      58,50,42,34,26,18,10,2,  
      60,52,44,36,28,20,12,4,  
      62,54,46,38,30,22,14,6};
         
      //逆初始置换表IP^-1  
      int IP_1_Table[64] = {39,7,47,15,55,23,63,31,  
      38,6,46,14,54,22,62,30,  
      37,5,45,13,53,21,61,29,  
      36,4,44,12,52,20,60,28,  
      35,3,43,11,51,19,59,27,  
      34,2,42,10,50,18,58,26,  
      33,1,41,9,49,17,57,25,  
      32,0,40,8,48,16,56,24};  
      
      //扩充置换表E  
      int E_Table[48] = {31, 0, 1, 2, 3, 4,  
      3,  4, 5, 6, 7, 8,  
      7,  8,9,10,11,12,  
      11,12,13,14,15,16,  
      15,16,17,18,19,20,  
      19,20,21,22,23,24,  
      23,24,25,26,27,28,  
      27,28,29,30,31, 0};  
      
      //置换函数P  
      int P_Table[32] = {15,6,19,20,28,11,27,16,  
      0,14,22,25,4,17,30,9,  
      1,7,23,13,31,26,2,8,  
      18,12,29,5,21,10,3,24};  
      
      //S盒  
      int S[8][4][16] =//S1  
      {{{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},  
      {0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},  
      {4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},  
      {15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}},  
      //S2  
      {{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},  
      {3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},  
      {0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},  
      {13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}},  
      //S3  
      {{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8},  
      {13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1},  
      {13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7},  
      {1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}},  
      //S4  
      {{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},  
      {13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9},  
      {10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4},  
      {3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}},  
      //S5  
      {{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9},  
      {14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6},  
      {4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14},  
      {11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}},  
      //S6  
      {{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11},  
      {10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8},  
      {9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6},  
      {4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}},  
      //S7  
      {{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1},  
      {13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6},  
      {1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2},  
      {6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}},  
      //S8  
      {{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7},  
      {1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2},  
      {7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8},  
      {2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}}};  
      //置换选择PC-1  
      int PC_1[56] = {56,48,40,32,24,16,8,  
      0,57,49,41,33,25,17,  
      9,1,58,50,42,34,26,  
      18,10,2,59,51,43,35,  
      62,54,46,38,30,22,14,  
      6,61,53,45,37,29,21,  
      13,5,60,52,44,36,28,  
      20,12,4,27,19,11,3};  
      
      //置换选择PC-2  
      int PC_2[48] = {13,16,10,23,0,4,2,27,  
      14,5,20,9,22,18,11,3,  
      25,7,15,6,26,19,12,1,  
      40,51,30,36,46,54,29,39,  
      50,44,32,46,43,48,38,55,  
      33,52,45,41,49,35,28,31};  
      
      //对左移次数的规定  
      int MOVE_TIMES[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};  
      
      //模块化操作:对功能函数进行声明
      int ByteToBit(ElemType ch,ElemType bit[8]);                     //字节转换成二进制  
      int BitToByte(ElemType bit[8],ElemType *ch);					//二进制转换成字节  
      int Char8ToBit64(ElemType ch[8],ElemType bit[64]);			    //将长度为8的字符串转为二进制位串 
      int Bit64ToChar8(ElemType bit[64],ElemType ch[8]);				//将二进制位串转为长度为8的字符串 
      int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]); //生成子密钥  
      int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]);  //密钥置换1 
      int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]);  //密钥置换2  
      int DES_ROL(ElemType data[56], int time);						//循环左移  
      int DES_IP_Transform(ElemType data[64]);						//IP置换  
      int DES_IP_1_Transform(ElemType data[64]);						//IP逆置换  
      int DES_E_Transform(ElemType data[48]);							//扩展置换  
      int DES_P_Transform(ElemType data[32]);							//P置换 
      int DES_SBOX(ElemType data[48]);								//异或 
      int DES_XOR(ElemType R[48], ElemType L[48],int count);			//S盒置换  
      int DES_Swap(ElemType left[32],ElemType right[32]);				//交换 
      int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]);  //加密单个分组    
      int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48], ElemType plainBlock[8]);  //解密单个分组 
      int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile);  //加密文件 
      int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile);  //解密文件 
      
      //字节转换成二进制  
      int ByteToBit(ElemType ch, ElemType bit[8]){  
          int cnt;  
          for(cnt = 0;cnt < 8; cnt++){  
              *(bit+cnt) = (ch>>cnt)&1;  
          }  
          return 0;  
      }  
        
      //二进制转换成字节  
      int BitToByte(ElemType bit[8],ElemType *ch){  
          int cnt;  
          for(cnt = 0;cnt < 8; cnt++){  
              *ch |= *(bit + cnt)<<cnt;  
          }  
          return 0;  
      }  
        
      //将长度为8的字符串转为二进制位串  
      int Char8ToBit64(ElemType ch[8],ElemType bit[64]){  
          int cnt;  
          for(cnt = 0; cnt < 8; cnt++){          
              ByteToBit(*(ch+cnt),bit+(cnt<<3));  
          } 
          return 0;  
      }  
        
      //将二进制位串转为长度为8的字符串  
      int Bit64ToChar8(ElemType bit[64],ElemType ch[8]){  
          int cnt;  
          memset(ch,0,8);  
          for(cnt = 0; cnt < 8; cnt++){  
              BitToByte(bit+(cnt<<3),ch+cnt);  
          }  
          return 0;  
      }  
        
      //生成子密钥  
      int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]){  
          ElemType temp[56];  
          int cnt;  
          DES_PC1_Transform(key,temp);//PC1置换  
          for(cnt = 0; cnt < 16; cnt++){//16轮跌代,产生16个子密钥  
              DES_ROL(temp,MOVE_TIMES[cnt]);//循环左移  
              DES_PC2_Transform(temp,subKeys[cnt]);//PC2置换,产生子密钥  
          }  
          return 0;  
      }  
        
      //密钥置换PC_1  
      int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]){  
          int cnt;      
          for(cnt = 0; cnt < 56; cnt++){  
              tempbts[cnt] = key[PC_1[cnt]];  
          }  
          return 0;  
      }  
        
      //密钥置换PC_2  
      int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]){  
          int cnt;  
          for(cnt = 0; cnt < 48; cnt++){  
              tempbts[cnt] = key[PC_2[cnt]];  
          }  
          return 0;  
      }  
        
      //循环左移  
      int DES_ROL(ElemType data[56], int time){     
          ElemType temp[56];  
        
          //保存将要循环移动到右边的位  
          memcpy(temp,data,time);  
          memcpy(temp+time,data+28,time);  
            
          //前28位移动  
          memcpy(data,data+time,28-time);  
          memcpy(data+28-time,temp,time);  
        
          //后28位移动  
          memcpy(data+28,data+28+time,28-time);  
          memcpy(data+56-time,temp+time,time);      
        
          return 0;  
      }  
        
      //IP置换  
      int DES_IP_Transform(ElemType data[64]){  
          int cnt;  
          ElemType temp[64];  
          for(cnt = 0; cnt < 64; cnt++){  
              temp[cnt] = data[IP_Table[cnt]];  
          }  
          memcpy(data,temp,64);  
          return 0;  
      }  
        
      //IP逆置换  
      int DES_IP_1_Transform(ElemType data[64]){  
          int cnt;  
          ElemType temp[64];  
          for(cnt = 0; cnt < 64; cnt++){  
              temp[cnt] = data[IP_1_Table[cnt]];  
          }  
          memcpy(data,temp,64);  
          return 0;  
      }  
        
      //扩展置换  
      int DES_E_Transform(ElemType data[48]){  
          int cnt;  
          ElemType temp[48];  
          for(cnt = 0; cnt < 48; cnt++){  
              temp[cnt] = data[E_Table[cnt]];  
          }     
          memcpy(data,temp,48);  
          return 0;  
      }  
        
      //P置换  
      int DES_P_Transform(ElemType data[32]){  
          int cnt;  
          ElemType temp[32];  
          for(cnt = 0; cnt < 32; cnt++){  
              temp[cnt] = data[P_Table[cnt]];  
          }     
          memcpy(data,temp,32);  
          return 0;  
      }  
        
      //异或  
      int DES_XOR(ElemType R[48], ElemType L[48] ,int count){  
          int cnt;  
          for(cnt = 0; cnt < count; cnt++){  
              R[cnt] ^= L[cnt];  
          }  
          return 0;  
      }  
        
      //S盒置换  
      int DES_SBOX(ElemType data[48]){  
          int cnt;  
          int line,row,output;  
          int cur1,cur2;  
          for(cnt = 0; cnt < 8; cnt++){  
              cur1 = cnt*6;  
              cur2 = cnt<<2;  
                
              //计算在S盒中的行与列  
              line = (data[cur1]<<1) + data[cur1+5];  
              row = (data[cur1+1]<<3) + (data[cur1+2]<<2)  
                  + (data[cur1+3]<<1) + data[cur1+4];  
              output = S[cnt][line][row];  
        
              //化为2进制  
              data[cur2] = (output&0X08)>>3;  
              data[cur2+1] = (output&0X04)>>2;  
              data[cur2+2] = (output&0X02)>>1;  
              data[cur2+3] = output&0x01;  
          }     
          return 0;  
      }  
        
      //交换  
      int DES_Swap(ElemType left[32], ElemType right[32]){  
          ElemType temp[32];  
          memcpy(temp,left,32);     
          memcpy(left,right,32);    
          memcpy(right,temp,32);  
          return 0;  
      }  
        
      //加密单个分组  
      int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]){  
          ElemType plainBits[64];  
          ElemType copyRight[48];  
          int cnt;  
        
          Char8ToBit64(plainBlock,plainBits);       
          //初始置换(IP置换)  
          DES_IP_Transform(plainBits);  
        
          //16轮迭代  
          for(cnt = 0; cnt < 16; cnt++){         
              memcpy(copyRight,plainBits+32,32);  
              //将右半部分进行扩展置换,从32位扩展到48位  
              DES_E_Transform(copyRight);  
              //将右半部分与子密钥进行异或操作  
              DES_XOR(copyRight,subKeys[cnt],48);   
              //异或结果进入S盒,输出32位结果  
              DES_SBOX(copyRight);  
              //P置换  
              DES_P_Transform(copyRight);  
              //将明文左半部分与右半部分进行异或  
              DES_XOR(plainBits,copyRight,32);  
              if(cnt != 15){  
                  //最终完成左右部的交换  
                  DES_Swap(plainBits,plainBits+32);  
              }  
          }  
          //逆初始置换(IP^1置换)  
          DES_IP_1_Transform(plainBits);  
          Bit64ToChar8(plainBits,cipherBlock);  
          return 0;  
      }  
      
      //解密单个分组  
      int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48],ElemType plainBlock[8]){  
          ElemType cipherBits[64];  
          ElemType copyRight[48];  
          int cnt;  
        
          Char8ToBit64(cipherBlock,cipherBits);         
          //初始置换(IP置换)  
          DES_IP_Transform(cipherBits);  
            
          //16轮迭代  
          for(cnt = 15; cnt >= 0; cnt--){        
              memcpy(copyRight,cipherBits+32,32);  
              //将右半部分进行扩展置换,从32位扩展到48位  
              DES_E_Transform(copyRight);  
              //将右半部分与子密钥进行异或操作  
              DES_XOR(copyRight,subKeys[cnt],48);       
              //异或结果进入S盒,输出32位结果  
              DES_SBOX(copyRight);  
              //P置换  
              DES_P_Transform(copyRight);       
              //将明文左半部分与右半部分进行异或  
              DES_XOR(cipherBits,copyRight,32);  
              if(cnt != 0){  
                  //最终完成左右部的交换  
                  DES_Swap(cipherBits,cipherBits+32);  
              }  
          }  
          //逆初始置换(IP^1置换)  
          DES_IP_1_Transform(cipherBits);  
          Bit64ToChar8(cipherBits,plainBlock);  
          return 0;  
      }  
        
      //加密文件  
      int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile){  
          FILE *plain,*cipher;  
          int count;  
          ElemType plainBlock[8],cipherBlock[8],keyBlock[8];  
          ElemType bKey[64];  
          ElemType subKeys[16][48];  
          if((plain = fopen(plainFile,"rb")) == NULL){  
              return PLAIN_FILE_OPEN_ERROR;  
          }     
          if((cipher = fopen(cipherFile,"wb")) == NULL){  
              return CIPHER_FILE_OPEN_ERROR;  
          }  
          //设置密钥  
          memcpy(keyBlock,keyStr,8);  
          //将密钥转换为二进制流  
          Char8ToBit64(keyBlock,bKey);  
          //生成子密钥  
          DES_MakeSubKeys(bKey,subKeys);  
            
          while(!feof(plain)){  
              //每次读8个字节,并返回成功读取的字节数  
              if((count = fread(plainBlock,sizeof(char),8,plain)) == 8){  
                  DES_EncryptBlock(plainBlock,subKeys,cipherBlock);  
                  fwrite(cipherBlock,sizeof(char),8,cipher);    
              }  
          }  
          if(count){  
              //填充  
              memset(plainBlock + count,'\0',7 - count);  
              //最后一个字符保存包括最后一个字符在内的所填充的字符数量  
              plainBlock[7] = 8 - count;  
              DES_EncryptBlock(plainBlock,subKeys,cipherBlock);  
              fwrite(cipherBlock,sizeof(char),8,cipher);  
          }  
          fclose(plain);  
          fclose(cipher);  
          return OK;  
      }  
        
      //解密文件  
      int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile){  
          FILE *plain, *cipher;  
          int count,times = 0;  
          long fileLen;  
          ElemType plainBlock[8],cipherBlock[8],keyBlock[8];  
          ElemType bKey[64];  
          ElemType subKeys[16][48];  
          if((cipher = fopen(cipherFile,"rb")) == NULL){  
              return CIPHER_FILE_OPEN_ERROR;  
          }  
          if((plain = fopen(plainFile,"wb")) == NULL){  
              return PLAIN_FILE_OPEN_ERROR;  
          }  
        
          //设置密钥  
          memcpy(keyBlock,keyStr,8);  
          //将密钥转换为二进制流  
          Char8ToBit64(keyBlock,bKey);  
          //生成子密钥  
          DES_MakeSubKeys(bKey,subKeys);  
        
          //取文件长度   
          fseek(cipher,0,SEEK_END);   //将文件指针置尾  
          fileLen = ftell(cipher);    //取文件指针当前位置  
          rewind(cipher);             //将文件指针重指向文件头  
          while(1){  
              //密文的字节数一定是8的整数倍  
              fread(cipherBlock,sizeof(char),8,cipher);  
              DES_DecryptBlock(cipherBlock,subKeys,plainBlock);                         
              times += 8;  
              if(times < fileLen){  
                  fwrite(plainBlock,sizeof(char),8,plain);  
              }  
              else{  
                  break;  
              }  
          }  
          //判断末尾是否被填充  
          if(plainBlock[7] < 8){  
              for(count = 8 - plainBlock[7]; count < 7; count++){  
                  if(plainBlock[count] != '\0'){  
                      break;  
                  }  
              }  
          }     
          if(count == 7){//有填充  
              fwrite(plainBlock,sizeof(char),8 - plainBlock[7],plain);  
          }  
          else{//无填充  
              fwrite(plainBlock,sizeof(char),8,plain);  
          }  
        
          fclose(plain);  
          fclose(cipher);  
          return OK;  
      }  
      
      int main()  
      {     
          clock_t a,b;  
          a = clock();  
          DES_Encrypt("1.txt","key.txt","2.txt");  
          b = clock();  
          printf("加密消耗%d毫秒\n",b-a);  
      	
          //system("pause");  
          a = clock();  
          DES_Decrypt("2.txt","key.txt","3.txt");  
          b = clock();  
          printf("解密消耗%d毫秒\n",b-a);  
          getchar();  
          return 0;  
      }   

      算法演示

      Step 1:文件1.txt中存储明文信息

      5469875321456045

      Step 2:Key.txt文件中存储秘钥信息

      5987423651456987

      Step 3:运行程序

      DES密码算法实现(C语言)

      Step 4:文件2.txt存储加密后的信息

      DES密码算法实现(C语言)

      文件3.txt存储解密后的信息

      DES密码算法实现(C语言)

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/Fly_hps/article/details/118297002,作者:FLy_鹏程万里,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:给html文本添加图形处理

      下一篇:【C语言进阶】—— 程序环境和预处理

      相关文章

      2025-03-31 08:49:25

      C语言函数及分文件编程

      C语言函数及分文件编程

      2025-03-31 08:49:25
      C语言 , 变量名
      2025-03-26 09:31:37

      【数据结构】——拿捏 栈和队列

      【数据结构】——拿捏 栈和队列

      2025-03-26 09:31:37
      C语言 , 数据结构
      2024-11-06 07:24:46

      图的存储

      图的存储 

      2024-11-06 07:24:46
      存储 , 编程开发
      2024-11-06 07:12:42

      C语言从入门到精通——变量类型和常量类型

      C语言从入门到精通——变量类型和常量类型

      2024-11-06 07:12:42
      C语言 , 变量
      2024-11-01 09:13:56

      C语言入门:if,switch语句介绍

      if语句是一种条件控制语句,可以根据条件执行不同的代码。

      2024-11-01 09:13:56
      C语言 , switch , 代码
      2024-11-01 09:13:56

      C语言入门:循环语句的介绍

      C语言入门:循环语句的介绍

      2024-11-01 09:13:56
      C语言 , 循环 , 表达式
      2024-10-22 07:46:59

      基于SpringBoot+Vue的C语言在线评测系统的详细设计和实现(源码+lw+部署文档+讲解等)

      基于SpringBoot+Vue的C语言在线评测系统的详细设计和实现(源码+lw+部署文档+讲解等)

      2024-10-22 07:46:59
      C语言 , 代码
      2024-10-21 09:45:28

      C语言实现扫雷(标记/取消标记雷、自动展开)

      C语言实现扫雷(标记/取消标记雷、自动展开)

      2024-10-21 09:45:28
      C语言 , 标记 , 输入
      2024-10-21 09:45:28

      C语言实现简易三子棋

      C语言实现简易三子棋

      2024-10-21 09:45:28
      C语言 , 代码 , 数组
      2024-10-21 09:45:17

      基本图形的打印

      基本图形的打印

      2024-10-21 09:45:17
      C语言 , 打印 , 输出
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5244538

      查看更多

      最新文章

      C语言函数及分文件编程

      2025-03-31 08:49:25

      【数据结构】——拿捏 栈和队列

      2025-03-26 09:31:37

      图的存储

      2024-11-06 07:24:46

      C语言从入门到精通——变量类型和常量类型

      2024-11-06 07:12:42

      C语言入门:if,switch语句介绍

      2024-11-01 09:13:56

      C语言入门:循环语句的介绍

      2024-11-01 09:13:56

      查看更多

      热门文章

      Java学习之算术运算符两只老虎

      2023-04-19 09:23:13

      Lambda函数

      2023-02-08 10:33:56

      R语言方差分析(ANOVA)学生参加辅导课考试成绩差异

      2023-02-08 10:33:55

      r语言中对LASSO,Ridge岭回归和Elastic Net模型实现

      2023-02-10 10:10:49

      通过SAS网络分析对人口迁移进行可视化分析

      2023-02-08 10:33:55

      R语言多分类logistic逻辑回归模型在混合分布模拟个人风险损失值评估的应用

      2023-02-10 05:50:40

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      关于引用了母版页后,怎么在内容页里写javascript的验证表单的代码?

      使用ABAP代码给SAP IPM Contract的行项目分配IP product

      C# 根据KeyEventArgs与组合键字符串相互转换

      #私藏项目实操分享# 什么是 JavaScript 世界的 UMD

      世界杯的呈现:用简单的python代码画出

      python ubuntu dlib 5 -人脸识别并打分

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号