代码:

 #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. hive_连续天次计算

    drop table sospdm.tmp_yinfei_yuanzuan_redbag; create table sospdm.tmp_yinfei_yuanzuan_redbag stored ...

  2. TF:TF定义两个变量相乘之placeholder先hold类似变量+feed_dict最后外界传入值—Jason niu

    #TF:TF定义两个变量相乘之placeholder先hold类似变量+feed_dict最后外界传入值 import tensorflow as tf input1 = tf.placeholder ...

  3. 【Spring Boot】构造、访问Restful Webservice与定时任务

    Spring Boot Guides Examples(1~3) 参考网址:https://spring.io/guides 创建一个RESTful Web Service 使用Eclipse 创建一 ...

  4. python 数据结构之二叉树

    二叉树关键在构建和遍历,python实现相对简单,我们在实现需要用到类,分别设置爱左右子树,根节点,然后从根进行遍历,进行判断,若为空进行树的构建,非空则返回到列表中即可,我在进行遍历时产生了一个错误 ...

  5. mysql主从配置和galera集群

    mariadb主从 主从多用于网站架构,因为主从的同步机制是异步的,数据的同步有一定延迟,也就是说有可能会造成数据的丢失,但是性能比较好,因此网站大多数用的是主从架构的数据库,读写分离必须基于主从架构 ...

  6. ELK日志分析方案

    针对公司项目微服务化,随着项目及服务器的不断增多,决定采用ELK(Elasticsearch+Logstash+Kibana)日志分析平台进行微服务日志分析. 1.ELK整体方案 1.1 ELK架构图 ...

  7. C# 的Chart

    Axis Label 横纵坐标的文字 (比如 0 20 40 ....) Axis Title 横纵坐标的代表什么(比如 Y Axis Title) Chart Area 图标所在位置 Chart P ...

  8. XamarinSQLite教程创建数据表

    XamarinSQLite教程创建数据表 新创建的数据库没有任何表.开发者需要手动添加数据表,并添加测试所需的数据. 1.创建数据表 为了存储数据,开发者需要添加自己的表,并设计表的结构.操作步骤如下 ...

  9. Idea中的Maven

    IDEA作为java开发必不可少的一个工具,对于老Eclipse开发人员刚接触的时候可能会有些陌生,同时,maven也是java开发经常使用的工具,有些人可能会不清楚怎么在idea里面使用maven, ...

  10. [JOISC2014]たのしい家庭菜園

    [JOISC2014]たのしい家庭菜園 题目大意: 给定一个长度为\(n(n\le3\times10^5)\)的序列\(A(A_i\le10^9)\).只能交换相邻两个数,问最少需要几步可以将它变成一 ...