⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 destool.cpp

📁 RSA算法的VC源码
💻 CPP
字号:
/*                             */
/*     Mwdes 0.1 1998-11-17    */
/*                             */
#include "stdafx.h"

#define uchar unsigned char

char p32i[] =
{
	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 aip[] =
{
	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
};
int afp[] =
{
	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
};
/* permuted choice table (key)  */
unsigned char pc1[] =
{
	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
};
int totrot[] =
{
   1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
};
unsigned char pc2[] =
{
	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
};
int sbox[8][4][16]={
/* S[1] */
	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
};
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
};
void char2bit(unsigned char datachar,int *databit)
{
	int i;
	for(i=0;i<8;i++) databit[i]=(datachar>>(7-i))&0x01;
	return;
}
void chartobit(unsigned char *sour,int data[])
{
	int i;
	for(i=0;i<8;i++){
		char2bit(sour[i],&data[i*8]);
	}
	return;
}
void box(int data01[48],int bits[32])
{
	int i=0;
	int row,line;
	int result[8];
	for(i=0;i<8;i++){
		row=data01[i*6+0]*2+data01[i*6+5]*1;
		line=data01[i*6+1]*8+data01[i*6+2]*4+data01[i*6+3]*2+
                        data01[i*6+4]*1;
		result[i]=sbox[i][row][line];
	}
	for(i=0;i<8;i++){
		bits[i*4+0]=(result[i]&15)>>3;
		bits[i*4+1]=(result[i]& 7)>>2;
		bits[i*4+2]=(result[i]& 3)>>1;
		bits[i*4+3]=(result[i]& 1)>>0;
	}
	return;
}
void expand(int data01[],int data02[])
{
	int i;
	for(i=0;i<48;i++){
		data02[i]=data01[e[i]-1];
	}
	return;
}
void bitxor(int data01[],int data02[],int len)
{
	int i;
	for(i=0;i<len;i++){
		data01[i]=(data01[i]==data02[i]?0:1);
	}
	return;
}
void ip(int data01[])
{
	int temp[64];
	int i=0;
	for(i=0;i<64;i++){
		temp[i]=data01[aip[i]-1];
	}
	for(i=0;i<64;i++)data01[i]=temp[i];
	return;
}
void fp(int data01[])
{
	int temp[64];
	int i=0;
	for(i=0;i<64;i++){
		temp[i]=data01[afp[i]-1];
	}
	for(i=0;i<64;i++)data01[i]=temp[i];
	return;
}
void p(int data01[])
{
	int i;
	int temp[32];
	for(i=0;i<32;i++){
		temp[i]=data01[p32i[i]-1];
	}
	for(i=0;i<32;i++)data01[i]=temp[i];
	return;
}
void bittochar(int data01[],uchar *data)
{
	int i;
	for(i=0;i<8;i++){
		data[i]=data01[i*8]*128+data01[i*8+1]*64+data01[i*8+2]*32+
			data01[i*8+3]*16+data01[i*8+4]*8+data01[i*8+5]*4+
			data01[i*8+6]*2+data01[i*8+7]*1;
	}
	return;
}
void fpc1(uchar *key,int c[],int d[])
{
	int temp[64];
	int data01[56];
	int i;
	chartobit(key,temp);
	for(i=0;i<56;i++)data01[i]=temp[pc1[i]-1];
	for(i=0;i<28;i++){
		c[i]=data01[i];
		d[i]=data01[i+28];
	}
	return;
}
void fkey(uchar *key,int sk[16][48])
{
	int c[28];
	int d[28];
	int temp[56];
	int ctemp=0;
	int dtemp=0;
	int i=0;
	int j=0;
	int k=0;
	fpc1(key,c,d);
	for(i=0;i<16;i++){
		for(j=0;j<totrot[i];j++){
			ctemp=c[0];
			dtemp=d[0];
			for(k=0;k<27;k++){
				c[k]=c[k+1];
				d[k]=d[k+1];
			}
			c[27]=ctemp;
			d[27]=dtemp;
		}
		for(k=0;k<28;k++){
			temp[k]=c[k];
			temp[k+28]=d[k];
		}
		for(k=0;k<48;k++)sk[i][k]=temp[pc2[k]-1];
	}
	return;
}
void mwdes(uchar *key,uchar *sour,uchar *dest,int m)
{
	int i,j;
	int data01[64];
	int l[32];
	int r[32];
	int data02[48];
	int data03[32];
	int k[16][48];
	fkey(key,k);
	chartobit(sour,data01);
	ip(data01);
	for(i=0;i<32;i++){
		l[i]=data01[i];
		r[i]=data01[i+32];
	}
	for(i=0;i<16;i++){
		expand(r,data02);
		if(m)bitxor(data02,k[i],48);
		else bitxor(data02,k[15-i],48);
		box(data02,data03);
		p(data03);
		bitxor(l,data03,32);
		for(j=0;j<32;j++){
			data03[j]=r[j];
			r[j]=l[j];
			l[j]=data03[j];
		}
	}
	for(j=0;j<32;j++){
		data01[j]=r[j];
		data01[j+32]=l[j];
	}
	fp(data01);
	bittochar(data01,dest);
		return;
}

void HexToChar(unsigned char*des,unsigned char*src,int len)
{
	char ch;
	//int len=16;
	for(int i=0;i<len;i++)
	{
		ch=src[i]&0x0f;
		if(ch<=9 && ch>=0)
			des[i*2+1]=ch+0x30;
		else
			des[i*2+1]=ch+0x61-10;

		ch=src[i]>>4;
		if(ch<=9 && ch>=0)
			des[i*2]=ch+0x30;
		else
			des[i*2]=ch+0x61-10;
	}
	//des[len*2]='\0';//这句话值得考虑
}

int CharToHex(UCHAR *des, UCHAR *src, int pair_len)
{
	char ch;
	
	for(int i=0;i<pair_len;i++)
	{
		if(src[i*2]>=0x61 && src[i*2]<=0x66)
		{
			ch=src[2*i]+10-0x61;
			des[i]=ch<<4;
		}
		else if(src[i*2]>=0x30 && src[i*2]<=0x39)
		{
			ch=src[2*i]-0x30;
			des[i]=ch<<4;
		}
		else if(src[i*2]>=0x41 && src[i*2]<=0x46)
		{
			ch=src[2*i]+10-0x41;
			des[i]=ch<<4;
		}
		else
			return 0;

		if(src[2*i+1]>=0x61 && src[2*i+1]<=0x66)
		{
			ch=src[2*i+1]+10-0x61;
			ch&=0x0f;
			des[i]|=ch;
		}
		else if(src[2*i+1]>=0x30 && src[2*i+1]<=0x39)
		{
			ch=src[2*i+1]-0x30;
			ch&=0x0f;
			des[i]|=ch;
		}
		else if(src[2*i+1]>=0x41 && src[2*i+1]<=0x46)
		{
			ch=src[2*i+1]+10-0x41;
			ch&=0x0f;
			des[i]|=ch;
		}
		else 
			return 0;
	}
	return 1;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -