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

📄 encrypt.c

📁 商业银行前置系统
💻 C
字号:
#include "gfx.h"

#define PASSKEYFILE     "./atm.bin"             /* Passkey 文件 */
#define PASSKEY         "8888888822222222"
#define CKEY            "1234567890123456"
#define SYSKEY          "1234567890123456"

#if 0
#define SYSKEY          "1234567890123456"      /* OLD VERSION */
#endif
#define SYS_S           "0123456789ABCDEF"

void atmdes1(char *passwd,char *pan,int func);
void xdes(int plaintext[], int key[], int ciphertext[], int func,
          int flag );
void atmdes2(char *track,int func);
int getd(char cc);

/*
 * FUNCTION: Encryption OR Decryption.
 * 输入:
 *      passwd(解密以后的密码  或  加密以后的密码)
 *      pan   (16位卡号)
 *      func= 1(Encryption)  OR -1(Decryption).
 * 输出:
 *      passwd(加密以后的密码  或  解密以后的密码)
 */

void atmdes(char *pan, char *atm_en, int funct)
{
    int i;
    char atm_no[7],passwd[7],pan1[17];

    for(i=0;i<16;i++)
        pan1[i] = pan[i+2];
    pan1[16]='\0';

    for(i=0;i<6;i++)
        atm_no[i]=atm_en[i];
    atm_no[6]='\0';

    for(i=0;i<6;i++)
        passwd[i]=atm_en[i+10];
    passwd[6]='\0';

    atmdes1(passwd,pan1,funct);
    atmdes2(atm_no,funct);

    for(i=0;i<6;i++)
        atm_en[i]=atm_no[i];
    for(i=0;i<6;i++)
        atm_en[i+10]=passwd[i];
        atm_en[16]='\0';
}

void atmdes1(char *passwd, char *pan, int func)
{
    FILE    *fp;
    int     i,t;
    int     text1[64],key[64],text2[64];
    char    passchar[20],userkey[7],chn, pin[7],cs[2],ckey[20],
            syskey[20],str[17];

    strcpy(ckey,CKEY);
    strcpy(syskey,SYSKEY);
    strcpy(passchar,"000000000000000000");
    strcpy(userkey,"000000");
    for(i=0;i<16;i++)
    {
        t=ckey[i]-'0';text2[i*4]=t/8;
        t%=8;text2[i*4+1]=t/4;
        t%=4;text2[i*4+2]=t/2;
        t%=2;text2[i*4+3]=t;
    }
    if((fp=fopen(PASSKEYFILE,"rb"))==NULL)
    {
        memcpy(ckey,PASSKEY,16);
        ckey[16]='\0';
    }
    else
    {
        fgetc(fp);
        fread(ckey,1,16,fp);
        fclose(fp);
    }
    for ( i=0; i<16; i++ )
    {
        t = getd(ckey[i]);text1[i*4] = t/8;
        t %= 8;text1[i*4+1] = t/4;
        t %= 4;text1[i*4+2] = t/2;
        t %= 2;text1[i*4+3] = t;
    }

    xdes(text1,text2,key,-1,1);

    for(i=0;i<16;i++)
    {
        t = key[i*4]*8 + key[i*4+1]*4 + key[i*4+2]*2 + key[i*4+3];
    }

    strncpy(&passchar[2],pan,16);
    strncpy(userkey,passwd,6);
    for(i=0;i<16;i++)
    {
        t=passchar[i+2]-'0';text1[i*4]=t/8;
        t%=8;text1[i*4+1]=t/4;
        t%=4;text1[i*4+2]=t/2;
        t%=2;text1[i*4+3]=t;
    }
    xdes(text1,key,text2,1,0);
    for(i=0;i<16;i++)
    {
        t = text2[i*4]*8 + text2[i*4+1]*4 + text2[i*4+2]*2 + text2[i*4+3];
        sprintf( cs, "%X", t );
        str[i] = syskey[t];
    }

    for ( i=0; i<6; i++ )
        pin[i] = str[i];
    pin[6] = '\0';

    if (func == 1)
        for( i=0; i<6; i++ )
        {
            chn=(userkey[i]-'0')-(pin[i]-'0');
            if(chn<0)
                chn+=10;
            passwd[i] =chn+'0';
        }
    else
        for( i=0; i<6; i++ )
        {
            chn=(userkey[i]-'0')+(pin[i]-'0');
            if(chn>10)
                chn-=10;
            passwd[i]=chn+'0';
        }
    passwd[6]='\0';
}

int getd( char cc )
{
    int i;

    for ( i=0; i<16; i++ )
        if ( cc==SYS_S[i] )
            return( i );
	return 0;
}


/*
 * FUNCTION: Data Encryption Standard Program
 *
 *
 */

int InitialTr[64] =
{
    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 FinalTr[64] =
{
    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
};

int KeyTr1[56] =
{
    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 KeyTr2[48] =
{
    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 Etr[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
};

int Ptr[32] =
{
    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 S[8][64] =
{
    {
        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
    },

    {
        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
    },

    {
        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
    },

    {
         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
    },

    {
        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
    },

    {
        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
    },

    {
        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
    },

    {
        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 Rots[16] =
{
    1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
};

int Rota[16] =
{
    1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
};

int Rotb[16] =
{    /* User defined */
    1, 2, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2
};

void transpose(int data[], int tr[], int n)
{
    int     i, k;
    int     temp[64];

    for ( i=0; i<n; i++ )
    {
        k = tr[i] - 1;
        temp[i] = data[k];
    }

    for ( i=0; i<n; i++ )
        data[i] = temp[i];
}

void xchange(int a[])
{
    int     i, aa;

    for ( i=0; i<32; i++ )
    {
        aa = a[i];
        a[i] = a[i+32];
        a[i+32] = aa;
    }
}

void rotateleft(int key[])
{
    int     i, aa;

    aa = key[0];
    for ( i=0; i<27; i++ )
        key[i] = key[i+1];
    key[27] = aa;
    aa = key[28];
    for ( i=28; i<55; i++ )
        key[i] = key[i+1];
    key[55] = aa;
}

void rotateright(int key[])
{
    int     i, aa;

    aa = key[55];
    for ( i=55; i>28; i-- )
        key[i] = key[i-1];
    key[28] = aa;
    aa = key[27];
    for ( i=27; i>0; i-- )
        key[i] = key[i-1];
    key[0] = aa;
}

void fm(int func, int i, int key[], int a[], int x[])
{
    int     e[48], ikey[56], y[48];
    int     j, k, r;

    for ( j=0; j<32; j++ )
        e[j] = a[j];
    transpose( e, Etr, 48 );

    for ( j=1; func==1 && j<=Rots[i]; j++ )
        rotateleft( key );

    for ( j=1; func==-1 && i>0 && j<=Rots[16-i]; j++ )
        rotateright( key );

    for ( j=0; j<56; j++ )
        ikey[j] = key[j];
    transpose( ikey, KeyTr2, 48 );

    for ( j=0; j<48; j++ )
        y[j] = ( e[j] != ikey[j] ) ? 1 : 0;

    for ( k=0; k<8; k++ )
    {
        r = 32*y[6*k] + 16*y[6*k+5] + 8*y[6*k+1]
            + 4*y[6*k+2] + 2*y[6*k+3] + y[6*k+4];
            x[4*k]  = ( (S[k][r]%16) >= 8 ) ? 1 : 0;
            x[4*k+1] = ( (S[k][r]%8) >= 4 ) ? 1 : 0;
            x[4*k+2] = ( (S[k][r]%4) >= 2 ) ? 1 : 0;
            x[4*k+3] = S[k][r] % 2;
    }

    transpose( x, Ptr, 32 );
}

/*
 * func==-1: decryption
 * func== 1: encryption
 * flag== 0: standard
 * flag== 1: user_defined
 */

void xdes(int plaintext[], int key[], int ciphertext[], int func, int flag)
{
    int     i, j;
    int     a[64], x[32];

    if ( flag==0 )
    {
        for ( i=0; i<16; i++ )
            Rots[i] = Rota[i];
    }
    else
    {
        for ( i=0; i<16; i++ )
            Rots[i] = Rotb[i];
    }

    for ( i=0; i<64; i++ )
        a[i] = plaintext[i];
    transpose( a, InitialTr, 64 );
    if ( func == -1 )
        xchange( a );

    transpose( key, KeyTr1, 56 );

    for ( i=0; i<16; i++ )
    {
        if ( func == 1 )
            xchange( a );
        fm( func, i, key, a, x );
        for ( j=0; j<32; j++ )
            a[j+32] = ( a[j+32] != x[j] ) ? 1 : 0;
        if ( func == -1 )
            xchange( a );
    }

    if ( func == 1 )
        xchange( a );
    transpose( a, FinalTr, 64 );

    for ( i=0; i<64; i++ )
        ciphertext[i] = a[i];
}


void atmdes2(char *track, int func)
{
    int i,j;

    if (func==1)
    {
        j=1;
        for(i=0;i<6;i++)
        {
            if (track[i]!='\0')
            {
                track[i]=track[i]+j;
                j=j+1;
            }
            else
            {
                break;
            }
        }
    }

    if (func==-1)
    {
        j=-1;
        for(i=0;i<6;i++)
        {
            if (track[i]!='\0')
            {
                track[i]=track[i]+j;
                j=j-1;
            }
            else
            {
                break;
            }
        }
    }
    track[6]='\0';
}

void EncryptTrack3(char *track, int func)
{
    int i,j;

    if (func==1)
    {
        j=1;
        for(i=0;i<104;i++)
        {
            if (track[i]!='\0')
                track[i]=track[i]+j;
            else
                break;
        }
    }

    if (func==-1)
    {
        j=-1;
        for(i=0;i<104;i++)
        {
            if (track[i]!='\0')
                track[i]=track[i]+j;
            else
                break;
        }
    }
    track[104]='\0';
}

void EncryptTrack2(char *track, int func)
{
    int i,j;

    if (func==1)
    {
        j=1;
        for(i=0;i<37;i++)
        {
            if (track[i]!='\0')
                track[i]=track[i]+j;
            else
                break;
        }
    }

    if (func==-1)
    {
        j=-1;
        for(i=0;i<37;i++)
        {
            if (track[i]!='\0')
                track[i]=track[i]+j;
            else
                break;
        }
    }
    track[37]='\0';
}

void EncryptAtm(const char *s1,char *s2,int key)
{
    char tmp1[19],tmp2[17];
    int  i;
    memset(tmp1,0, sizeof(tmp1) );
    memset(tmp2,0, sizeof(tmp2) );
    memcpy(tmp1,s1,18);
    memcpy(tmp2,s2,16);
    atmdes(tmp1,tmp2,key);
    if(key == -1)
        for(i=10;i<16;i++)
            if((tmp2[i]<'0') || (tmp2[i]>'9'))
                tmp2[i]='0';

    memcpy(s2,tmp2,16);
}

void EncryptNewPin(char *pinkey,char *account,int key)
{
    char tmp[19];
    char pin[7],acc[17];
    int  i;
    memset(tmp,0, sizeof(tmp) );
    memset(pin,0, sizeof(pin) );
    memset(acc,0, sizeof(acc) );
    memcpy(pin,pinkey,6);
    memcpy(tmp,account,18);
    memcpy(acc,&tmp[2],16);
    atmdes1(pin,acc,key);
    if(key == -1)
        for(i=0;i<6;i++)
            if((pin[i]<'0') || (pin[i]>'9'))
                pin[i]='0';

    memcpy(pinkey,pin,6);
}

void sdg_track3(char *s1,int key)
{
    char tmp2[105];

    memset(tmp2,0,105);
    memcpy(tmp2,s1,104);
    EncryptTrack3(tmp2,key);
    memcpy(s1,tmp2,104);
}


/* End of this file */

⌨️ 快捷键说明

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