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工程师来解决安卓的问 ...
随机推荐
- idea工具maven生命周期clean,install,package等区别
idea工具maven projects里面有9种生命周期,生命周期是包含在一个项目构建中的一系列有序的阶段. 一.最常用的两种打包方法: 1.clean,package(如果报错,很可能就是jar依 ...
- 从零搭建 ES 搜索服务(五)搜索结果高亮
一.前言 在实际使用中搜索结果中的关键词前端通常会以特殊形式展示,比如标记为红色使人一目了然.我们可以通过 ES 提供的高亮功能实现此效果. 二.代码实现 前文查询是通过一个继承 Elasticsea ...
- Alpha(2/10)
鐵鍋燉腯鱻 项目:小鱼记账 团队成员 项目燃尽图 冲刺情况描述 站立式会议照片 各成员情况 团队成员 学号 姓名 git地址 博客地址 031602240 许郁杨 (组长) https://githu ...
- vue中,class与style绑定
<template> <div> <p v-bind:class="{active:isActive,'demo':Demo}">嘿嘿</ ...
- CentOS 6.4中升级编译安装GCC 4.8.1 + GDB 7.6.1 + Eclipse 以及Kdump配置
在CentOS 6.4中编译安装GCC 4.8.1 + GDB 7.6.1 + Eclipse 今天在isocpp上看到"GCC 4.8.1 released, C++11 feature ...
- MyBatis 命名空间与命名解析
命名空间 使用完全限定名来进一步区分语句. 命名解析 为了减少输入量,MyBatis 对所有的命名配置元素(包括语句,结果映射,缓存等)使用如下的命名解析规则: 完全限定名(比如“com.mypack ...
- list(列表) python
1.list(列表): list是处理一组有序项目的数据结构 list(列表)是python中使用最频繁的数据类型 list中什么类型的数据都可以存放(如:类.自己.函数......): list(列 ...
- keras 的svm做分类
SVC继承了父类BaseSVC SVC类主要方法: ★__init__() 主要参数: C: float参数 默认值为1.0 错误项的惩罚系数.C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确 ...
- Concurrency in C# Cookbook 笔记
Pausing for a Period of TimeProblem:You need to (asynchronously) wait for a period of time. This can ...
- [原创] 上海招聘高级测试工程师(性能测试/自动化测试/App测试),长期有效
[原创] 上海招聘高级测试工程师(性能测试/自动化测试/App测试方向),长期有效 高级测试工程师(性能/自动化方向) 1.负责性能测试计划,性能需求分析,性能测试方案和用例设计,搭建性能测试环境,执 ...