DES加密解密算法C语言代码实现
代码:
#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语言代码实现的更多相关文章
- java 实现 DES加密 解密算法
DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...
- 【转】TEA、XTEA、XXTEA加密解密算法(C语言实现)
ref : https://blog.csdn.net/gsls200808/article/details/48243019 在密码学中,微型加密算法(Tiny Encryption Algorit ...
- C#和PHP加密结果一致的DES加密解密算法。php实现和c#一致的DES加密解密
DES加密算法 des对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密 ...
- Des加密解密算法java实现
package tech.fullink.eaglehorn.utils; import javax.crypto.Cipher; import javax.crypto.SecretKey; imp ...
- android -------- DES加密解密算法
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信 ...
- C#MD5加密和DES加密解密算法
public partial class stringTest : System.Web.UI.Page { protected void Page_Load(object s ...
- DES加密解密算法C++实现
DES加密算法并不难,是由一些简单的变换得来的,难的是要有足够的耐心.蒟蒻并不想说自己用了多久才把代码写好的. 代码: 我真的太难了QAQ #include<iostream> using ...
- DES对 json 、http参数加密解密算法
网上众多大神们的众多方式实现加解密操作及保障数据安全性.今天无意中发现一篇以 DES加密解密算法.摘抄如下 工具类: import java.security.SecureRandom; import ...
- 兼容PHP和Java的des加密解密代码分享
这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 作为一个iOS工程师来解决安卓的问 ...
随机推荐
- 解决Ubuntu中Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another proce...
解决Ubuntu中Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another proce... ...
- HDU 1811 Rank of Tetris 【拓扑排序】+【并查集】
<题目链接> 题目大意: 给你N个点(编号从0到N-1)和M个关系,要你判断这个图的所有点的顺序是否可以全部确定.不过对于任意点的关系可能存在A>B或A<B或A=B三种情况,如 ...
- Codeforces 514C Watto and Mechanism 【Trie树】+【DFS】
<题目链接> 题目大意:输入n个单词构成单词库,然后进行m次查询,每次查询输入一个单词(注意这些单词只由a,b,c构成),问该单词库中是否存在与当前查询的单词有且仅有一个字符不同的单词. ...
- ReentrantLock和condition源码浅析(一)
转载请注明出处..... 一.介绍 大家都知道,在java中如果要对一段代码做线程安全操作,都用到了锁,当然锁的实现很多,用的比较多的是sysnchronize和reentrantLock,前者是ja ...
- Ignatius and the Princess III HDU - 1028 -生成函数or完全背包计数
HDU - 1028 step 1:初始化第一个多项式 也就是 由 1的各种方案 组 成 的多项式 初始化系数为 1.临时区 temp初始化 为 0 step 2:遍历后续的n - 1 个 多项式 , ...
- Centos6.5部署Rsyslog+cron+rsync备份服务器
1.前言 rsync是一种快速且功能非常广泛的文件复制工具.它可以在本地复制,通过任何远程shell复制到/从另一个主机复制,也可以复制到/从远程rsync守护进程.它提供了大量的选项,可以控制其行为 ...
- VMware5.5-高可用性和动态资源调度(DRS)
高可用性 故障分类:ESX主机---虚拟机(主机通过vmtools监控)---应用程序(基本不用6.0新增了这一功能) 高可用的信号检测目前可分为两种 一.网络信号 二.存储信号 新建群集 上图的自定 ...
- AE插入音乐
将音乐文件(如MP3文件)直接拖拽到工程里就可以. 然后添加到合成里. 点击内容预览 ,就自动播放了. 在合成窗口里面,我们可以对于音频文件进行拖动,以及裁剪等操作,但是需要注意的是AE里面不能预览声 ...
- MVC微型框架---------学习
1.单一入口机制 是指在web程序中 所有的请求都指向一个脚本文件 2.工厂模式的概念精髓:工厂类就是对类的封装,类是对方法的封装,方法是对实现过程的封装调用当前类的静态方法,规范的写法是使用 sel ...
- [ONTAK2015]Związek Harcerstwa Bajtockiego
[ONTAK2015]Związek Harcerstwa Bajtockiego 题目大意: 一棵\(n(n\le10^6)\)个点的树,从\(m\)出发,依次执行\(k(k\le10^6)\)条操 ...