📄 desutil.~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 + -