#include "stdio.h"
#include "memory.h"
#include "stdlib.h"
#include "des.h"
static 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};
static int ip1_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};
static int ex_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};
static 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};
static int s_table[8][4][16] =
{{{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}},
{{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}},
{{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}},
{{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}},
{{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}},
{{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}},
{{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}},
{{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}}};
static int pc_table[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};
static int pc1_table[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};
static int move_times[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
static void convert_bits(char *data,char* buffer)
{
int i = 0,j = 0,cnt = 0;
for(i = 0 ;i < 8 ;i++){
for(j = 0 ;j < 8 ;j++){
buffer[cnt++] = ( data[i] >> j) & 0x1;
}
}
}
static void re_convert_bits(char *data,char* buffer)
{
int i = 0,j = 0,cnt = 0;
memset(buffer,0x0,8*sizeof(char));
for(i = 0 ;i < 8 ;i++){
for(j = 0 ;j < 8 ;j++){
buffer[i] |= data[cnt++] << j;
}
}
}
static void LeftShift(char* data, int shift){
static char temp[56];
memcpy(temp,data,shift);
memcpy(&temp[shift],&data[28],shift);
memcpy(data,&data[shift],28-shift);
memcpy(&data[28-shift],temp,shift);
memcpy(&data[28],&data[28+shift],28-shift);
memcpy(&data[56-shift],&temp[shift],shift);
}
static void pc1_transform(char* key, char* dst){
int i;
for(i = 0; i < 56; i++){
dst[i] = key[pc_table[i]];
}
}
static void pc2_transform(char* key, char* dst){
int i;
for(i = 0; i < 48; i++){
dst[i] = key[pc1_table[i]];
}
}
static void ip_transform(char* data){
int i;
static char temp[64];
for(i = 0; i < 64; i++){
temp[i] = data[ip_table[i]];
}
memcpy(data,temp,64);
}
static void e_transform(char* data){
int i;
static char temp[48];
for(i = 0; i < 48; i++){
temp[i] = data[ex_table[i]];
}
memcpy(data,temp,48);
}
static void p_transform(char* data){
int i;
static char temp[32];
for(i = 0; i < 32; i++){
temp[i] = data[p_table[i]];
}
memcpy(data,temp,32);
}
static void ip1_transform(char* data){
int i;
static char temp[64];
for(i = 0; i < 64; i++){
temp[i] = data[ip1_table[i]];
}
memcpy(data,temp,64);
}
static void block_xor(char* R, char* L ,int count){
int i;
for(i = 0; i < count; i++){
R[i] ^= L[i];
}
}
static void sbos(char* data){
int i;
int line,row,output;
int cur1,cur2;
for(i = 0; i < 8; i++){
cur1 = i*6;
cur2 = i<<2;
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_table[i][line][row];
data[cur2++] = (output&0X08)>>3;
data[cur2++] = (output&0X04)>>2;
data[cur2++] = (output&0X02)>>1;
data[cur2] = output&0x01;
}
}
static void block_swap(char* left, char* right){
static char temp[32];
memcpy(temp,left,32);
memcpy(left,right,32);
memcpy(right,temp,32);
}
/************************************************************************/
/* functions:DES_GetKey,DES_Encrypt,DES_Decrypt
*/
/************************************************************************/
DES_KEY DES_GetKey(char* key_str)
{
static DES_KEY key; static char temp[56]; int i;
static char key_bits[64];
convert_bits(key_str,key_bits);
pc1_transform(key_bits,temp);
for(i = 0; i < 16; i++){
LeftShift(temp,move_times[i]);
pc2_transform(temp,key.keys[i]);
}
return key;
}
void DES_Encrypt(DES_KEY* key,char* data,char* dst)
{
static char bits[64];
static char right[48];
int i;
convert_bits(data,bits);
ip_transform(bits);
for(i = 0; i < 16; i++){
memcpy(right,&bits[32],32);
e_transform(right);
block_xor(right,key->keys[i],48);
sbos(right);
p_transform(right);
block_xor(bits,right,32);
if(i != 15){
block_swap(bits,&bits[32]);
}
}
ip1_transform(bits);
re_convert_bits(bits,dst);
}
void DES_Decrypt(DES_KEY* key,char* data,char* dst)
{
static char bits[64];
static char right[48];
int i;
convert_bits(data,bits);
ip_transform(bits);
for(i = 15; i >= 0; i--){
memcpy(right,&bits[32],32);
e_transform(right);
block_xor(right,key->keys[i],48);
sbos(right);
p_transform(right);
block_xor(bits,right,32);
if(i != 0){
block_swap(bits,&bits[32]);
}
}
ip1_transform(bits);
re_convert_bits(bits,dst);
}
DES加密解密算法-C语言实现
5星 · 超过95%的资源 需积分: 38 41 浏览量
2012-01-08
13:01:34
上传
评论 1
收藏 3KB ZIP 举报
夜之风雪
- 粉丝: 3
- 资源: 2
最新资源
- 基于JAVA-JSP的现代数字化电子政务网管理系统论文-20240403更新
- 西部钻探工程有限公司安全环保问责管理办法.doc
- Using Model-Based Design to Develop SOA Applications
- PHP Decrypt跨平台解密PHP源码的扩展
- SimHei MAC字体资源
- 2024全国行政区域编码
- 数据源-数据可视化(七):Pandas香港酒店数据高级分析,涉及相关系数,协方差,数据离散化,透视表等精美可视化展示
- linux常用命令大全.doc
- 格拉斯哥大学空缺职位申请详细介绍Applicant Guide.pdf
- mmexport1702953347189.mp4
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页