SHOW:
|
|
- or go back to the newest paste.
| 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, int *ans) |
| 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 | - | int a = 0x86289CFB; |
| 23 | + | long long a = 0x86289CFB; |
| 24 | - | int b = 0x48AEEFD4; |
| 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 ) |
| 133 | + | if( m == 0xF0E6D69A ) // <<< real |
| 134 | - | if( m == 0xff46d75e ) |
| 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 | - | char *d_key; |
| 146 | + | |
| 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 | - | kern<<<dimGrid, dimBlock>>>(d_key, d_ans); |
| 161 | + | |
| 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 | } |