ont

brute Andrey1800 (cuda) with solution

ont
Nov 3rd, 2012
629
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2.  
  3. #define THREADX 16
  4. #define THREADY 16
  5.  
  6. #define BLOCKSX 16
  7. #define BLOCKSY 16
  8.  
  9. __global__
  10. void kern(char *skey, char *solution, int *ans)
  11. {
  12.     char key[ 8 ];
  13.     key[ 0 ] = skey[ 0 ];
  14.     key[ 1 ] = skey[ 1 ];
  15.     key[ 2 ] = skey[ 2 ];
  16.     key[ 3 ] = skey[ 3 ];
  17.     key[ 4 ] = blockIdx.x;
  18.     key[ 5 ] = blockIdx.y;
  19.  
  20.     key[ 6 ] = threadIdx.x;
  21.     key[ 7 ] = threadIdx.y;
  22.  
  23.     long long a = 0x86289CFB;
  24.     long long b = 0x48AEEFD4;
  25.     int i;
  26.     for (i = 0; i < 8; i++) {
  27.         char code = key[i];
  28.         int xor1 = a >> 31;
  29.         int xor2 = 0;
  30.         int j = 0;
  31.         while (j < 64) {
  32.             if ((((b & 0x40BD223D) << 32) + (a & 0x61AC9F6E)) & (1 << j)) xor2++;
  33.             j++;
  34.         }
  35.         xor2 = xor2 & 1;
  36.         switch (code)
  37.         {
  38.             case 0:
  39.                 a = a * 2 ^ 0x4;
  40.                 b = b * 2;
  41.                 //printf( "a = %lld   b = %lld\n", a, b );
  42.                 break;
  43.             case 1:
  44.                 a = a * 2;
  45.                 b = (b * 2) ^ 0x2;
  46.                 //printf( "[1] a = %d   b = %d\n", a, b );
  47.                 break;
  48.             case 2:
  49.                 a = a * 2;
  50.                 b = b * 2;
  51.                 //printf( "a = %lld   b = %lld\n", a, b );
  52.                 break;
  53.             case 3:
  54.                 b = b * 2;
  55.                 a = a * 2 ^ 0x80000000;
  56.                 //printf( "a = %lld   b = %lld\n", a, b );
  57.                 break;
  58.             case 4:
  59.                 b = b * 2 ^ 0x40000000;
  60.                 a = a * 2;
  61.                 //printf( "a = %lld   b = %lld\n", a, b );
  62.                 break;
  63.             case 5:
  64.                 b = b * 2;
  65.                 a = a * 2 ^ 0x20000000;
  66.                 //printf( "a = %lld   b = %lld\n", a, b );
  67.                 break;
  68.             case 6:
  69.                 b = b * 2 ^ 0x10000000;
  70.                 a = a * 2;
  71.                 //printf( "a = %lld   b = %lld\n", a, b );
  72.                 break;
  73.             case 7:
  74.                 b = b * 2;
  75.                 a = a * 2 ^ 0x8000000;
  76.                 //printf( "a = %lld   b = %lld\n", a, b );
  77.                 break;
  78.             case 8:
  79.                 b = b * 2 ^ 0x4000000;
  80.                 a = a * 2;
  81.                 //printf( "a = %lld   b = %lld\n", a, b );
  82.                 break;
  83.             case 9:
  84.                 b = b * 2;
  85.                 a = a * 2 ^ 0x2000000;
  86.                 //printf( "a = %lld   b = %lld\n", a, b );
  87.                 break;
  88.             case 10:
  89.                 b = b * 2 ^ 0x1000000;
  90.                 a = a * 2 ^ 1;
  91.                 //printf( "a = %lld   b = %lld\n", a, b );
  92.                 break;
  93.             case 11:
  94.                 b = b * 2;
  95.                 a = a * 2 ^ 0x800000;
  96.                 //printf( "a = %lld   b = %lld\n", a, b );
  97.                 break;
  98.             case 12:
  99.                 b = b * 2 ^ 0x400000;
  100.                 a = a * 2;
  101.                 //printf( "a = %lld   b = %lld\n", a, b );
  102.                 break;
  103.             case 13:
  104.                 b = b * 2;
  105.                 a = a * 2 ^ 0x200000;
  106.                 //printf( "a = %lld   b = %lld\n", a, b );
  107.                 break;
  108.             case 14:
  109.                 b = b * 2 ^ 0x100000;
  110.                 a = a * 2;
  111.                 //printf( "a = %lld   b = %lld\n", a, b );
  112.                 break;
  113.             case 15:
  114.                 b = b * 2;
  115.                 a = a * 2 ^ 0x80000;
  116.                 //printf( "a = %lld   b = %lld\n", a, b );
  117.                 break;
  118.             default:
  119.                 break;
  120.         }
  121.         //printf( "-a- %lld\n", a );
  122.         //printf( "-b- %lld\n", b );
  123.         //printf( "-x- %d\n", xor1 );
  124.         //printf( "-x- %d\n", xor2 );
  125.         a = a ^ xor2;
  126.         b = b ^ xor1;
  127.         a = a & 0xffffffff;
  128.         b = b & 0xffffffff;
  129.     }
  130.     int n,m;
  131.     n = (b << 15) + (a >> 17);
  132.     m = b ^ n & 0x40BD223D;
  133.     if( m == 0xF0E6D69A )  // <<< real
  134.     {
  135.         for( int k = 0; k < 8; k++ )
  136.             solution[ k ] = key[ k ];
  137.     //if( m == 0x51182aa2 )
  138.     //if( m == 0xff46d75e )
  139.         //*ans = threadIdx.x * 100 + threadIdx.y;
  140.         *ans = 1;
  141.     }
  142. }
  143.  
  144. int main()
  145. {
  146.     /////////// allocate
  147.     int *d_ans, ans, zero = 0;
  148.     cudaMalloc( (void**)&d_ans, 1 * sizeof( int ) );
  149.  
  150.     char key[ 8 ] = { 1, 2, 3, 10, 11, 12, 13, 14 };
  151.     char *d_key, *d_sol;
  152.     cudaMalloc( (void**)&d_key, 8 * sizeof( char ) );
  153.     cudaMalloc( (void**)&d_sol, 8 * sizeof( char ) );
  154.  
  155.     for( key[ 0 ] = 0; key[ 0 ] < 16; key[ 0 ]++ )
  156.         for( key[ 1 ] = 0; key[ 1 ] < 16; key[ 1 ]++ )
  157.             for( key[ 2 ] = 0; key[ 2 ] < 16; key[ 2 ]++ )
  158.                 for( key[ 3 ] = 0; key[ 3 ] < 16; key[ 3 ]++ )
  159.                 {
  160.                     /////////// copy
  161.                     cudaMemcpy( d_key, key , 8 * sizeof( char ), cudaMemcpyHostToDevice );
  162.                     cudaMemcpy( d_ans, &zero, 1 * sizeof( int ) , cudaMemcpyHostToDevice );
  163.  
  164.                     /////////// execute
  165.                     dim3 dimBlock( THREADX, THREADY );
  166.                     dim3 dimGrid( BLOCKSX, BLOCKSY );
  167.                     kern<<<dimGrid, dimBlock>>>(d_key, d_sol, d_ans);
  168.  
  169.                     /////////// take back
  170.                     cudaMemcpy( &ans, d_ans, 1 * sizeof( int ), cudaMemcpyDeviceToHost );
  171.                     if( ans )
  172.                     {
  173.                         printf("FOUND - %d\n", ans);
  174.                         cudaMemcpy( &key, d_sol, 8 * sizeof( char ), cudaMemcpyDeviceToHost );
  175.                         for( int k = 0; k < 8; k++ )
  176.                             printf( "%d ", key[ k ] );
  177.                         printf( "\n" );
  178.                         for( int k = 0; k < 8; k++ )
  179.                         {
  180.                             if( key[ k ] < 10 )
  181.                                 printf( "%c", key[ k ] + 0x30 );
  182.                             else
  183.                                 printf( "%c", key[ k ] + 0x61 - 10 );
  184.                         }
  185.                         printf( "\n" );
  186.  
  187.                         cudaFree( d_key );
  188.                         cudaFree( d_sol );
  189.                         cudaFree( d_ans );
  190.                         return EXIT_SUCCESS;
  191.                     }
  192.                 }
  193.  
  194.         cudaFree( d_sol );
  195.     cudaFree( d_key );
  196.     cudaFree( d_ans );
  197.    
  198.     return EXIT_SUCCESS;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment