/* * file : auth.c * desc : des¾Ë°í¸®ÁòÀ» ÀÌ¿ëÇÏ¿© password¸¦ ÀÎÄÚµùÇÑ´Ù */ #include #include #include #include "auth.h" int keyXORNumber = 0xe7; int highBits[] = { 0xf0, 0xf0, 0xe0, 0xe0, 0xe0, 0xe0 }; int lowBits[] = { 0x00, 0x04, 0x08, 0x0c, 0x00, 0x04 }; int encodeASC2NSC(char c) { int temp = c ^ keyXORNumber; int temp1 = (temp & 0xf0) >> 4; int temp2 = temp & 0x0f; int temp3 = (temp2 << 4); temp3 += temp1; return temp3; } int decodeNSC2ASC(char c) { int temp = c & 0xff; int temp1 = (temp & 0xf0) >> 4; int temp2 = temp & 0x0f; int temp3 = (temp2 << 4); temp3 += temp1; return temp3 ^ keyXORNumber; } int getFifthRepeated(int lastasc) { int ref = (lastasc - 0x20) / 0x10; int highBit = highBits[ref] - 0x40*(lastasc%4); int lowBit = lowBits[ref]; return (highBit | lowBit); } int getLengthSum(int len) { return len ^ keyXORNumber; } char *encrypt(char *plain) { char encrypted[512]; int i; char *ret; char tmp[4]; if(plain != NULL && strlen(plain) > 0 && strlen(plain) <= 20) { int encoded[24]; int repeated[8]; int last = encodeASC2NSC(plain[strlen(plain)-1]); repeated[0] = last / 4; repeated[1] = repeated[0]*2; repeated[2] = last; repeated[3] = repeated[2]*2; repeated[4] = getFifthRepeated(plain[strlen(plain)-1]); repeated[5] = repeated[4]*2; repeated[6] = last / 16; repeated[7] = repeated[6]*2 + 1; memcpy(&encoded[2], &repeated[0], 8); memcpy(&encoded[10], &repeated[0], 8); memcpy(&encoded[18], &repeated[0], 6); encoded[0] = getLengthSum(strlen(plain)); for(i = 0 ; i < strlen(plain) ; i++) { encoded[i+1] = encodeASC2NSC(plain[i]); } for(i = 0 ; i < 24 ; i++) { if(encoded[i] == 0) encoded[i] = 1; } for(i = 0 ; i < 24; i++) { sprintf(tmp, "%02x", encoded[i]); sprintf(encrypted + i * 2, "%c%c", tmp[strlen(tmp)-2], tmp[strlen(tmp)-1]); } } ret = (char *)malloc(strlen(encrypted)); strcpy(ret, encrypted); return ret; }