rendered paste body#ifndef __PROGTEST__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#define MESSAGE_MAX 8192
#define AGENTS_MAX 16
#define KEY_LENGTH 32
#define SIGNATURE "God save the Queen!"
typedef struct TMessage
{
unsigned char m_Message [MESSAGE_MAX];
int m_Length;
} TMESSAGE;
typedef struct TResults
{
int m_Agent;
int m_Shift;
} TRESULTS;
#endif /* __PROGTEST__ */
static TMESSAGE g_Messages [8] =
{
{ {
0x35, 0xd9, 0x38, 0xc6, 0xca, 0xf2, 0x3d, 0x76, 0xd8, 0xa6, 0x7f, 0x9e, 0x04, 0x61, 0x6d, 0x23,
0xd2, 0xe5, 0x9b, 0xa0, 0x7b, 0x52, 0xf4, 0xfd, 0x32, 0xc6
}, 26
}, //Dr. No
{ {
0xa6, 0x39, 0x7c, 0x8e, 0x92, 0x00, 0xbc, 0x0e, 0x6b, 0x6c, 0x0b, 0x61, 0x59, 0xc8, 0x5a, 0x8b,
0xd0, 0x3a, 0x34, 0x15, 0x44, 0x8e, 0xe2, 0x22, 0x6c, 0x21, 0xd2, 0xa4, 0xd6, 0xce, 0x46, 0x2d,
0xc0, 0xe1, 0x3f, 0x87, 0x66, 0xcf, 0x27, 0xd7, 0x82
}, 41
}, //From Russia with love
{ {
0xd7, 0x2a, 0x83, 0x99, 0xe7, 0x23, 0x76, 0xd8, 0x83, 0x62, 0x9e, 0x41, 0x5e, 0x39, 0x1d, 0x65,
0x41, 0x8c, 0x20, 0xcf, 0xa7, 0xdf, 0x88, 0x7d, 0x36, 0xd4, 0xf7, 0x24, 0xec, 0x00
}, 30
}, //Goldfinger - POZOR, zamerne spatny podpis
{ {
0x21, 0xc7, 0xca, 0xf5, 0x34, 0x65, 0x9d, 0xd7, 0x7e, 0x93, 0x04, 0x2f, 0x1d, 0x0d, 0x65, 0x4a,
0xc3, 0x5b, 0x33, 0xc8, 0xbe, 0xd5, 0x8a, 0x71, 0x2a, 0xd1, 0xf3, 0x3a, 0x8a, 0x4c, 0xff
}, 31
}, //Thunderball
{ {
0xef, 0x36, 0x76, 0xf2, 0xb0, 0x65, 0x9f, 0x41, 0x7c, 0x2d, 0x0e, 0x65, 0x0f, 0xd9, 0x12, 0x9a,
0x98, 0x0e, 0x61, 0x21, 0x54, 0x85, 0xa6, 0x3e, 0xcf, 0xbe, 0x9b, 0x81, 0x7a, 0x34, 0xca, 0xb2,
0x3a, 0x8f, 0x30, 0xdd, 0x6e, 0xd7, 0x9d
}, 39
}, //You only live twice
{ {
0x85, 0x6f, 0x8f, 0x41, 0x7c, 0x29, 0x0a, 0x76, 0x46, 0xce, 0x1f, 0xf5, 0xff, 0x30, 0x70, 0x64,
0x42, 0x8a, 0xf1, 0x29, 0x6d, 0xdd, 0x51, 0xdc, 0x47, 0xe0, 0x09, 0x70, 0x3c, 0xc4, 0xed, 0x28,
0xce, 0xeb, 0xf3, 0x8b, 0x66, 0x78, 0xfe, 0xf3, 0x3c, 0x83, 0x35, 0xcc, 0x37, 0x84, 0x99, 0xa6,
0x26, 0x76, 0x9b
}, 51
}, //On Her Majesty's secret service
{ {
0xe3, 0x23, 0x76, 0x8a, 0xfd, 0x4d, 0x94, 0x05, 0x2f, 0x3f, 0x19, 0x76, 0x4a, 0x8d, 0x0e, 0x97,
0xdd, 0x7f, 0x45, 0x31, 0x54, 0x8e, 0xe9, 0x6d, 0x23, 0xc9, 0xaa, 0xd6, 0x81, 0x7a, 0x3c, 0xc0,
0xb2, 0x37, 0x94, 0x23, 0x98, 0x28, 0xcc, 0x98
}, 40
}, //Diamonds are forever
{ {
0xca, 0x8f, 0x8c, 0x12, 0x7c, 0x9c, 0xd7, 0x79, 0x9a, 0x17, 0x6a, 0x6c, 0x0c, 0x68, 0x4a, 0x8d,
0x2b, 0x8a, 0xdd, 0x3a, 0x7a, 0x65, 0x2b, 0xc9, 0xbd, 0xde, 0xce, 0x75, 0x36, 0xd7, 0xb2, 0x3a,
0x83, 0x32, 0x98, 0x2a
}, 36
} //Live and let die
};
const TMESSAGE * receiver ( void )
{
TMESSAGE * res;
static int cnt = 0;
if ( cnt >= 8 ) return NULL;
res = new TMESSAGE;
*res = g_Messages[ cnt ++ ];
printf ( "Message received!\n" );
return res;
}
void officer ( const TMESSAGE * msg,
TRESULTS * res,
int resNr )
{
int i;
printf ( "Message processing finished!\n" );
for ( i = 0; i < resNr; i ++ )
printf ( "\tagent %d, shift %d\n", res[i] . m_Agent, res[i] . m_Shift );
if ( resNr == 0 )
printf ( "An invalid message, perhaps KGB?\n" );
delete msg;
}
/***************************************************************************************
*
* AZ PO SEM NECHAT BYT, NESTARAT SE O TO. ZARIDI PROGTEST SAM. PROGRAMOVAT AZ BLOK NIZE:
*
*****************************************************************************************/
int agent;
const unsigned char (* klic)[KEY_LENGTH];
const TMESSAGE *(* greceiver) ( void );
void (* gofficer) ( const TMESSAGE *, TRESULTS *, int );
void *Fun ( void * par2)
{
int i;
unsigned char a=0,b=0,c=16,shift=0,shift2=0,d=0;
const TMessage * zprava;
TResults vysledek[100];
while(1)
{
zprava = greceiver();
if(zprava==NULL){break;;}
int pv=0;
for(shift=0; shift<zprava->m_Length; shift++) //cyklus na desifrovani zprav pro kazdej shift
{
shift2=shift;
d=0;
int k,m;
int pis=0;
for(m=0; m<agent; m++)
{
for(i=0,k=0; i<zprava->m_Length; i++,k++) //desifrovani u jednotlivejch shiftu
{
if(k>KEY_LENGTH-1) //prekroceni delky klice
{
k=0;
}
if(i==0)
{
a=klic[m][k]^i;
b=a;
a=a^(zprava -> m_Message[shift2]);
// printf("%c",a);
continue;
}
a=klic[m][k]^i^b;
b=a;
c=i;
if(c+shift2>zprava->m_Length-1) //pokud pretece velikost zpravy
{
a=a^(zprava -> m_Message[d]);
d++;
}
a=a^(zprava -> m_Message[shift2+i]);
//printf("%c",a);
if(a==71)
{
pis++;
}
if(a==111 && pis==1)
{
pis++;
}
if(a==100 && pis==2)
{
pis++;
}
if(a==32 && pis==3)
{
pis++;
}
if(a==115 && pis==4)
{
pis++;
}
if(a==97 && pis==5)
{
pis++;
}
if(a==118 && pis==6)
{
pis++;
}
if(a==101 && pis==7)
{
pis++;
}
if(a==32 && pis==8)
{
pis++;
}
if(a==116 && pis==9)
{
pis++;
}
if(a==104 && pis==10)
{
pis++;
}
if(a==101 && pis==11)
{
pis++;
}
if(a==32 && pis==12)
{
pis++;
}
if(a==81 && pis==13)
{
pis++;
}
if(a==117 && pis==14)
{
pis++;
}
if(a==101 && pis==15)
{
pis++;
}
if(a==101 && pis==16)
{
pis++;
}
if(a==110 && pis==17)
{
pis++;
}
if(a==33 && pis==18)
{
pis++;
}
if(a==32 && pis==19)
{
pis++;
}
if(pis==19)
{
pis=0;
vysledek[pv].m_Agent=m;
vysledek[pv].m_Shift=shift2;
pv=pv+1;
}
}
//printf("\n");
}
}
gofficer(zprava,vysledek,pv);
}
return NULL;
}
void SecretService ( int agents,
const unsigned char (* keys)[KEY_LENGTH],
int threads,
const TMESSAGE *(* receiver) ( void ),
void (* officer) ( const TMESSAGE *, TRESULTS *, int ) )
{
greceiver=receiver;
gofficer=officer;
agent=agents;
klic=keys;
pthread_t thr[threads];
pthread_attr_t thrAttr;
int i;
void * dummy;
pthread_attr_init ( &thrAttr );
pthread_attr_setdetachstate ( &thrAttr, PTHREAD_CREATE_JOINABLE );
for(i=0; i<threads; i++)
{
pthread_create ( &thr[i], &thrAttr, Fun, NULL);
}
pthread_attr_destroy ( &thrAttr );
/* Cekani na dokonceni vlaken
*/
for(i=0; i<threads; i++)
{
pthread_join ( thr[i], &dummy );
}
//Fun ( par.agents, par.keys, par.threads);
}
/***************************************************************************************
*
* ODSUD UZ ZASE NECHAT BYT. PROGTEST ZARIDI SAM.
*
*****************************************************************************************/
int main ( int argc, char * argv [] )
{
unsigned char keys[2][KEY_LENGTH] =
{
{
0x67, 0xc6, 0x69, 0x73, 0x51, 0xff, 0x4a, 0xec, 0x29, 0xcd, 0xba, 0xab, 0xf2, 0xfb, 0xe3, 0x46,
0x7c, 0xc2, 0x54, 0xf8, 0x1b, 0xe8, 0xe7, 0x8d, 0x76, 0x5a, 0x2e, 0x63, 0x33, 0x9f, 0xc9, 0x9a
}, //spravny klic, ktery desifruje
{
0x76, 0xc6, 0x69, 0x73, 0x51, 0xff, 0x4a, 0xec, 0x29, 0xcd, 0xba, 0xab, 0xf2, 0xfb, 0xe3, 0x46,
0x7c, 0xc2, 0x54, 0xf8, 0x1b, 0xe8, 0xe7, 0x8d, 0x76, 0x5a, 0x2e, 0x63, 0x33, 0x9f, 0xc9, 0x9a
} //spatny klic, hazi nesmysly
};
SecretService ( 2, keys, 3, receiver, officer );
return 0;
}