问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用C++或者C语言实现DES算法,明文learing,密钥computer.求出密文(写出过程)

发布网友 发布时间:2022-04-23 08:29

我来回答

2个回答

热心网友 时间:2023-10-08 19:12

#include

DWORDLONG dwlKey_PC_1[64]={
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,0};

DWORDLONG dwlKey_PC_2[64]={
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,0};

DWORDLONG dwlData_IP[65]={
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,0};

DWORDLONG dwlData_Expansion[64]={
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,0};

DWORDLONG dwlData_P[33]={
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,0};

DWORDLONG dwlData_FP[65]={
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,0};

DWORDLONG OS[512]={
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
};
-------------------------------------
des.cpp
-------------------------------------

/*注意:这只是标准DES算法的例子,所以速度并不是很快,不适用于大量数据加密的场*/
/*合.UNIX的密码也采用DES,不过它在里面加了点其它的东西.所以结果和DES的结果 */
/*不一样. 由于使用了WINDOWS类库,所以必须在WINDOWS环境下编译. */
/**************************************************************************/

#include
#include
#include
#include
#include "Schedle.h"

class CShift{
public:
DWORDLONG mask[16];
int step[16];
CShift(){
for(int i=0;i step=2;
mask=0xc000000;
}
step[0]=step[1]=step[8]=step[15]=1;
mask[0]=mask[1]=mask[8]=mask[15]=0x8000000;
}
};

class CDES{

public:

CDES(){
m_dwlKey=0;
m_dwlData=0;
ConvertTableToMask(dwlKey_PC_1,64);
//PrintTable(dwlKey_PC_1,7,8);
ConvertTableToMask(dwlKey_PC_2,56);
ConvertTableToMask(dwlData_IP,64);
ConvertTableToMask(dwlData_Expansion,32);
ConvertTableToMask(dwlData_FP,64);
ConvertTableToMask(dwlData_P,32);
Generate_S();

}
void PrintBit(DWORDLONG);
void EncryptKey(char *);
unsigned char* EncryptData(unsigned char *);
unsigned char* DescryptData(unsigned char*);

private:
void ConvertTableToMask(DWORDLONG *,int);
void Generate_S(void);
void PrintTable(DWORDLONG*,int,int);
DWORDLONG ProcessByte(unsigned char*,BOOL);
DWORDLONG PermuteTable(DWORDLONG,DWORDLONG*,int);
void Generate_K(void);
void EncryptKernel(void);
DWORDLONG Generate_B(DWORDLONG,DWORDLONG*);
/*For verify schele permutation only*/
DWORDLONG UnPermuteTable(DWORDLONG,DWORDLONG*,int);
/**************************************/
DWORDLONG dwlData_S[9][4][16];
CShift m_shift;
DWORDLONG m_dwlKey;
DWORDLONG m_dwlData;
DWORDLONG m_dwl_K[17];
};

void CDES::EncryptKey(char *key){

printf("\nOriginal Key: %s",key);
m_dwlKey=ProcessByte((unsigned char*)key,TRUE);
//PrintBit(m_dwlKey);
m_dwlKey=PermuteTable(m_dwlKey,dwlKey_PC_1,56);
//PrintBit(m_dwlKey);
Generate_K();
//printf("\n******************************************\n");
}

void CDES::Generate_K(void){

DWORDLONG C[17],D[17],tmp;

C[0]=m_dwlKey>>28;
D[0]=m_dwlKey&0xfffffff;

for(int i=1;i tmp=(C[i-1]&m_shift.mask[i-1])>>(28-m_shift.step[i-1]);
C=((C[i-1] tmp=(D[i-1]&m_shift.mask[i-1])>>(28-m_shift.step[i-1]);
D=((D[i-1] m_dwl_K=(C m_dwl_K=PermuteTable(m_dwl_K,dwlKey_PC_2,48);
}
}

DWORDLONG CDES::ProcessByte(unsigned char *key,BOOL shift){

unsigned char tmp;
DWORDLONG byte=0;
int i=0;

while(i while(*key){
if(byte!=0)
byte tmp=*key;
if(shift)
tmp byte│=tmp;
i++;
key++;
}
if(i byte i++;
}
return byte;
}

DWORDLONG CDES::PermuteTable(DWORDLONG dwlPara,DWORDLONG* dwlTable,int nDestLen)
{

int i=0;
DWORDLONG tmp=0,moveBit;

while(i moveBit=1;
if(dwlTable&dwlPara){
moveBit tmp│=moveBit;
}
i++;
}
return tmp;
}

DWORDLONG CDES::UnPermuteTable(DWORDLONG dwlPara,DWORDLONG* dwlTable,int nDestLe
n){

DWORDLONG tmp=0;
int i=nDestLen-1;

while(dwlPara!=0){
if(dwlPara&0x01)
tmp│=dwlTable;
dwlPara>>=1;
i--;
}
return tmp;
}

void CDES::PrintTable(DWORDLONG *dwlPara,int col,int row){

int i,j;
for(i=0;i printf("\n");
getch();
for(j=0;j PrintBit(dwlPara[i*col+j]);
}
}

void CDES::PrintBit(DWORDLONG bitstream){

char out[76];
int i=0,j=0,space=0;

while(bitstream!=0){
if(bitstream&0x01)
out[i++]='1';
else
out[i++]='0';
j++;
if(j%8==0){
out[i++]=' ';
space++;
}

bitstream=bitstream>>1;
}
out='\0';
strcpy(out,strrev(out));
printf("%s **:%d\n",out,i-space);
}

void CDES::ConvertTableToMask(DWORDLONG *mask,int max){

int i=0;
DWORDLONG nBit=1;

while(mask!=0){
nBit=1;
nBit mask[i++]=nBit;
}
}

void CDES::Generate_S(void){

int i;
int j,m,n;
m=n=0;
j=1;

for(i=0;i dwlData_S[j][m][n]=OS;
n=(n+1)%16;
if(!n){
m=(m+1)%4;
if(!m)
j++;
}
}
}

unsigned char * CDES::EncryptData(unsigned char *block){

unsigned char *EncrytedData=new unsigned char(15);

printf("\nOriginal Data: %s\n",block);
m_dwlData=ProcessByte(block,0);
//PrintBit(m_dwlData);
m_dwlData=PermuteTable(m_dwlData,dwlData_IP,64);
EncryptKernel();
//PrintBit(m_dwlData);
DWORDLONG bit6=m_dwlData;
for(int i=0;i EncrytedData[7-i]=(unsigned char)(bit6&0x3f)+46;
bit6>>=6;
}
EncrytedData[11]='\0';
printf("\nAfter Encrypted: %s",EncrytedData);

for(i=0;i EncrytedData[7-i]=(unsigned char)(m_dwlData&0xff);
m_dwlData>>=8;
}
EncrytedData[8]='\0';

return EncrytedData;
}

void CDES::EncryptKernel(void){

int i=1;

DWORDLONG L[17],R[17],B[9],EK,PSB;
L[0]=m_dwlData>>32;
R[0]=m_dwlData&0xffffffff;

for(i=1;i L=R[i-1];
R[i-1]=PermuteTable(R[i-1],dwlData_Expansion,48);//Expansion R
EK=R[i-1]^m_dwl_K;//E Permutation
PSB=Generate_B(EK,B);//P Permutation
R=L[i-1]^PSB;
}

R[16] m_dwlData=R[16]│L[16];
m_dwlData=PermuteTable(m_dwlData,dwlData_FP,64);
}

unsigned char* CDES::DescryptData(unsigned char *desData){

int i=1;
unsigned char *DescryptedData=new unsigned char(15);
DWORDLONG L[17],R[17],B[9],EK,PSB;
DWORDLONG dataPara;

dataPara=ProcessByte(desData,0);
dataPara=PermuteTable(dataPara,dwlData_IP,64);

R[16]=dataPara>>32;
L[16]=dataPara&0xffffffff;

for(i=16;i>=1;i--){
R[i-1]=L;
L=PermuteTable(L,dwlData_Expansion,48);//Expansion L
EK=L^m_dwl_K;//E Permutation
PSB=Generate_B(EK,B);//P Permutation
L[i-1]=R^PSB;
}

L[0] dataPara=L[0]│R[0];
dataPara=PermuteTable(dataPara,dwlData_FP,64);

//PrintBit(dataPara);

for(i=0;i DescryptedData[7-i]=(unsigned char)(dataPara&0xff);
dataPara>>=8;
}
DescryptedData[8]='\0';
printf("\nAfter Decrypted: %s\n",DescryptedData);

return DescryptedData;
}

DWORDLONG CDES::Generate_B(DWORDLONG EKPara,DWORDLONG *block){

int i,m,n;
DWORDLONG tmp=0;

for(i=8;i>0;i--){
block=EKPara&0x3f;
m=(int)(block&0x20)>>4;
m│=block&0x01;
n=(int)(block >2;
block=dwlData_S[m][n];
EKPara>>=6;
}

for(i=1;i tmp│=block;
tmp }
tmp>>=4;
tmp=PermuteTable(tmp,dwlData_P,32);

return tmp;
}

void main(void){

CDES des;
des.EncryptKey("12345678");
unsigned char *result=des.EncryptData((unsigned char*)"DemoData");
des.DescryptData(result);
}

热心网友 时间:2023-10-08 19:13

啥叫 DES ,不懂
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
米色的双面呢羊毛大衣有哪些时髦又随性的搭配思路值得分享? 双面羊绒大衣搭配什么裤子(短款羊绒大衣搭配什么下装比较好看?) 银杏烤多久熟 银杏果烤着吃是烤干的还是湿的? 签了离婚协议就是离婚了吗 汽车PID检测是什么意思 仪表pid控制什么意思 CAN总线温度传感器 公共管理学说史内容简介 《公共行政学史》读书笔记 如何服务西餐菜肴 请问属兔女用什么网名 制作货代报价单的word格式一般是怎样的? 姓杨属兔的女孩取名字,帮帮忙 汽车英语缩写 属兔的女孩子起名字 hifi音箱排名比较好的品牌有哪些 光合细菌培养基的配方是什么? 属兔女孩什么名字大全 BIOS里怎样更改CPU电压?? 属兔的女孩名字宜用哪些字? 女人属兔取什么名字有财气 属兔女人的微信名字,最好四个字 属兔的女孩名为茜茹可以吗? 扇贝是蒸还是煮 清蒸扇贝怎样做 怎么蒸扇贝 扇贝蒸多长时间能熟?怎么做才好吃呢? 华为手机为什么总播放电话铃声? 蒸扇贝的做法,蒸扇贝怎么做好吃,蒸扇贝的家常做法 清蒸扇贝怎么做好吃 组装能玩CF的电脑要多少钱?(含显示器) 属兔的女孩名字叫董宣琦好不好? Roland E-09的详细介绍 属兔起名字女孩 姓刘 求翻译一篇,200分悬赏。不要翻译软件的哦~ 起个女孩名字,简单特别点的,姓李、属兔,要顺口… 日语外贸跟单都做些什么工作?说的越详细越好! 女孩子属兔姚要取什么名字好听的 谁能给我最好的报价单样本,麻烦帮帮忙。谢谢 Ctrl+L,在ps中什么意思 怎么腌制五香萝卜干的家常做法视频讲解 求AVR(ATmega8L)读写DS12C887(时钟芯片)的C语言例子程序。 罗卜罗卜干怎么腌制才好吃视频 PSB-16插头用什么插线板 哪位老师知道光合细菌培养基的配方,请赐教。 飞利浦190V3L的其他参数 如何淹萝卜干 家常腌制萝卜干的做法视频欣赏,你了解了吗 手机怎么秒传链接提取? 手机百度秒链怎么弄啊?