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

其他

开发平台:

Unix_Linux

  1. /* displays the votes of the korek attack for each keybyte */
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #define SWAP(x,y) { unsigned char tmp = x; x = y; y = tmp; }
  6. #define N_ATTACKS 17
  7. enum KoreK_attacks
  8. {
  9.     A_u15,                      /* semi-stable  15%             */
  10.     A_s13,                      /* stable       13%             */
  11.     A_u13_1,                    /* unstable     13%             */
  12.     A_u13_2,                    /* unstable ?   13%             */
  13.     A_u13_3,                    /* unstable ?   13%             */
  14.     A_s5_1,                     /* standard      5% (~FMS)      */
  15.     A_s5_2,                     /* other stable  5%             */
  16.     A_s5_3,                     /* other stable  5%             */
  17.     A_u5_1,                     /* unstable      5% no good ?   */
  18.     A_u5_2,                     /* unstable      5%             */
  19.     A_u5_3,                     /* unstable      5% no good     */
  20.     A_u5_4,                     /* unstable      5%             */
  21.     A_s3,                       /* stable        3%             */
  22.     A_4_s13,                    /* stable       13% on q = 4    */
  23.     A_4_u5_1,                   /* unstable      5% on q = 4    */
  24.     A_4_u5_2,                   /* unstable      5% on q = 4    */
  25.     A_neg                       /* helps reject false positives */
  26. };
  27. int K_COEFF[N_ATTACKS] =
  28. {
  29.         15, 13, 12, 12, 12, 5, 5, 5, 3, 4, 3, 4, 3, 13, 4, 4, -20
  30. };
  31. void calc_votes( unsigned char *ivbuf, long nb_ivs,
  32.                  unsigned char *key, int B,
  33.                  int votes[N_ATTACKS][256] )
  34. {
  35.     int i, j;
  36.     long xv;
  37.     unsigned char R[256], jj[256];
  38.     unsigned char S[256], Si[256];
  39.     unsigned char K[64];
  40.     unsigned char io1, o1, io2, o2;
  41.     unsigned char Sq, dq, Kq, jq, q;
  42.     unsigned char S1, S2, J2, t2;
  43.     for( i = 0; i < 256; i++ )
  44.         R[i] = i;
  45.     q = 3 + B;
  46.     memcpy( K + 3, key, B );
  47.     memset( votes, 0, sizeof( int ) * N_ATTACKS * 256 );
  48.     for( xv = 0; xv < nb_ivs; xv += 5 )
  49.     {
  50.         memcpy( K, &ivbuf[xv], 3 );
  51.         memcpy( S,  R, 256 );
  52.         memcpy( Si, R, 256 );
  53.         for( i = j = 0; i < q; i++ )
  54.         {
  55.             jj[i] = j = ( j + S[i] + K[i & 15] ) & 0xFF;
  56.             SWAP( S[i], S[j] );
  57.         }
  58.         i = q; do { i--; SWAP(Si[i],Si[jj[i]]); } while( i != 0 );
  59.         o1 = ivbuf[xv + 3] ^ 0xAA; io1 = Si[o1]; S1 = S[1];
  60.         o2 = ivbuf[xv + 4] ^ 0xAA; io2 = Si[o2]; S2 = S[2];
  61.         Sq = S[q]; dq = Sq + jj[q - 1];
  62.         if( S2 == 0 )
  63.         {
  64.             if( ( S1 == 2 ) && ( o1 == 2 ) )
  65.             {
  66.                 Kq = 1 - dq; votes[A_neg][Kq]++;
  67.                 Kq = 2 - dq; votes[A_neg][Kq]++;
  68.             }
  69.             else if( o2 == 0 )
  70.             {
  71.                 Kq = 2 - dq; votes[A_neg][Kq]++;
  72.             }
  73.         }
  74.         else
  75.         {
  76.             if( ( o2 == 0 ) && ( Sq == 0 ) )
  77.             {
  78.                 Kq = 2 - dq; votes[A_u15][Kq]++;
  79.             }
  80.         }
  81.         if( ( S1 == 1 ) && ( o1 == S2 ) )
  82.         {
  83.             Kq = 1 - dq; votes[A_neg][Kq]++;
  84.             Kq = 2 - dq; votes[A_neg][Kq]++;
  85.         }
  86.         if( ( S1 == 0 ) && ( S[0] == 1 ) && ( o1 == 1 ) )
  87.         {
  88.             Kq = 0 - dq; votes[A_neg][Kq]++;
  89.             Kq = 1 - dq; votes[A_neg][Kq]++;
  90.         }
  91.         if( S1 == q )
  92.         {
  93.             if( o1 == q )
  94.             {
  95.                 Kq = Si[0] - dq; votes[A_s13][Kq]++;
  96.             }
  97.             else if( ( ( 1 - q - o1 ) & 0xFF ) == 0 )
  98.             {
  99.                 Kq = io1 - dq; votes[A_u13_1][Kq]++;
  100.             }
  101.             else if( io1 < q )
  102.             {
  103.                 jq = Si[( io1 - q ) & 0xFF];
  104.                 if( jq != 1 )
  105.                 {
  106.                     Kq = jq - dq; votes[A_u5_1][Kq]++;
  107.                 }
  108.             }
  109.         }
  110.         if( ( io1 == 2 ) && ( S[q] == 1 ) )
  111.         {
  112.             Kq = 1 - dq; votes[A_u5_2][Kq]++;
  113.         }
  114.         if( S[q] == q )
  115.         {
  116.             if( ( S1 == 0 ) && ( o1 == q ) )
  117.             {
  118.                 Kq = 1 - dq; votes[A_u13_2][Kq]++;
  119.             }
  120.             else if( ( ( ( 1 - q - S1 ) & 0xFF ) == 0 ) && ( o1 == S1 ) )
  121.             {
  122.                 Kq = 1 - dq; votes[A_u13_3][Kq]++;
  123.             }
  124.             else if( ( S1 >= ( ( -q ) & 0xFF ) )
  125.                      && ( ( ( q + S1 - io1 ) & 0xFF ) == 0 ) )
  126.             {
  127.                 Kq = 1 - dq; votes[A_u5_3][Kq]++;
  128.             }
  129.         }
  130.         if( ( S1 < q ) && ( ( ( S1 + S[S1] - q ) & 0xFF ) == 0 )  &&
  131.             ( io1 != 1 ) && ( io1 != S[S1] ) )
  132.         {
  133.             Kq = io1 - dq; votes[A_s5_1][Kq]++;
  134.         }
  135.         if( ( S1 > q ) && ( ( ( S2 + S1 - q ) & 0xFF ) == 0 ) )
  136.         {
  137.             if( o2 == S1 )
  138.             {
  139.                 jq = Si[(S1 - S2) & 0xFF];
  140.                 if( ( jq != 1 ) && ( jq != 2 ) )
  141.                 {
  142.                     Kq = jq - dq; votes[A_s5_2][Kq]++;
  143.                 }
  144.             }
  145.             else if( o2 == ( ( 2 - S2 ) & 0xFF ) )
  146.             {
  147.                 jq = io2;
  148.                 if( ( jq != 1 ) && ( jq != 2 ) )
  149.                 {
  150.                     Kq = jq - dq; votes[A_s5_3][Kq]++;
  151.                 }
  152.             }
  153.         }
  154.         if( ( S[1] != 2 ) && ( S[2] != 0 ) )
  155.         {
  156.             J2 = S[1] + S[2];
  157.             if( J2 < q )
  158.             {
  159.                 t2 = S[J2] + S[2];
  160.                 if( ( t2 == q ) && ( io2 != 1 ) && ( io2 != 2 )
  161.                     && ( io2 != J2 ) )
  162.                 {
  163.                     Kq = io2 - dq; votes[A_s3][Kq]++;
  164.                 }
  165.             }
  166.         }
  167.         if( S1 == 2 )
  168.         {
  169.             if( q == 4 )
  170.             {
  171.                 if( o2 == 0 )
  172.                 {
  173.                     Kq = Si[0] - dq; votes[A_4_s13][Kq]++;
  174.                 }
  175.                 else
  176.                 {
  177.                     if( ( jj[1] == 2 ) && ( io2 == 0 ) )
  178.                     {
  179.                         Kq = Si[254] - dq; votes[A_4_u5_1][Kq]++;
  180.                     }
  181.                     if( ( jj[1] == 2 ) && ( io2 == 2 ) )
  182.                     {
  183.                         Kq = Si[255] - dq; votes[A_4_u5_2][Kq]++;
  184.                     }
  185.                 }
  186.             }
  187.             else if( ( q > 4 ) && ( ( S[4] + 2 ) == q ) &&
  188.                      ( io2 != 1 ) && ( io2 != 4 ) )
  189.             {
  190.                 Kq = io2 - dq; votes[A_u5_4][Kq]++;
  191.             }
  192.         }
  193.     }
  194. }
  195. typedef struct { int idx, val; } vote;
  196. int cmp_votes( const void *bs1, const void *bs2 )
  197. {
  198.     if( ((vote *) bs1)->val < ((vote *) bs2)->val )
  199.         return(  1 );
  200.     if( ((vote *) bs1)->val > ((vote *) bs2)->val )
  201.         return( -1 );
  202.     return( 0 );
  203. }
  204. int main( int argc, char *argv[] )
  205. {
  206.     FILE *f;
  207.     long nb_ivs;
  208.     int i, n, B, *vi;
  209.     int votes[N_ATTACKS][256];
  210.     unsigned char *ivbuf, *s;
  211.     unsigned char buffer[4096];
  212.     unsigned char wepkey[16];
  213.     vote poll[64][256];
  214.     if( argc != 3 )
  215.     {
  216.         printf( "usage: kstats <ivs file> <104-bit key>n" );
  217.         return( 1 );
  218.     }
  219.     i = 0;
  220.     s = argv[2];
  221.     buffer[0] = s[0];
  222.     buffer[1] = s[1];
  223.     buffer[2] = '';
  224.     while( sscanf( buffer, "%x", &n ) == 1 )
  225.     {
  226.         if( n < 0 || n > 255 )
  227.         {
  228.             fprintf( stderr, "Invalid wep key.n" );
  229.             return( 1 );
  230.         }
  231.         wepkey[i++] = n;
  232.         if( i >= 16 ) break;
  233.         s += 2;
  234.         if( s[0] == ':' || s[0] == '-' )
  235.             s++;
  236.         if( s[0] == '' || s[1] == '' )
  237.             break;
  238.         
  239.         buffer[0] = s[0];
  240.         buffer[1] = s[1];
  241.     }
  242.     if( i != 13 )
  243.     {
  244.         fprintf( stderr, "Invalid wep key.n" );
  245.         return( 1 );
  246.     }
  247.     if( ( ivbuf = (unsigned char *) malloc( 5 * 0xFFFFFF ) ) == NULL )
  248.     {
  249.         perror( "malloc" );
  250.         return( 1 );
  251.     }
  252.     if( ( f = fopen( argv[1], "rb" ) ) == NULL )
  253.     {
  254.         perror( "fopen" );
  255.         return( 1 );
  256.     }
  257.     if( fread( buffer, 1, 4, f ) != 4 )
  258.     {
  259.         perror( "fread header" );
  260.         return( 1 );
  261.     }
  262.     if( memcmp( buffer, "xBFxCAx84xD4", 4 ) != 0 )
  263.     {
  264.         fprintf( stderr, "Not an .IVS filen" );
  265.         return( 1 );
  266.     }
  267.     nb_ivs = 0;
  268.     while( 1 )
  269.     {
  270.         if( fread( buffer, 1, 1, f ) != 1 )
  271.             break;
  272.         if( buffer[0] != 0xFF )
  273.             if( fread( buffer + 1, 1, 5, f ) != 5 )
  274.                 break;
  275.         if( fread( buffer, 1, 5, f ) != 5 )
  276.             break;
  277.         memcpy( ivbuf + nb_ivs * 5, buffer, 5 );
  278.         nb_ivs++;
  279.     }
  280.     for( B = 0; B < 13; B++ )
  281.     {
  282.         for( i = 0; i < 256; i++ )
  283.         {
  284.             poll[B][i].idx = i;
  285.             poll[B][i].val = 0;
  286.         }
  287.         calc_votes( ivbuf, nb_ivs, wepkey, B, votes );
  288.         for( n = 0, vi = (int *) votes; n < N_ATTACKS; n++ )
  289.             for( i = 0; i < 256; i++, vi++ )
  290.                 poll[B][i].val += *vi * K_COEFF[n];
  291.         qsort( poll[B], 256, sizeof( vote ), cmp_votes );
  292.         printf( "KB %02d VALID  %02X",
  293.                 B, wepkey[B] );
  294.         for( i = 0; i < 256; i++ )
  295.             if( poll[B][i].idx == wepkey[B] )
  296.                 printf( "(%4d) ", poll[B][i].val );
  297.         for( i = 0; i < N_ATTACKS; i++ )
  298.             printf( "%3d  ", votes[i][wepkey[B]] );
  299.         printf( "n" );
  300.         printf( "KB %02d FIRST  %02X(%4d) ",
  301.                 B, poll[B][0].idx, poll[B][0].val );
  302.         for( i = 0; i < N_ATTACKS; i++ )
  303.             printf( "%3d  ", votes[i][poll[B][0].idx] );
  304.         printf( "n" );
  305.         printf( "KB %02d SECOND %02X(%4d) ",
  306.                 B, poll[B][1].idx, poll[B][1].val );
  307.         for( i = 0; i < N_ATTACKS; i++ )
  308.             printf( "%3d  ", votes[i][poll[B][1].idx] );
  309.         printf( "n" );
  310.         printf( "KB %02d THIRD  %02X(%4d) ",
  311.                 B, poll[B][2].idx, poll[B][2].val );
  312.         for( i = 0; i < N_ATTACKS; i++ )
  313.             printf( "%3d  ", votes[i][poll[B][2].idx] );
  314.         printf( "nn" );
  315.     }
  316.     return( 0 );
  317. }