代码:

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*------------------------
定义枚举型全局变量
------------------------*/
typedef enum
{
false = ,
true =
} bool; // 十六轮子密钥
static bool SubKey[][]={}; /*---------------------*/
/*-------------------------------------------------------------
各种置换表
-------------------------------------------------------------*/
// IP置换表
const char IP_Table[]={
,,,,,,, ,,,,,,,, ,
,,,,,,, ,,,,,,,, ,
,,,,,, , ,,,,,,,, ,
,,,,,,, ,,,,,,,,
};
// IP-1置换表
const char IPR_Table[]={
, ,,,,,,,, ,,,,,,,
, ,,,,,,,, ,,,,,,,
, ,,,,,,,, ,,,,,,,
, ,,,,,,,, ,, ,,,,
}; // E扩展表
static char E_Table[]={
, , , , , , , , , , , ,
, ,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,
};
// PC1置换表
static char PC1_Table[]={
,,,,,, , ,,,,,,,
, ,,,,,,,, ,,,,,
,,,,,,, ,,,,,,,
, ,,,,,,,, ,,,,
}; // pc2表
static char PC2_Table[]={
,,,, , , ,,, ,,,
,,, ,, ,, ,,,, ,
,,,,,,,,,,,,
,,,,,,,,,,,
};
// 移位表
static char Move_Table[]={
, , , , , , , , , , , , , , ,
};
// S盒
static char S_Box[][][]={
//S1
, ,, , ,,, , ,, ,, , , , ,
,, , ,, ,, ,, ,,, , , , ,
, ,, ,, , ,,,, , , ,, , ,
,, , , , , , , ,, ,,, , ,,
//S2
, , ,, ,, , , , , ,,, , ,,
,, , ,, , ,,, , ,, , ,, ,
,, ,,, ,, , , ,, , , , ,,
, ,, , ,, , ,, , ,, , ,, ,
//S3
, , ,, , ,, , ,,, ,, , , ,
, , , , , , ,, , , ,,,,, ,
, , , , ,, , ,, , ,, ,,, ,
,,, , , , , , ,,, ,, , ,,
//S4
,,, , , , ,, , , , ,,, ,,
, ,, , ,, , , , , ,, ,,, ,
, , , ,,, ,,, , ,, , , , ,
,, , ,, ,, , , , ,,, , ,,
//S5
,, , , ,,, , , , ,,, ,, ,
,, ,, , ,, , , ,,, , , , ,
, , ,,,, , ,, ,, , , , ,,
, ,, , ,, ,, ,, , ,, , , ,
//S6
, ,,, , , , , ,, , ,, , ,,
,, , , ,, , , , ,,, ,, , ,
,,, , , ,, , , , ,, ,,, ,
, , ,, , ,,,,, , , , , ,,
//S7
,, ,,, , ,, ,, , , ,, , ,
, ,, , , , ,,, , ,, ,, , ,
, ,,,, , ,,,, , , , , , ,
,,, , , ,, , , , ,,, , ,,
//S8
, , , , ,,, ,, , ,, , ,, ,
,,, ,, , , ,, , ,, ,, , ,
,, , , ,,, , , ,,,, , , ,
, ,, , ,, ,,,, , , , , ,
};
//P置换表
static char P_Table[]={
, ,,,,,,, ,,,, ,,,,
, ,,,,, , ,,,, ,,, ,
};
/*-------------------------------------------------------------------*/ /*-----------------------------自定义函数-----------------------------*/
void SetKey(char My_key[]); //生成16轮的子密钥;
void ByteToBit(bool * Data_out,char * Data_in,int Num); //字节转换成位;
void Change_bit(bool * Data_out,int Num);//二进制的位置进行转换;
void BitToByte(char My_message[],bool * Message_in,int Num); //位转换成字节;
void TableReplace(bool *Data_out,bool *Data_in,const char *Table,int Num); //各种表的置换算法;
void Bitcopy(bool * Data_out,bool * Data_in,int Num); //二进制数组的拷贝
void Loop_bit(bool * Data_out,int movstep,int len); //左移位;
void Run_Des(char My_message[],char HexMssage[]);//des的轮加密算法
void Xor(bool * Message_out, bool * Message_in,int Num); //执行异或
void S_change(bool * Data_out, bool * Data_in); // S盒变换;
void HexToBit(bool * Data_out,char * Data_in,int Num); // 十六进制转二进制
void BitToHex(char * Data_out,bool * Data_in,int Num); //二进制转换成十六进制;
void Run_desDes(char My_message[],char HexMessage[]);// DES轮解密算法; /*--------------------------*/ /*--------------------------主函数----------------------------------*/
int main()
{
int i=,j;
char My_key[]={}; //记录加密密钥;
char You_key[]={}; //解密密钥
char My_message[]={}; //明文
char Message_hex[]={};//16进制的密文
printf("请输入你要加密的内容(8 Byte):\n");
gets(My_message);
printf("请输入你的加密密钥:\n");
gets(My_key);
i=strlen(My_key);
while(i!=)
{
printf("请输入加密密钥(8 Byte)\n");
gets(My_key);
i=;
i=strlen(My_key);
}
SetKey(My_key); //生成16轮的加密子密钥;
Run_Des(My_message,Message_hex); //des的轮加密过程
printf("经过加密的密文为:\n");
for(i=;i<;i++)
{
printf("%c ",Message_hex[i]);
}
printf("\n");
printf("请输入你的解密密钥(8 Byte):\n");
gets(You_key);
i=strlen(You_key);
while(i!=)
{
printf("请输入解密密钥(8 Byte)\n");
gets(You_key);
i=;
i=strlen(You_key);
}
SetKey(You_key); //生成16轮的解密子密钥;
Run_desDes(My_message,Message_hex);//解密;
printf("解密结果为:\n");
for(i=;i<;i++)
{
printf("%c ",My_message[i]);
}
printf("\n");
return ;
} /*--------------------具体函数定义----------------------*/
void Bitcopy(bool * Data_out, bool * Data_in,int Num) //二进制数组拷贝
{
int i=;
for(i=;i<Num;i++)
{
Data_out[i]=Data_in[i];
} }
void Change_bit(bool * Data_out,int Num) //二进制的位置进行转换;
{
int i,j;
static bool Temp[]={};
for(i=;i<Num/;i++)
{
Bitcopy(Temp,Data_out,Num/);
for(j=;j<Num/;j++)
{
Data_out[j]=Temp[Num/--j];
}
Data_out+=Num/;
}
}
void ByteToBit( bool * Data_out,char * Data_in,int Num) //字节转位
{
int i,j;
for(i=;i<Num;i++)
{
Data_out[i]=(Data_in[i/]>>(i%))&0x01;
}
//Change_bit(Data_out,Num);
}
void BitToHex(char * Data_out, bool * Data_in,int Num) //二进制转十六进制
{
int i;
for(i=;i<Num/;i++)
{
Data_out[i]=;
}
for(i=;i<Num/;i++)
{
Data_out[i]=Data_in[*i]+Data_in[*i+]*+Data_in[*i+]*+Data_in[*i+]*;
if(Data_out[i]%>)
{
Data_out[i]=Data_out[i]%+'';
}
else
Data_out[i]=Data_out[i]%+'';
}
}
void HexToBit(bool * Data_out,char * Data_in,int Num) //十六进制转二进制
{
int i;
for(i=;i<Num;i++)
{
if(Data_in[i/]<='')
{
Data_out[i]=((Data_in[i/]-'')>>(i%))&0x01;
}
else
{
Data_out[i]=((Data_in[i/]-'')>>(i%))&0x01;
}
}
}
void BitToByte(char My_message[],bool * Message_in,int Num) //位转换成字节
{
int i=;
for(i=;i<(Num/);i++)
{
My_message[i]=;
}
for(i=;i<Num;i++)
{
My_message[i/]|=Message_in[i]<<(i%);
}
}
void TableReplace( bool *Data_out, bool * Data_in,const char *Table ,int Num) // 置换算法
{
int i=;
static bool Temp[]={};
for(i=;i<Num;i++)
{
Temp[i]=Data_in[Table[i]-];
}
Bitcopy(Data_out,Temp,Num);
}
void Loop_bit(bool * Data_out,int movstep,int len)
{
static bool Temp[]={};
Bitcopy(Temp,Data_out,movstep);
Bitcopy(Data_out,Data_out+movstep,len-movstep);
Bitcopy(Data_out+len-movstep,Temp,movstep);
/*Temp=Data_out;
Temp[movstep]='\0';
Data_out=Data_out+movstep;
Data_out+(len-movstep)=Temp;*/
}
void Xor(bool * Message_out,bool * Message_in,int Num)//执行异或
{
int i;
for(i=;i<Num;i++)
{
Message_out[i]=Message_out[i]^Message_in[i];
}
}
void SetKey(char My_key[])
{
int i,j;
static bool Key_bit[]={}; //Key的二进制缓存;
static bool *Key_bit_L,*Key_bit_R;
Key_bit_L=&Key_bit[]; //key的左边28位;
Key_bit_R=&Key_bit[]; //key的右边28位;
ByteToBit(Key_bit,My_key,);
/* Change_bit(Key_bit,64) ;//二进制的位置进行转换;
for(i=0;i<64;i++)
{
printf("%d ",Key_bit[i]);
}
printf("\n");
printf("\n");*/
TableReplace(Key_bit,Key_bit,PC1_Table,);//pc-1 置换
for(i=;i<;i++)
{
Loop_bit(Key_bit_L,Move_Table[i],);
Loop_bit(Key_bit_R,Move_Table[i],);
TableReplace(SubKey[i],Key_bit,PC2_Table,);//pc-2置换
}
}
void S_change(bool * Data_out, bool * Data_in) //S盒变换
{
int i;
int r=,c=;//S盒的行和列;
for(i=;i<;i++,Data_in=Data_in+,Data_out=Data_out+)
{
r=Data_in[]*+Data_in[]*;
c=Data_in[]*+Data_in[]*+Data_in[]*+Data_in[]*;
ByteToBit(Data_out,&S_Box[i][r][c],);
}
}
void F_change(bool Data_out[],bool Data_in[]) // f函数;
{
int i;
static bool Message_E[]={}; //存放E置换的结果;
TableReplace(Message_E,Data_out,E_Table,);//E表置换
Xor(Message_E,Data_in,);
S_change(Data_out,Message_E); // S盒变换
TableReplace(Data_out,Data_out,P_Table,); //P置换
}
void Run_Des(char My_message[],char HexMssage[])//des轮加密算法;
{
int i;
static bool Message_bit[]={};
static bool *Message_bit_L=&Message_bit[],*Message_bit_R=&Message_bit[];
static bool Temp[]={};
ByteToBit(Message_bit,My_message,);
/*Change_bit(Message_bit,64) ;//二进制的位置进行转换;
for(i=0;i<64;i++)
{
printf("%d ",Message_bit[i]);
}
printf("\n");
printf("\n");*/
TableReplace(Message_bit,Message_bit,IP_Table,);
for(i=;i<;i++)
{
Bitcopy(Temp,Message_bit_R,);
F_change(Message_bit_R,SubKey[i]);
Xor(Message_bit_R,Message_bit_L,);
Bitcopy(Message_bit_L,Temp,);
}
TableReplace(Message_bit,Message_bit,IPR_Table,);
BitToHex(HexMssage,Message_bit,);//二进制转换成十六进制;
}
void Run_desDes(char My_message[],char HexMessage[])// DES轮解密算法;
{
int i=;
static bool Message_bit[]={};
static bool * Message_bit_L=&Message_bit[], * Message_bit_R=&Message_bit[];
static bool Temp[]={};
HexToBit(Message_bit,HexMessage,);
TableReplace(Message_bit,Message_bit,IP_Table,);
for(i=;i>=;i--)
{
Bitcopy(Temp,Message_bit_L,);
F_change(Message_bit_L,SubKey[i]);
Xor(Message_bit_L,Message_bit_R,);
Bitcopy(Message_bit_R,Temp,);
}
TableReplace(Message_bit,Message_bit,IPR_Table,);
BitToByte(My_message,Message_bit,);
}

DES加密解密算法C语言代码实现的更多相关文章

  1. java 实现 DES加密 解密算法

    DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...

  2. 【转】TEA、XTEA、XXTEA加密解密算法(C语言实现)

    ref : https://blog.csdn.net/gsls200808/article/details/48243019 在密码学中,微型加密算法(Tiny Encryption Algorit ...

  3. C#和PHP加密结果一致的DES加密解密算法。php实现和c#一致的DES加密解密

    DES加密算法 des对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密 ...

  4. Des加密解密算法java实现

    package tech.fullink.eaglehorn.utils; import javax.crypto.Cipher; import javax.crypto.SecretKey; imp ...

  5. android -------- DES加密解密算法

    DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信 ...

  6. C#MD5加密和DES加密解密算法

    public partial class stringTest : System.Web.UI.Page     {         protected void Page_Load(object s ...

  7. DES加密解密算法C++实现

    DES加密算法并不难,是由一些简单的变换得来的,难的是要有足够的耐心.蒟蒻并不想说自己用了多久才把代码写好的. 代码: 我真的太难了QAQ #include<iostream> using ...

  8. DES对 json 、http参数加密解密算法

    网上众多大神们的众多方式实现加解密操作及保障数据安全性.今天无意中发现一篇以 DES加密解密算法.摘抄如下 工具类: import java.security.SecureRandom; import ...

  9. 兼容PHP和Java的des加密解密代码分享

    这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 作为一个iOS工程师来解决安卓的问 ...

随机推荐

  1. Service工作原理

    --摘自<android插件化开发指南> 一.在新进程启动Service 第一步:APP向AMS发送一个启动Service的消息 通过AMN/AMP把要启动的Service信息发送给AMS ...

  2. SpringBoot文件上传下载

    项目中经常会有上传和下载的需求,这篇文章简述一下springboot项目中实现简单的上传和下载. 新建springboot项目,前台页面使用的thymeleaf模板,其余的没有特别的配置,pom代码如 ...

  3. VeeamBackup9.5-查看和添加备份设备

    备份代理(Backup Proxies)也就是VB主体,是VEEAM的核心组件之一,所有的备份的建立和还原都需要备份代理来完成.VEEAM安装完成后,默认VeeamBackup备份服务器即为备份代理, ...

  4. Ubuntu下常用指令

    James最近因为需要尝试着编译Android源代码,系统环境变成了Ubuntu.和熟悉Windows操作系统环境一样,都有过渡的阶段.下面记录常用的操作指令. 分类目录如下: uname -a 查看 ...

  5. PHP的json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案

    PHP5.4才支持JSON_UNESCAPED_UNICODE这个参数,此参数是让中文字符在json_encode的时候不用转义,减少数据传输量.但在PHP5.3中,就得自己写个函数来实现,以下就是解 ...

  6. NineveGL引擎学习笔记

  7. 狡猾的商人 [HNOI2005] [一题双解]

    Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 ...

  8. IIS 日志分析工具:Log Parser Studio

    1.安装Log Parser,下载地址:http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=24659 ...

  9. django session源码剖析

    首先要明白,session和cookie,session是保存在服务器端,cookie存储在浏览器上,我们称为客户端,客户端向服务端发送请求时,会将cookie一起发送给服务端.服务端接收到请求后,会 ...

  10. 开源流媒体服务器SRS学习笔记(1) - 安装、推流、拉流

    SRS(Simple RTMP Server)  是国人写的一款非常优秀的开源流媒体服务器软件,可用于直播/录播/视频客服等多种场景,其定位是运营级的互联网直播服务器集群. 一.安装 官网提供了3种安 ...