#include #include int xor(int a, int b) { return(((a==1 && b==0) || (a==0 && b==1)) ? 1 : 0); } void getbits(int c, int* bits) { switch(c) { case '0' : bits[0] = bits[1] = bits[2] = bits[3] = 0; break; case '1' : bits[0] = 1; bits[1] = bits[2] = bits[3] = 0; break; case '2' : bits[0] = bits[2] = bits[3] = 0; bits[1] = 1; break; case '3' : bits[0] = bits[1] = 1; bits[2] = bits[3] = 0; break; case '4' : bits[0] = bits[1] = bits[3] = 0; bits[2] = 1; break; case '5' : bits[1] = bits[3] = 0; bits[0] = bits[2] = 1; break; case '6' : bits[0] = bits[3] = 0; bits[1] = bits[2] = 1; break; case '7' : bits[3] = 0; bits[0] = bits[1] = bits[2] = 1; break; case '8' : bits[0] = bits[1] = bits[2] = 0; bits[3] = 1; break; case '9' : bits[1] = bits[2] = 0; bits[0] = bits[3] = 1; break; case 'a' : //fall through case 'A' : bits[0] = bits[2] = 0; bits[1] = bits[3] = 1; break; case 'b' : //fall through case 'B' : bits[2] = 0; bits[0] = bits[1] = bits[3] = 1; break; case 'c' : //fall through case 'C' : bits[0] = bits[1] = 0; bits[2] = bits[3] = 1; break; case 'd' : //fall through case 'D' : bits[1] = 0; bits[2] = bits[3] = bits[0] = 1; break; case 'e' : //fall through case 'E' : bits[0] = 0; bits[1] = bits[2] = bits[3] = 1; break; case 'f' : //fall through case 'F' : bits[0] = bits[1] = bits[2] = bits[3] = 1; break; default : bits[0] = bits[1] = bits[2] = bits[3] = 0; } /* fprintf(stderr, " bit[0] = %d, ", bits[0]); fprintf(stderr, " bit[1] = %d, ", bits[1]); fprintf(stderr, " bit[2] = %d, ", bits[2]); fprintf(stderr, " bit[3] = %d \n", bits[3]); */ } void encrypt(int *bits, int *crypt, int count) { int tmpbits[8]; // premute and expand crypt[0] = bits[3]; crypt[1] = bits[1]; crypt[2] = xor(bits[2], bits[0]); crypt[3] = bits[0]; crypt[4] = xor(bits[1], bits[3]); crypt[5] = xor(bits[3], bits[2]); crypt[6] = bits[2]; crypt[7] = xor(bits[1], bits[0]); // XOR with ROM if(crypt[2] == 0) if(crypt[4] == 0) { crypt[0] = xor(crypt[0], 1); crypt[1] = xor(crypt[1], 0); crypt[3] = xor(crypt[3], 0); crypt[6] = xor(crypt[6], 1); } else { crypt[0] = xor(crypt[0], 0); crypt[1] = xor(crypt[1], 0); crypt[3] = xor(crypt[3], 1); crypt[6] = xor(crypt[6], 0); } else if(crypt[4] == 0) { crypt[0] = xor(crypt[0], 0); crypt[1] = xor(crypt[1], 1); crypt[3] = xor(crypt[3], 1); crypt[6] = xor(crypt[6], 0); } else { crypt[0] = xor(crypt[0], 1); crypt[1] = xor(crypt[1], 1); crypt[3] = xor(crypt[3], 0); crypt[6] = xor(crypt[6], 0); } // final permutation switch(count) { case 0 : tmpbits[0] = crypt[1]; tmpbits[1] = crypt[7]; tmpbits[2] = crypt[2]; tmpbits[3] = crypt[0]; tmpbits[4] = crypt[6]; tmpbits[5] = crypt[5]; tmpbits[6] = crypt[4]; tmpbits[7] = crypt[3]; break; case 1 : tmpbits[0] = crypt[5]; tmpbits[1] = crypt[0]; tmpbits[2] = crypt[3]; tmpbits[3] = crypt[7]; tmpbits[4] = crypt[1]; tmpbits[5] = crypt[4]; tmpbits[6] = crypt[6]; tmpbits[7] = crypt[2]; break; case 2 : tmpbits[0] = crypt[2]; tmpbits[1] = crypt[3]; tmpbits[2] = crypt[5]; tmpbits[3] = crypt[6]; tmpbits[4] = crypt[4]; tmpbits[5] = crypt[1]; tmpbits[6] = crypt[0]; tmpbits[7] = crypt[7]; break; case 3 : tmpbits[0] = crypt[3]; tmpbits[1] = crypt[7]; tmpbits[2] = crypt[1]; tmpbits[3] = crypt[4]; tmpbits[4] = crypt[0]; tmpbits[5] = crypt[6]; tmpbits[6] = crypt[5]; tmpbits[7] = crypt[2]; break; case 4 : tmpbits[0] = crypt[6]; tmpbits[1] = crypt[1]; tmpbits[2] = crypt[3]; tmpbits[3] = crypt[0]; tmpbits[4] = crypt[2]; tmpbits[5] = crypt[4]; tmpbits[6] = crypt[7]; tmpbits[7] = crypt[5]; break; case 5 : tmpbits[0] = crypt[4]; tmpbits[1] = crypt[6]; tmpbits[2] = crypt[2]; tmpbits[3] = crypt[1]; tmpbits[4] = crypt[3]; tmpbits[5] = crypt[5]; tmpbits[6] = crypt[7]; tmpbits[7] = crypt[0]; break; case 6 : tmpbits[0] = crypt[7]; tmpbits[1] = crypt[1]; tmpbits[2] = crypt[3]; tmpbits[3] = crypt[5]; tmpbits[4] = crypt[2]; tmpbits[5] = crypt[4]; tmpbits[6] = crypt[0]; tmpbits[7] = crypt[6]; break; case 7 : tmpbits[0] = crypt[2]; tmpbits[1] = crypt[1]; tmpbits[2] = crypt[5]; tmpbits[3] = crypt[3]; tmpbits[4] = crypt[6]; tmpbits[5] = crypt[0]; tmpbits[6] = crypt[4]; tmpbits[7] = crypt[7]; default : ; } crypt[0] = tmpbits[0]; crypt[1] = tmpbits[1]; crypt[2] = tmpbits[2]; crypt[3] = tmpbits[3]; crypt[4] = tmpbits[4]; crypt[5] = tmpbits[5]; crypt[6] = tmpbits[6]; crypt[7] = tmpbits[7]; } void outputChar(int *bits) { // First 4 bits (Least significant hex digit) if(bits[7] == 0) if(bits[6] == 0) if(bits[5] == 0) if(bits[4] == 0) printf("0"); else printf("1"); else if(bits[4] == 0) printf("2"); else printf("3"); else if(bits[5] == 0) if(bits[4] == 0) printf("4"); else printf("5"); else if(bits[4] == 0) printf("6"); else printf("7"); else if(bits[6] == 0) if(bits[5] == 0) if(bits[4] == 0) printf("8"); else printf("9"); else if(bits[4] == 0) printf("A"); else printf("B"); else if(bits[5] == 0) if(bits[4] == 0) printf("C"); else printf("D"); else if(bits[4] == 0) printf("E"); else printf("F"); // second 4 bits (Least Significant hex digit) if(bits[3] == 0) if(bits[2] == 0) if(bits[1] == 0) if(bits[0] == 0) printf("0"); else printf("1"); else if(bits[0] == 0) printf("2"); else printf("3"); else if(bits[1] == 0) if(bits[0] == 0) printf("4"); else printf("5"); else if(bits[0] == 0) printf("6"); else printf("7"); else if(bits[2] == 0) if(bits[1] == 0) if(bits[0] == 0) printf("8"); else printf("9"); else if(bits[0] == 0) printf("A"); else printf("B"); else if(bits[1] == 0) if(bits[0] == 0) printf("C"); else printf("D"); else if(bits[0] == 0) printf("E"); else printf("F"); printf("\n"); } int main(int argc, int argv[]) { int c; int startbits[4]; int cryptbits[8]; int n = 0; // fprintf(stderr, "Type your Text:\n"); while((c = getchar()) != EOF) { if(((c <= '9') && (c >= '0')) || ((c <= 'f') && (c >= 'a')) || ((c <= 'F') && (c >= 'A'))) { getbits(c, startbits); encrypt(startbits, cryptbits, n); outputChar(cryptbits); n++; if(n > 7) n = 0; } } }