makeivs.c
上传用户:fubang
上传日期:2009-06-18
资源大小:2071k
文件大小:2k
源码类别:

其他

开发平台:

Unix_Linux

  1. #include <stdio.h>
  2. #define SWAP(x,y) { unsigned char tmp = x; x = y; y = tmp; }
  3. int main( int argc, char *argv[] )
  4. {
  5.     int i, j, n;
  6.     FILE *f_ivs_out;
  7.     unsigned char K[16];
  8.     unsigned char S[256];
  9.     unsigned char buffer[64], *s;
  10.     if( argc != 3 )
  11.     {
  12.         printf( "usage: makeivs <ivs file> <104-bit key>n" );
  13.         return( 1 );
  14.     }
  15.     i = 0;
  16.     s = argv[2];
  17.     buffer[0] = s[0];
  18.     buffer[1] = s[1];
  19.     buffer[2] = '';
  20.     while( sscanf( buffer, "%x", &n ) == 1 )
  21.     {
  22.         if( n < 0 || n > 255 )
  23.         {
  24.             fprintf( stderr, "Invalid wep key.n" );
  25.             return( 1 );
  26.         }
  27.         K[3 + i++] = n;
  28.         if( i >= 16 ) break;
  29.         s += 2;
  30.         if( s[0] == ':' || s[0] == '-' )
  31.             s++;
  32.         if( s[0] == '' || s[1] == '' )
  33.             break;
  34.         
  35.         buffer[0] = s[0];
  36.         buffer[1] = s[1];
  37.     }
  38.     if( i != 13 )
  39.     {
  40.         fprintf( stderr, "Invalid wep key.n" );
  41.         return( 1 );
  42.     }
  43.     if( ( f_ivs_out = fopen( argv[1], "wb+" ) ) == NULL )
  44.     {
  45.         perror( "fopen" );
  46.         return( 1 );
  47.     }
  48.     fprintf( f_ivs_out, "xBFxCAx84xD4x01x01x01x01x01x01" );
  49.     for( n = 0x000000; n <= 0x0FFFFF; n++ )
  50.     {
  51.         K[2] = ( n >> 16 ) & 0xFF;
  52.         K[1] = ( n >>  8 ) & 0xFF;
  53.         K[0] = ( n       ) & 0xFF;
  54.         fprintf( f_ivs_out, "%c%c%c", K[0], K[1], K[2] );
  55.         for( i = 0; i < 256; i++ )
  56.             S[i] = i;
  57.         for( i = j = 0; i < 256; i++ )
  58.         {
  59.             j = ( j + S[i] + K[i & 15] ) & 0xFF;
  60.             SWAP( S[i], S[j] );
  61.         }
  62.         i = 1; j = ( 0 + S[i] ) & 0xFF; SWAP(S[i], S[j]);
  63.         fprintf( f_ivs_out, "%c", 0xAA ^ S[(S[i] + S[j]) & 0xFF] );
  64.         i = 2; j = ( j + S[i] ) & 0xFF; SWAP(S[i], S[j]);
  65.         fprintf( f_ivs_out, "%cxFF", 0xAA ^ S[(S[i] + S[j]) & 0xFF] );
  66.     }
  67.     fclose( f_ivs_out );
  68.     printf( "Done.n" );
  69.     return( 0 );
  70. }