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

📄 crypto.cpp

📁 这是一个用三种加密算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Crypto.cpp: implementation of the CCrypto class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "sernum.h"
#include "Crypto.h"
#include <stdlib.h>
#include <malloc.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCrypto::CCrypto()
{
	/*
	DWORD KnL[32] = { 0L };
	DWORD KnR[32] = { 0L };
	DWORD Kn3[32] = { 0L };
	BYTE Df_Key[24] = {
          0x0l, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
          0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
          0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67 
};
	WORD bytebit[8]    = {
          0200, 0100, 040, 020, 010, 04, 02, 01 
};
	DWORD bigbyte[24] = {
          0x800000L,    0x400000L,     0x200000L,    0x100000L,
		  0x80000L,     0x40000L,      0x20000L,     0x10000L,
          0x8000L,      0x4000L,       0x2000L,      0x1000L,
          0x800L,       0x400L,        0x200L,       0x100L,
          0x80L,        0x40L,         0x20L,        0x10L,
          0x8L,         0x4L,          0x2L,         0x1L   
};

	BYTE pc1[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 
};
	BYTE totrot[16] = {
           1,  2,  4,  6,  8, 10, 12, 14, 15, 17, 19, 21, 23, 25,
		  27, 28 
};
	BYTE pc2[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, 47, 43, 48, 38, 55, 33, 52,
		  45, 41, 49, 35, 28, 31 
};
	DWORD SP1[64] = {
		  0x01010400L, 0x00000000L, 0x00010000L, 0x01010404L,
		  0x01010004L, 0x00010404L, 0x00000004L, 0x00010000L,
		  0x00000400L, 0x01010400L, 0x01010404L, 0x00000400L,
		  0x01000404L, 0x01010004L, 0x01000000L, 0x00000004L,
		  0x00000404L, 0x01000400L, 0x01000400L, 0x00010400L,
		  0x00010400L, 0x01010000L, 0x01010000L, 0x01000404L,
		  0x00010004L, 0x01000004L, 0x01000004L, 0x00010004L,
		  0x00000000L, 0x00000404L, 0x00010404L, 0x01000000L,
		  0x00010000L, 0x01010404L, 0x00000004L, 0x01010000L,
		  0x01010400L, 0x01000000L, 0x01000000L, 0x00000400L,
		  0x01010004L, 0x00010000L, 0x00010400L, 0x01000004L,
		  0x00000400L, 0x00000004L, 0x01000404L, 0x00010404L,
		  0x01010404L, 0x00010004L, 0x01010000L, 0x01000404L,
		  0x01000004L, 0x00000404L, 0x00010404L, 0x01010400L,
		  0x00000404L, 0x01000400L, 0x01000400L, 0x00000000L,
		  0x00010004L, 0x00010400L, 0x00000000L, 0x01010004L
};
	DWORD SP2[64] = {
		  0x80108020L, 0x80008000L, 0x00008000L, 0x00108020L,
		  0x00100000L, 0x00000020L, 0x80100020L, 0x80008020L,
		  0x80000020L, 0x80108020L, 0x80108000L, 0x80000000L,
		  0x80008000L, 0x00100000L, 0x00000020L, 0x80100020L,
		  0x00108000L, 0x00100020L, 0x80008020L, 0x00000000L,
		  0x80000000L, 0x00008000L, 0x00108020L, 0x80100000L,
		  0x00100020L, 0x80000020L, 0x00000000L, 0x00108000L,
		  0x00008020L, 0x80108000L, 0x80100000L, 0x00008020L,
		  0x00000000L, 0x00108020L, 0x80100020L, 0x00100000L,
		  0x80008020L, 0x80100000L, 0x80108000L, 0x00008000L,
		  0x80100000L, 0x80008000L, 0x00000020L, 0x80108020L,
		  0x00108020L, 0x00000020L, 0x00008000L, 0x80000000L,
		  0x00008020L, 0x80108000L, 0x00100000L, 0x80000020L,
		  0x00100020L, 0x80008020L, 0x80000020L, 0x00100020L,
		  0x00108000L, 0x00000000L, 0x80008000L, 0x00008020L,
		  0x80000000L, 0x80100020L, 0x80108020L, 0x00108000L
};
	DWORD SP3[64] = {
          0x00000208L, 0x08020200L, 0x00000000L, 0x08020008L,
          0x08000200L, 0x00000000L, 0x00020208L, 0x08000200L,
          0x00020008L, 0x08000008L, 0x08000008L, 0x00020000L,
          0x08020208L, 0x00020008L, 0x08020000L, 0x00000208L,
          0x08000000L, 0x00000008L, 0x08020200L, 0x00000200L,
          0x00020200L, 0x08020000L, 0x08020008L, 0x00020208L,
          0x08000208L, 0x00020200L, 0x00020000L, 0x08000208L,
          0x00000008L, 0x08020208L, 0x00000200L, 0x08000000L,
          0x08020200L, 0x08000000L, 0x00020008L, 0x00000208L,
          0x00020000L, 0x08020200L, 0x08000200L, 0x00000000L,
          0x00000200L, 0x00020008L, 0x08020208L, 0x08000200L,
          0x08000008L, 0x00000200L, 0x00000000L, 0x08020008L,
          0x08000208L, 0x00020000L, 0x08000000L, 0x08020208L,
          0x00000008L, 0x00020208L, 0x00020200L, 0x08000008L,
          0x08020000L, 0x08000208L, 0x00000208L, 0x08020000L,
          0x00020208L, 0x00000008L, 0x08020008L, 0x00020200L
};
	DWORD SP4[64] = {
          0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
          0x00802080L, 0x00800081L, 0x00800001L, 0x00002001L,
          0x00000000L, 0x00802000L, 0x00802000L, 0x00802081L,
          0x00000081L, 0x00000000L, 0x00800080L, 0x00800001L,
          0x00000001L, 0x00002000L, 0x00800000L, 0x00802001L,
          0x00000080L, 0x00800000L, 0x00002001L, 0x00002080L,
          0x00800081L, 0x00000001L, 0x00002080L, 0x00800080L,
          0x00002000L, 0x00802080L, 0x00802081L, 0x00000081L,
          0x00800080L, 0x00800001L, 0x00802000L, 0x00802081L,
          0x00000081L, 0x00000000L, 0x00000000L, 0x00802000L,
          0x00002080L, 0x00800080L, 0x00800081L, 0x00000001L,
          0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
          0x00802081L, 0x00000081L, 0x00000001L, 0x00002000L,
          0x00800001L, 0x00002001L, 0x00802080L, 0x00800081L,
          0x00002001L, 0x00002080L, 0x00800000L, 0x00802001L,
		  0x00000080L, 0x00800000L, 0x00002000L, 0x00802080L
};
	DWORD SP5[64] = {  
          0x00000100L, 0x02080100L, 0x02080000L, 0x42000100L,
          0x00080000L, 0x00000100L, 0x40000000L, 0x02080000L,
          0x40080100L, 0x00080000L, 0x02000100L, 0x40080100L,
          0x42000100L, 0x42080000L, 0x00080100L, 0x40000000L,
          0x02000000L, 0x40080000L, 0x40080000L, 0x00000000L,
          0x40000100L, 0x42080100L, 0x42080100L, 0x02000100L,
          0x42080000L, 0x40000100L, 0x00000000L, 0x42000000L,
          0x02080100L, 0x02000000L, 0x42000000L, 0x00080100L,
          0x00080000L, 0x42000100L, 0x00000100L, 0x02000000L,
          0x40000000L, 0x02080000L, 0x42000100L, 0x40080100L,
          0x02000100L, 0x40000000L, 0x42080000L, 0x02080100L,
          0x40080100L, 0x00000100L, 0x02000000L, 0x42080000L,
          0x42080100L, 0x00080100L, 0x42000000L, 0x42080100L,
          0x02080000L, 0x00000000L, 0x40080000L, 0x42000000L,
          0x00080100L, 0x02000100L, 0x40000100L, 0x00080000L,
          0x00000000L, 0x40080000L, 0x02080100L, 0x40000100L
};
	DWORD SP6[64] = {
          0x20000010L, 0x20400000L, 0x00004000L, 0x20404010L,
          0x20400000L, 0x00000010L, 0x20404010L, 0x00400000L,
          0x20004000L, 0x00404010L, 0x00400000L, 0x20000010L,
          0x00400010L, 0x20004000L, 0x20000000L, 0x00004010L,
          0x00000000L, 0x00400010L, 0x20004010L, 0x00004000L,
          0x00404000L, 0x20004010L, 0x00000010L, 0x20400010L,
          0x20400010L, 0x00000000L, 0x00404010L, 0x20404000L,
          0x00004010L, 0x00404000L, 0x20404000L, 0x20000000L,
          0x20004000L, 0x00000010L, 0x20400010L, 0x00404000L,
		  0x20404010L, 0x00400000L, 0x00004010L, 0x20000010L,
		  0x00400000L, 0x20004000L, 0x20000000L, 0x00004010L,
          0x02000010L, 0x20404010L, 0x00404000L, 0x20400000L,
          0x00404010L, 0x20404000L, 0x00000000L, 0x20400010L,
          0x00000010L, 0x00004000L, 0x20400000L, 0x00404010L,
          0x00004000L, 0x00400010L, 0x20004010L, 0x00000000L,
          0x20404000L, 0x20000000L, 0x00400010L, 0x20004010L 
};
	DWORD SP7[64] = {
          0x00200000L, 0x04200002L, 0x04000802L, 0x00000000L,
          0x00000800L, 0x04000802L, 0x00200802L, 0x04200800L,
          0x04200802L, 0x00200000L, 0x00000000L, 0x04000002L,
          0x00000002L, 0x04000000L, 0x04200002L, 0x00000802L,
          0x04000800L, 0x00200802L, 0x00200002L, 0x04000800L,
          0x04000002L, 0x04200000L, 0x04200800L, 0x00200002L,
          0x04200000L, 0x00000800L, 0x00000802L, 0x04200802L,
          0x00200800L, 0x00000002L, 0x04000000L, 0x00200800L,
          0x04000000L, 0x00200800L, 0x00200000L, 0x04000802L,
          0x04000802L, 0x04200002L, 0x04200002L, 0x00000002L,
          0x00200002L, 0x04000000L, 0x04000800L, 0x00200000L,
          0x04200800L, 0x00000802L, 0x00200802L, 0x04200800L,
          0x00000802L, 0x04000002L, 0x04200802L, 0x04200000L,
          0x00200800L, 0x00000000L, 0x00000002L, 0x04200802L,
          0x00000000L, 0x00200802L, 0x04200000L, 0x00000800L,
          0x04000002L, 0x04000800L, 0x00000800L, 0x00200002L 
};
	DWORD SP8[64] = {
	      0x10001040L, 0x00001000L, 0x00040000L, 0x10041040L,
          0x10000000L, 0x10001040L, 0x00000040L, 0x10000000L,
          0x00040040L, 0x10040000L, 0x10041040L, 0x00041000L,
          0x10041000L, 0x00041040L, 0x00001000L, 0x00000040L,
          0x10040000L, 0x10000040L, 0x10001000L, 0x00001040L,
          0x00041000L, 0x00040040L, 0x10040040L, 0x10041000L,
          0x00001040L, 0x00000000L, 0x00000000L, 0x10040040L,
          0x10000040L, 0x10001000L, 0x00041040L, 0x00040000L,
          0x00041040L, 0x00040000L, 0x10041000L, 0x00001000L,
          0x00000040L, 0x10040040L, 0x00001000L, 0x00041040L,
          0x10001000L, 0x00000040L, 0x10000040L, 0x10040000L,
          0x10040040L, 0x10000000L, 0x00040000L, 0x10001040L,
          0x00000000L, 0x10041040L, 0x00040040L, 0x10000040L,
          0x10040000L, 0x10001000L, 0x10001040L, 0x00000000L,
          0x10041040L, 0x00041000L, 0x00041000L, 0x00001040L,
          0x00001040L, 0x00040040L, 0x10000000L, 0x10041000L
};
	*/
}

CCrypto::~CCrypto()
{
	
/*	delete[] &KnL;
	delete[] &KnR;
	delete[] &Kn3;
	delete[] &Df_Key;
	delete[] &bytebit;
	delete[] &bigbyte;
	delete[] &pc1;
	delete[] &totrot;
	delete[] &pc2;
	delete[] &SP1;
	delete[] &SP2;
	delete[] &SP3;
	delete[] &SP4;
	delete[] &SP5;
	delete[] &SP6;
	delete[] &SP7;
	delete[] &SP8;
*/	
}

void CCrypto::rc5_destroy(rc5_ctx *c)
{
	int i;
	for(i=0;i<(c->nr)*2+2;i++)
		c->xk[i]=0;
	free(c->xk);
}

void CCrypto::rc5_init(rc5_ctx *c, int rounds)
{
	c->nr=rounds;
	c->xk=(DWORD *)malloc(4*(rounds*2+2));
}

BOOL CCrypto::rc5_key(rc5_ctx *c, BYTE *key, int keylen)
{
	DWORD pk[10],A,B;
	int xk_len,pk_len,i,num_steps,rc;
	DWORD *cp;
	xk_len=c->nr*2+2;
	pk_len=keylen/4;
	if((keylen%4)!=0) 
		pk_len+=1;
	//pk=(DWORD *)malloc(pk_len * 4);
	//if(pk==NULL)
	//	return(false);
	for(i=0;i<pk_len;i++)
		pk[i]=0;
	cp=&pk[0];
	for(i=0;i<keylen;i++)
		cp[i]=key[i];
	c->xk[0]=0xb7e15163;
	for(i=1;i<xk_len;i++)
		c->xk[i]=c->xk[i-1]+0x9e3779b9;
	A=B=0;
	for(i=0;i<xk_len;i++)
	{
		A=A + c->xk[i];
		B=B ^ c->xk[i];
	};
	if(pk_len>xk_len) 
		num_steps=3*pk_len;
	else
		num_steps=3*xk_len;
	A=B=0;
	for(i=0;i<num_steps;i++)
	{
		A=c->xk[i % xk_len]=ROTL32(c->xk[i % xk_len] + A + B,3);
		rc=(A+B) & 31;
		B=pk[i % pk_len]=ROTL32(pk[i % pk_len]+ A + B,rc);
	};
	for(i=0;i<pk_len;i++)
		pk[i]=0;
	//delete pk;
//	free(pk);
	return(true);
}

void CCrypto::rc5_encrypt(rc5_ctx *c, DWORD *data, int blocks)
{
	DWORD *d,*sk;
	int h,i,rc;
	d=data;
	sk=(c->xk)+2;
	for(h=0;h<blocks;h++)
	{
		d[0]+=c->xk[0];
		d[1]+=c->xk[1];
		for(i=0;i<c->nr*2;i+=2)
		{
			d[0]^=d[1];
			rc=d[1] & 31;
			d[0]=ROTL32(d[1],rc);
			d[0]+=sk[i];
			d[1]^=d[0];
			rc=d[0] & 31;
			d[1]=ROTL32(d[1],rc);
			d[1]+=sk[i+1];
		};
		d+=2;
	}
}

int CCrypto::seal_g(BYTE *in, int i,DWORD *h)
{
	DWORD h0;
	DWORD h1;
	DWORD h2;
	DWORD h3;
	DWORD h4;
	DWORD a;
	DWORD b;
	DWORD c;
	DWORD d;
	DWORD e;
	BYTE *kp;
	DWORD w[80];
	DWORD temp;
	kp=in;
	h0=WORD(kp);
	kp+=4;
	h1=WORD(kp);
	kp+=4;
	h2=WORD(kp);
	kp+=4;
	h3=WORD(kp);
	kp+=4;
	h4=WORD(kp);
	kp+=4;
	w[0]=i;
	for(i=1;i<16;i++)
		w[i]=0;
	for(i=16;i<80;i++)
		w[i]=w[i-3]^w[i-8]^w[i-14]^w[i-16];
	a=h0;
	b=h1;
	c=h2;
	d=h3;
	e=h4;
	for(i=0;i<20;i++)
	{
		temp=ROT27(a) + F1(b,c,d) + e + w[i] + 0x5a827999;
		e=d;
		d=c;
		c=ROT2(b);
		b=a;
		a=temp;
	};
	for(i=20;i<40;i++)
	{
		temp=ROT27(a)+F2(b,c,d)+e+w[i]+0x6ed9eba1;
		e=d;
		d=c;
		c=ROT2(b);
		b=a;
		a=temp;
	};
	for(i=40;i<60;i++)
	{
		temp=ROT27(a)+F3(b,c,d)+e+w[i]+0x8f1bbcdc;
		d=c;
		c=ROT2(b);
		b=a;
		a=temp;
	};
	for(i=60;i<80;i++)
	{
		temp=ROT27(a)+F4(b,c,d)+e+w[i]+0xca62c1d6;
		e=d;
		d=c;
		c=ROT2(b);
		b=a;
		a=temp;
	};
	h[0]=h0+a;
	h[1]=h1+b;
	h[2]=h2+c;
	h[3]=h3+d;
	h[4]=h4+e;
	return(ALG_OK);
}

DWORD CCrypto::seal_gamma(BYTE *a, int i)
{
	DWORD h[5];
	(void) seal_g(a,i/5,h);
	return h[i % 5];
}

int CCrypto::seal_init(seal_ctx *result, BYTE *key)
{
	int i;
	DWORD h[5];
	for(i=0;i<510;i+=5)
		seal_g(key,i/5,&(result->t[i]));
	seal_g(key,510/5,h);
	for(i=510;i<512;i++)
		result->t[i]=h[i-510];
	seal_g(key,(-1+0x1000)/5,h);
	for(i=0;i<4;i++)
		result->s[i]=h[i+1];
	for(i=4;i<254;i+=5)
		seal_g(key,(i+0x1000)/5,&(result->s[i]));
	seal_g(key,(254+0x1000)/5,h);
	for(i=254;i<256;i++)
		result->s[i]=h[i-254];
	seal_g(key,(-2+0x2000)/5,h);
	for(i=0;i<3;i++)
		result->r[i]=h[i+2];
	for(i=3;i<13;i+=5)
		seal_g(key,(i+0x2000)/5,&(result->r[i]));
	seal_g(key,(13+0x2000)/5,h);
	for(i=13;i<16;i++)
		result->r[i]=h[i-13];
	return(ALG_OK);
}

int CCrypto::seal(seal_ctx *key, DWORD in, DWORD *out)
{
	int i;
	int j;
	int l;
	DWORD a;
	DWORD b;
	DWORD c;
	DWORD d;
	WORD p;
	WORD q;
	DWORD n1;
	DWORD n2;
	DWORD n3;
	DWORD n4;
	DWORD *wp;
	wp=out;
	for(l=0;l<4;l++)
	{
		a=in^key->r[4*l];
		b=ROT8(in)^key->r[4*l+1];
		c=ROT16(in)^key->r[4*l+2];
		d=ROT24(in)^key->r[4*l+3];
		for(j=0;j<2;j++)
		{
			p=(WORD)(a & 0x000007fc);
			b+=key->t[p/4];
			a=ROT9(a);

			p=(WORD)(b & 0x000007fc);
			c+=key->t[p/4];
			b=ROT9(b);

			p=(WORD)(c & 0x000007fc);
			d+=key->t[p/4];
			c=ROT9(c);

			p=(WORD)(d & 0x000007fc);
			a+=key->t[p/4];
			d=ROT9(d);
		};
		n1=d;
		n2=b;
		n3=a;
		n4=c;

		p=(WORD)(a & 0x000007fc);
		b+=key->t[p/4];
		a=ROT9(a);
		
		p=(WORD)(b & 0x000007fc);
		c+=key->t[p/4];
		b=ROT9(b);

		p=(WORD)(c & 0x000007fc);
		d+=key->t[p/4];
		c=ROT9(c);

		p=(WORD)(d & 0x000007fc);
		a+=key->t[p/4];
		d=ROT9(d);

		for(i=0;i<64;i++)
		{
			p=(WORD)(a & 0x000007fc);
			b+=key->t[p/4] ;
			a=ROT9(a);
			b^=a;
			
			q=(WORD)(b & 0x000007fc);
			c^=key->t[q/4] ;
			b=ROT9(b);
			c+=b;

			p=(WORD)((p+c) & 0x000007fc);
			d+=key->t[p/4] ;
			c=ROT9(c);
			d^=c;

			q=(WORD)((q+d) & 0x000007fc);
			a^=key->t[q/4] ;
			d=ROT9(d);
			a+=d;

			p=(WORD)((p+a) & 0x000007fc);
			b^=key->t[q/4] ;
			a=ROT9(a);

			q=(WORD)((q+b) & 0x000007fc);
			c+=key->t[p/4] ;
			b=ROT9(b);

			p=(WORD)((p+c) & 0x000007fc);
			d^=key->t[q/4] ;
			c=ROT9(c);

			q=(WORD)((q+b) & 0x000007fc);
			a+=key->t[p/4] ;
			d=ROT9(d);

			*wp=b+key->s[4*i];
			wp++;
			*wp=c^key->s[4*i+1];
			wp++;
			*wp=d+key->s[4*i+2];
			wp++;
			*wp=a^key->s[4*i+3];
			wp++;

			if(i & 1)
			{
				a+=n3;
				c+=n4;
			}
			else
			{
				a+=n1;
				c+=n2;
			}
		}
		}
		return(ALG_OK);			
}

void CCrypto::seal_refill_buffer(seal_ctx *c)
{
	seal(c,c->counter,c->ks_buf);
	c->counter++;
	c->ks_pos=0;
}

void CCrypto::seal_key(seal_ctx *c, BYTE *key)
{
	seal_init(c,key);
	c->counter=0;
	c->ks_pos=WORDS_PER_SEAL_CALL;
}

void CCrypto::seal_encrypt(seal_ctx *c, DWORD *data_ptr, int w)
{
	int i;
	for(i=0;i<w;i++)
	{
		if(c->ks_pos>WORDS_PER_SEAL_CALL) seal_refill_buffer(c);
		data_ptr[i]^=c->ks_buf[c->ks_pos];
		c->ks_pos++;
	}
}

⌨️ 快捷键说明

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