// rc4.cpp - implementation of the RC4 cipher #include #include #include #include #include #if (defined _MSC_VER) || (defined __BORLANDC__) #include #include #endif #ifdef __GNUC__ #define __int64 long long #endif using namespace std; class TRC4 { private: int sx, sy, sm[256]; // state public: TRC4(unsigned char* key, int length); unsigned char GetByte(); void Crypt(unsigned char* data, int length); }; TRC4::TRC4(unsigned char* key, int length) { int i, j, k, a; sx = 0; sy = 0; for( i = 0; i < 256; i++ ) sm[i] = i; j = k = 0; for( i = 0; i < 256; i++ ) { a = sm[i]; j = (unsigned char)(j + a + key[k]); sm[i] = sm[j]; sm[j] = a; if( ++k >= length ) k = 0; } } void TRC4::Crypt(unsigned char* data, int length) { int i, a, b; for(i = 0; idata.bin\n"); printf(" rc4 -n 34359738368\n"); } void Quit() { PrintHelp(); exit(1); } int main(int argc, char* argv[]) { #ifdef _MSC_VER _setmode(_fileno(stdout), _O_BINARY); #endif #ifdef __BORLANDC__ setmode(_fileno(stdout), O_BINARY); #endif char digits1[] = "0123456789abcdef"; char digits2[] = "ABCDEF"; char back[256]; memset(back, 100, 256); int i, j; for(i=0; i<16; i++) back[digits1[i]]=i; for(i=0; i<6; i++) back[digits2[i]]=i+10; // parse commandline parameters __int64 nn=-1; char kk[16]; bool qq = false; bool randomkey = true; for(i=1; ii+1; if(onemore) { if(arg=="-k") { i++; arg = argv[i]; if((arg.length()>2)&&(arg.substr(0,2)=="0x")) arg = arg.substr(2); if(arg.length()>32) { printf("ERROR: The length of the key must not exceed 128-bit length.\n"); Quit(); } memset(kk,0,16); for(j=0; j> nn; if(is.fail()) Quit(); } else Quit(); } else { if(arg=="-q") qq = true; else Quit(); } } if(nn<1) { printf("ERROR: You shoud enter a positive -n parameter.\n"); Quit(); } if(randomkey) { srand( (unsigned)time( NULL ) ); for(i=0; i<16; i++) kk[i] = rand()&0xff; } TRC4 rc4((unsigned char*)kk, 16); if(!qq) fprintf(stderr,"Key used: 0x%s\n",KeyToStr((unsigned char*)kk).c_str()); __int64 k,n; n = (nn+7)/8; for(k=0; k