DES加密解密的C++源程序

DES加密解密的C++源程序

--测试版本,希望大家多多交流

#include<iostream.h>

#include"stdio.h"

#include"math.h"

#include "string.h"

static char key[16][48];

static char Hex[16][4];

////IP置换。

int IP[64]=

{

58,50,42,34,26,18,10,2,\

60,52,44,36,28,20,12,4,\

62,54,46,38,30,22,14,6,\

64,56,48,40,32,24,16,8,\

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\

};

//IP-1置换。可根据IP表生成

int IP_1[64]=

{

40,8,48,16,56,24,64,32,\

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 \

};

//E扩展

int E[48] =

{

32,1,2, 3, 4, 5,

4,5, 6, 7, 8, 9,

8,9, 10,11,12,13,

12,13,14,15,16,17,

16,17,18,19,20,21,

20,21,22,23,24,25,

24,25,26,27,28,29,

28,29,30,31,32,1

};

//PC-1置换。

int PC_1[56]=

{

57,49,41,33,25,17,9,

1,58,50,42,34,26,18,

10,2,59,51,43,35,27,

19,11,3,60,52,44,36,

63,55,47,39,31,23,15,

7,62,54,46,38,30,22,

14,6,61,53,45,37,29,

21,13,5,28,20,12,4

};

//PC-2置换。

int PC_2[48]=

{

14,17,11,24,1,5,

3,28,15,6,21,10,

23,19,12,4,26,8,

16,7,27,20,13,2,

41,52,31,37,47,55,

30,40,51,45,33,48,

44,49,39,56,34,53,

46,42,50,36,29,32

};

//P置换

int P[32]={

16,7,20,21,

29,12,28,17,

1,15,23,26,

5,18,31,10,

2,8,24,14,

32,27,3,9,

19,13,30,6,

22,11,4,25

};

int S[8][4][16] =

//S盒1。   S盒都可以自己设置

{

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,

//S盒2

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,

//S盒3

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,

//S盒4

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,

//S盒5

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,

//S盒6

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,

//S盒7

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,

//S盒8

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

};

void Init_Hex()

{

}

void LS(char src[28],char dist[28],int n)

//将28比特的字符串循环左移n位

{

for(inti=0;i<28;i++)

dist[i]= src[(28-n+i)%28];

}

void Decompose_56(char src[56],chardist1[28],char dist2[28])

//将56比特的字符串分解为2个28比特的字符串

{

}

void Decompose_64(char src[64],chardist1[32],char dist2[32])

//将一个64比特的字符串分解为两个32位的字符串

{}

void Combine_56(char src1[28],charsrc2[28],char dist[56])

//将两个28比特的字符串合并成一个56比特的字符串

{}

void Combine_64(char src1[32],charsrc2[32],char dist[64])

//将两个32比特的字符串合并成一个64比特的字符串

{

for(inti=0;i<32;i++)

dist[i]= src1[i];

for(intj=32;j<64;j++)

dist[j]= src2[j-32];

}

void PC_1_Permutation(char src[64],chardist[56])

//PC-1置换

{

for(inti=0;i<56;i++)

dist[i]= src[PC_1[i]-1];

}

void PC_2_Permutation(char src[56],chardist[48])

//PC-2置换

{

for(inti=0;i<64;i++)

dist[i]= src[PC_2[i]-1];

}

void IP_Permutation(char src[64],chardist[64])

//IP置换

{

for(inti=0;i<64;i++)

dist[i]= src[IP[i]-1];

}

void IP_1_Permutation(char src[64],chardist[64])

//IP的逆置换

{

for(inti =0;i<64;i++)

dist[i]=src[IP_1[i]-1];

}

void E_Permutation(char src[32],chardist[48])

//E置换

{

for(inti=0;i<48;i++)

dist[i]= src[E[i]-1];

}

void P_Permutation(char src[32],chardist[32])

//P置换

{

for(inti=0;i<32;i++)

dist[i]= src[P[i]-1];

}

void StrCpy(char src[],char dist[],int n)

//字符串的复制

{

for(inti=0;i<n;i++)

dist[i]= src[i];

}

void S_Permutation(char src[6],chardist[4],int n)

//第n个S盒的置换

{

Init_Hex();

inti,j,k,m[4];

i=n;

if((src[0]==‘0‘)&&(src[5]==‘0‘))

j= 0;

elseif((src[0]==‘0‘)&&(src[5]==‘1‘))

j= 1;

elseif((src[0]==‘1‘)&&(src[5]==‘0‘))

j= 2;

else

j= 3;

for(inttemp_i=1;temp_i<5;temp_i++)

{

if(src[temp_i]==‘1‘)

m[temp_i-1]= 1;

else

m[temp_i-1]= 0;

}

k= m[3]+2*m[2]+4*m[1]+8*m[3];

StrCpy(Hex[(S[i][j][k])],dist,4);

}

void Make_Key(char k[64])

//产生密钥

{

charTemp_Key[56];

PC_1_Permutation(k,Temp_Key);

charTemp_C[28],Temp_D[28],Temp_C0[28],Temp_D0[28];

Decompose_56(Temp_Key,Temp_C0,Temp_D0);

for(inti=0;i<16;i++)

{

if((i==0)||(i==1)||(i==8)||(i==15))

{

LS(Temp_C0,Temp_C,1);

LS(Temp_D0,Temp_D,1);

}

else

{

LS(Temp_C0,Temp_C,2);

LS(Temp_D0,Temp_D,2);

}

Combine_56(Temp_C,Temp_D,key[i]);

StrCpy(Temp_C0,Temp_C,28);

StrCpy(Temp_D0,Temp_D,28);

}

}

void XOR(char src[48],char dist[48])

//将两个48比特的字符串进行异或

{

for(inti=0;i<48;i++)

{

if(src[i]== dist[i])

dist[i]= ‘0‘;

else

dist[i]= ‘1‘;

}

}

void F_Function(char R[32],chardist[32],int n)

//第n次轮函数

{

chartemp[48],A[8][6],C[8][4],temp_dist[32];

E_Permutation(R,temp);

XOR(key[n],temp);

for(inti=0;i<8;i++)

{

for(intj=0;j<6;j++)

{

A[i][j]= temp[8*i+j];

}

}

for(i=0;i<8;i++)

{

S_Permutation(A[i],C[i],i);

}

for(i=0;i<4;i++)

{

temp_dist[i]= C[0][i];

}

for(i=4;i<8;i++)

{

temp_dist[i]= C[1][i+4];

}

for(i=8;i<12;i++)

{

temp_dist[i]= C[2][i+8];

}

for(i=12;i<16;i++)

{

temp_dist[i]= C[3][i+12];

}

for(i=16;i<20;i++)

{

temp_dist[i]= C[4][i+16];

}

for(i=20;i<24;i++)

{

temp_dist[i]= C[5][i+20];

}

for(i=24;i<28;i++)

{

temp_dist[i]= C[6][i+24];

}

for(i=28;i<32;i++)

{

temp_dist[i]= C[7][i+28];

}

P_Permutation(temp_dist,dist);

}

void Char2bitchar(char src[8],chardist[64])

//将一个任意的8字符串转换为比特串

{

inttemp;

for(inti=0;i<8;i++)

{

temp= (int)src[i];

for(intj=0;j<8;j++)

{

if((temp%2)== 1)

dist[8*(i+1)-(j+1)]= ‘1‘;

else

dist[8*(i+1)-(j+1)]= ‘0‘;

temp= int(temp/2);

}

}

}

void Bitchar2char(char src[64],chardist[8])

//将一个8字符串转换为一个64比特字符串

{

inttemp =0;

for(inti=0;i<8;i++)

{

for(intj=0;j<8;j++)

{

if(src[8*i+j]== ‘1‘)

temp+= int(pow(2,7-j));

}

dist[i]= char(temp);

temp= 0;

}

}

void Encryption(char temp_src[8],chartemp_dist[8],char temp_key[8])

//DES加密过程

{

charsrc[64],dist[64],Key[64];

Char2bitchar(temp_src,src);

Char2bitchar(temp_key,Key);

Make_Key(Key);

chartemp[64],temp_L[32],temp_R[32],L[32],R[32];

IP_Permutation(src,temp);

/*for(intj=0;j<64;j++)

cout<<temp[j];

cout<<endl;*/

Decompose_64(temp,temp_L,temp_R);

for(inti=0;i<16;i++)

{

StrCpy(temp_R,L,32);

F_Function(temp_R,R,i);

XOR(temp_L,R);

StrCpy(R,temp_R,64);

StrCpy(L,temp_L,64);

}

Combine_64(temp_R,temp_L,temp);

IP_1_Permutation(temp,dist);

Bitchar2char(dist,temp_dist);

}

void DeMake_Key(char k[64])

//产生密钥

{

chartemp = ‘0‘;

for(inti=0;i<8;i++)

{

for(intj=0;j<48;j++)

{

temp= key[i][j];

key[i][j]= key[15-i][j];

key[15-i][j]= temp;

}

}

}

void Decryption(char temp_src[8],chartemp_dist[8],char temp_key[8])

//DES解密过程

{

charsrc[64],dist[64],Key[64];

Char2bitchar(temp_src,src);

Char2bitchar(temp_key,Key);

DeMake_Key(Key);

chartemp[64],temp_L[32],temp_R[32],L[32],R[32];

IP_Permutation(src,temp);

/*for(intj=0;j<64;j++)

cout<<temp[j];

cout<<endl;*/

Decompose_64(temp,temp_L,temp_R);

for(inti=0;i<16;i++)

{

StrCpy(temp_R,L,32);

F_Function(temp_R,R,i);

XOR(temp_L,R);

StrCpy(R,temp_R,64);

StrCpy(L,temp_L,64);

}

Combine_64(temp_R,temp_L,temp);

IP_1_Permutation(temp,dist);

Bitchar2char(dist,temp_dist);

}

DES加密解密的C++源程序,布布扣,bubuko.com

时间: 2024-10-06 18:57:39

DES加密解密的C++源程序的相关文章

DES加密解密算法

DES加密解密算法 // 仿射变换加解密.cpp : 定义控制台应用程序的入口点. // #include <stdio.h> #include <conio.h> static char key[10], key_a[5], code[8], key_b[5], temp[10], key_aa[8], key_bb[8], l[4], r[4], l_a[4], r_a[4], V[8] = { 0, 1, 0, 1, 0, 1, 0, 1 }, b[8]; char Code

des加密解密——java加密,php解密

最近在做项目中,遇到des加密解密的问题. 场景是安卓app端用des加密,php这边需要解密.之前没有接触过des这种加密解密算法,但想着肯定会有demo.因此百度,搜了代码来用.网上代码也是鱼龙混杂,好不容易测试在php这边测试加密和解密成功了.为确保安卓app端提交过来的加密参数能够解密出来,给定安卓人员一个字符串,让他们把des加密后的字符串给我,在php这边解密.结果一看,加密出来的字符串跟我这边加密出来的结果不一致,自然是解密不出来. 要来java的des算法代码,研究加密的过程,其

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

这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 php <?php class DES { var $key; var $iv; //偏移量 function DES($key, $iv=0) { $this->key = $key; if($iv == 0) { $this->iv = $key; } else { $this->iv = $iv; } } //加

DES加密解密帮助类

public class DESCrypto { /// <summary> /// 初始化des实例秘钥及向量 /// </summary> /// <param name="key"></param> /// <returns></returns> private static DESCryptoServiceProvider InitDESInstance(string key) { DESCryptoSer

DES加密解密字符串的JAVA实现(lp)

野火烧不尽,春风吹又生.众里寻他千百度,蓦然回首,那人却在灯火阑珊处.天作孽,犹可违,自作孽,不可活.山高月小,水落石出.晴川历历汉阳树,芳草萋萋鹦鹉洲. package test.des2.tt; /** * * 这个是真正实用的.修正了以前方法的只加密了前8位正确的bug. */ import java.security.*; import javax.crypto.*; public class DESPlus { private static String strDefaultKey =

C# Java DES加密解密

c#代码: public class DESHelper    {          /// <summary>        /// DES加密算法        /// </summary>        /// <param name="encryptString">要加密的字符串</param>        /// <param name="sKey">加密码Key</param>  

.net实现md5加密 sha1加密 sha256加密 sha384加密 sha512加密 des加密解密

写项目时,后台一直用md5加密,一天群里人问,除了MD5还有其它的加密方法吗?当时只知道还有个SHA,但怎么实现什么的都不清楚,于是当网上找了下,把几种常见的加密方法都整理了下,用winform写了个程序,如图: 关键代码 using System.Security;using System.Security.Cryptography;using System.Web;using System.IO; //MD5 不区分大小写的        //type 类型,16位还是32位,16位就是取3

php使用openssl进行Rsa长数据加密(117)解密(128) 和 DES 加密解密

PHP使用openssl进行Rsa加密,如果要加密的明文太长则会出错,解决方法:加密的时候117个字符加密一次,然后把所有的密文拼接成一个密文:解密的时候需要128个字符解密一下,然后拼接成数据. 加密: /** * 加密 * @param $originalData * @return string|void */ /*function encrypt($originalData){ // if (openssl_private_encrypt($originalData, $encryptD

JAVA使用DES加密解密

在使用DES加密解密的时候,遇到了一些问题,廖记一下.如有哪位大神亲临留言指点,不胜感激. 先上代码: public DESUtil() { } //密码,长度要是8的倍数 注意此处为简单密码 简单应用 要求不高时可用此密码 /*DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法.DES加密算法出自IBM的研究,后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,24小时内即可被破解.*/ private stati