1
Found it on the Webs / Re: Blackhat USA 2012 Training Video
« on: March 05, 2015, 11:00:31 AM »
I was wondering if this was ever archived.
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
Must you be a math geek A+ student to understand cryptography? ..can't a B student crack or design Hash algorithms?...and how can a B student become a cryptographer?... is there hope?
Well, you can count, can't you?
So you can count the number of equal adjacent elements and set them to 6 if the count is equal or greater than 3 instead of "bruteforcing" them.
#include <emmintrin.h>
int main(){
int board[10][10];
int row, col;
for(row=0;row<10;row++){
for(col=0;col<10;col++){
board[row][col]=rand()%2+1; //filling matrix here
printf("%d ", board[row][col]);
}
printf("\n");
}
printf("\n");
for(row=0;row<10;row++){
col = 0;
while(col <= 10 - 4){
__m128i xmm0 = _mm_loadu_si128((__m128i*)&board[row][col]);
__m128i xmm1 = _mm_set1_epi32(board[row][col]);
__m128i xmm2;
__m128i xmm6 = _mm_set1_epi32(6);
__m128i xmmn = _mm_set1_epi32(-1);
unsigned long c;
int mask;
xmm0 = _mm_xor_si128(_mm_cmpeq_epi32( xmm0, xmm1 ), xmmn);
mask = _mm_movemask_epi8(xmm0);
if (!mask){
_mm_storeu_si128( (__m128i*)&board[row][col], xmm6 );
col += 4;
do{
if (col > 10 - 4) col = 10 - 4;
xmm0 = _mm_loadu_si128((__m128i*)&board[row][col]);
xmm2 = _mm_or_si128( _mm_cmpeq_epi8( xmm0, xmm1 ), _mm_cmpeq_epi8( xmm0, xmm6 ) );
xmm0 = _mm_xor_si128(xmm2, xmmn);
xmm0 = _mm_or_si128(_mm_slli_si128(xmm0, 4), xmm0);
xmm0 = _mm_or_si128(_mm_slli_si128(xmm0, 8), xmm0);
xmm2 = _mm_xor_si128(xmm0, xmmn);
_mm_maskmoveu_si128( _mm_set1_epi32(6), xmm2 , (char*)&board[row][col] );
mask = _mm_movemask_epi8(xmm0);
if (col == 10 - 4){
col++;
break;
}
c = __builtin_ctz(mask);/* In MSVC: _BitScanForward(mask, &c); */
c >>= 2;
col += c;
}while(mask);
}else{
col += __builtin_ctz(mask) >> 2;
}
}
}
for(row=0;row<10;row++){
for(col=0;col<10;col++){
printf("%d ", board[row][col]);
}
printf("\n");
}
return 1;
}
This has to be taken care of with intrinsic's.1 <= z <= 5
for(row=0;row<10;row++)
{
for(col=0;col<10;col++)
{
board[row][col]=rand()%4+1; //filling matrix here
}
}
print_board(board, row, col);
printf("Switch: ROW COLUMN\n ");
scanf("%hu %hu", &x1, &y1);
printf("With: ROW COLUMN\n");
scanf("%hu %hu", &x2, &y2);
swap(board, x1, y1,x2, y2); //stdrd for loop no good b/c of
//below <-this->below
if(board[0][0]==board[0][1] && board[0][1]==board[0][2] && board[0][2]==board[0][3])
{
board[0][0]=6;
board[0][1]=6;
board[0][2]=6;
board[0][3]=6; // brute force would require many more to complete
}