📄 encrypt.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 + -