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

📄 desutil.~c

📁 RSA C++源代码DEMO,附加DESMD5等众多算法
💻 ~C
字号:
/*
 * desutil.c
 *
 *  writen by alfred meng
 */
#include "string.h"
#include "crypto.h"
#include    "md.h"

void  SHA1 ( unsigned char *pt, short len_md, unsigned char *digest )
{
    short l;
    unsigned char *p;
    SHA1CTX  ctx;

    SHA1_Init(&ctx);
    p = pt;
    while(len_md > 0) {          if(len_md > 64)
		  l = 64;
	  else
		  l = len_md;

	  SHA1_Update(&ctx, p, l);
	  p += l;
	  len_md -= l;
    }    SHA1_Final(digest,&ctx);
}
//-----------------------------------------------------------------------------
void  MD5  ( unsigned char *pt, short len_md, unsigned char *digest )
{
    short l;
    unsigned char *p;
    MD5CTX   ctx;

    MD5_Init(&ctx);
    p = pt;
    while(len_md > 0) {          if(len_md > 64)
		  l = 64;
	  else
		  l = len_md;

	  MD5_Update(&ctx, p, l);
	  p += l;
	  len_md -= l;
    }    MD5_Final(digest,&ctx);
}
//-----------------------------------------------------------------------------
void  tripledes(char *key,char *data,char *out,int op)
{
    char to[8],to1[8];

    if ( op == DES_E ) {
       qdes(key,data,to,DES_E);   /* L */
       qdes(key+8,to,to1,DES_D);  /* R */
       qdes(key,to1,out,DES_E);   /* L */
    } else {
       qdes(key,data,to,DES_D);   /* L */
       qdes(key+8,to,to1,DES_E);  /* R */
       qdes(key,to1,out,DES_D);   /* L */
    }
}

void  cbc_crypt(char *key,char *data, char *out, int op)
{
    short len;
    char  pad[8] = "\x80\x00\x00\x00\x00\x00\x00\x00";
    char  tmp[8];

    if ( op == DES_E ) {
       tripledes(key,data,out,op);
       xorblock(pad,out);
       tripledes(key,pad,out+8,op);
    } else {
       tripledes(key,data,out,op);
    }
}

int   padding(char *data, int len)
{
    int i,n,f;

    data[len] = 0x80;
    len++;

//    n = len/8;
    f = len%8;
    n = len;
    if ( f > 0 ) len +=(8-f);
    for(i=0; i<(8-f); i++ ) data[n+i]=0x0;
    return len;
}

void xorblock(char *d1,char *d2)
{
   unsigned long l11,l12;
   unsigned long l21,l22;

   l11 = *(unsigned long *)d1;
   l12 = *(unsigned long *)(d1+4);

   l21 = *(unsigned long *)d2;
   l22 = *(unsigned long *)(d2+4);
   l11 ^=l21;
   l12 ^=l22;
   *(unsigned long *)d1 = l11;
   *(unsigned long *)(d1+4) = l12;
}

void  notblock(char *ds)
{
   unsigned long l11,l12;

   l11 = *(unsigned long *)ds;
   l12 = *(unsigned long *)(ds+4);
   l11 = ~l11;
   l12 = ~l12;
   *(unsigned long *)ds = l11;
   *(unsigned long *)(ds+4) = l12;
}

void  gmac(char alg,char *key, char *data, short dl, char *mac, char *icv )
/*
 *
 *  CBC Method
 *
 */
{
    int  i;
    unsigned char tb[8],buf[8];

    memcpy(tb,icv,8);

    for(i=0;i<dl;i+=8) {
       xorblock(tb,data+i);
       qdes(key,tb,buf,DES_E);
       memcpy(tb,buf,8);
    }

    if ( alg == TRIPLE_DES ) {
        qdes(key+8,tb,buf,DES_D);
        qdes(key,buf,tb,DES_E);
    }
    memcpy(mac,tb,8);
}

void diversify(char *MxK, char *factor, char *DxK)
{
    char res[32];
    char tmpF[32];

    memcpy(tmpF,factor,8);
    tripledes(MxK,tmpF,res,DES_E);
    memcpy(DxK,res,8);
    notblock(tmpF);
    tripledes(MxK,tmpF,res,DES_E);
    memcpy(DxK+8,res,8);
}

int  PBOC_Encrypt(char alg, char *key, char *data, int len, char *res)
// ECB Method  v1
{
       int  kl;
       char _data[1024];

       memcpy(&_data[1],data,len);
       _data[0] = (char)len;

       if (((len+1)%8) > 0 )
          len = padding(_data,len+1);
       else len = len+1;

       for(kl =0; kl<len; kl+=8) {
          if ( alg == TRIPLE_DES )
                tripledes(key,&_data[kl],&res[kl],DES_E);
          else  qdes(key,&_data[kl],&res[kl],DES_E);
       }

       return len;
}

void PBOC_Decrypt(char alg, char *key,char *data, int len, char *res )
{
       int kl;
       for(kl =0; kl<len; kl+=8) {
          if ( alg == TRIPLE_DES )
                tripledes(key,&data[kl],&res[kl],DES_D);
          else  qdes(key,&data[kl],&res[kl],DES_D);
       }
}




void DES3_CBC_ENC(char *key, char *data, short datalen,char *Result)
{
    char buf[8];
    short kl;

    memset(buf,0x0,8);
    for(kl =0; kl<datalen; kl+=8) {
       xorblock(buf,&data[kl]);
       tripledes(key,buf,&Result[kl],DES_E);
       memcpy(buf,&Result[kl],8);
    }
}


void DES3_ECB_ENC(char *key, char *data, short datalen,char *Result)
{
    short kl;
    for(kl =0; kl<datalen; kl+=8)
       tripledes(key,&data[kl],&Result[kl],DES_E);
}

⌨️ 快捷键说明

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