Pull to refresh

sha256 проба на зубОк для нейронной сети

Reading time 3 min
Views 4.6K
Уважаемые коллеги.
Нашел свои старые пробы реверса, к сожалению не последняя версия.

Уже не очень точно помню все детали, эксперимент проводился в 2012 году, но по мере копания в коде они всплывают всё чётче.

Предупреждение: Дальнейший код вырван из контекста, описание его работы сделано по памяти и может содержать ошибки, приведен только в познавательных целях.


Вот так готовились данные для обучения и тестирования нейросети. Сначала генерировались строки такого вида, они представляют собой искомый результат:

spins : 0; server code word : 74b0dc5166334873643c9869327b23c6
spins : 1; server code word : 46e87ccd238e1f29625558ec2ae8944a
spins : 2; server code word : 79e2a9e341b71efb2eb141f2507ed7ab
spins : 3; server code word : 4db127f8122008545bd062c2515f007c
spins : 4; server code word : 140e0f7666ef438d1190cde71f16e9e8


Затем примерно так из них получались хэши для обучения нейронной сети.

FILE *fp;
sha256_context stx;
int ss,zz,yy,ii,jj,zzi;
unsigned long int pdata;
fp = fopen("data_src", "rb");
    if(!fp) return 1; // bail out if file not found
  while(fgets(str,sizeof(str),fp) != NULL)
  {
zz=0;
    // strip trailing '\n' if it exists
      int len = strlen(str)-1;
      if(str[len] == '\n') 
	str[len] = 0;
sha256_starts( &stx );
sha256_update( &stx, (uint8 *) str, strlen( str ) );
sha256_finish( &stx, sha256sum );
zz=stx.zzz;

Что давало на выходе примерно следующее:

d34453f3c04552ee19cb6734ab71ad124710cfc98401570f73f65cb8cfa2a64d
6cc8ca5b918d1a22d5141494ad08b76a6c67cd5f649744f80d2fad4916b2b6d9
f89e9fd9609099b22924a77a5c8122c06118608c4287fca1cdafe5827249bce7
35280fd1e2289488828004682679452a070ccd90c12072fcb904529ab18e3f9d
1112c4cffb617c835874446f13c4d7d29fa091ba7ac996b776998f89dedffcc1
02e0521aae2d4ecdeb4482bda545bb222e1280ec1f580d5d23e29fb719252f70

Потом всё это разворачивалось побитно:


// printf("\n\n\nSUM=");
// делаем строку обработанную sha256 двоичным кодом
printf ("%d 512 512",zz);
zf(str1);
for( j = 0; j < 32; j++ )
	{
	  sprintf(str1,"%s%s",str1, ui2bin(sha256sum[j]));
	}
//дополняем строку до 512 бит
while(strlen(str1)<512) { sprintf(str1,"%s%s",str1,"0"); }
//printf("%s\n",str1);        
jj=0; ii=0; // делаем строку обработанную sha256 двоичным кодом с пробелами
while(str2[jj]=str1[ii])
{ 
  ii++; 
  jj=jj+2; 
  str2[jj-1]=*" ";
} 
printf("%s",str2);
// str2 - результат sha2 побитно через пробел
//
printf("\n");
//

Результат работы в таких:

855 1408 1408 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [...]

файлах скармливались нейронной сети как обучающая и тестовая выборки.
использовалась библиотека FANN, пробовал разные нейронки.
Результат безусловно был, но был неоднозначным. Полностью восстановить оригинальный текст не удалось.
Однако иногда проскакивали фрагменты части сторок довольно точно восстановленные.
Думаю у этой задачи есть решение, только для его нахождения нужно еще прикладывать усилия.
Например, имеет смысл подавать на вход сети при обучении все внутренние переменные алгоритма хэширования. Имеет также смысл запустить конкурентные сети и научить еще одну сеть распознавать результат работы консилиума.
Эти любопытные эксперименты можно провести сейчас гораздо проще, чем 2012 году.
С появлением таких инструментов как Python c Tensorflow, sklearn numpy, scipy и сокровищницей репозитория всё это стало гораздо проще проверять.
Tags:
Hubs:
-23
Comments 23
Comments Comments 23

Articles