📄 crypto.cpp
字号:
// 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 + -