Προς το περιεχόμενο

Κρυπτογράφηση και κωδικοποίηση σε C++


Jaco

Προτεινόμενες αναρτήσεις

Nai lathos. Omos den einai gia kathe xaraktira 256. Molis anagnoristoun kai ta 26 simbola tote oi sigkriseis apo ekei kai istera einai 26. Auto einai tweak. ara kata meso oro oi sigkriseis einai 26 se ena megalo keimeno gia kathe xaraktira.

 

Koitas gia to pio simbolo tha bgalei sixnotita konta sto 12% kai stamatas ton algorithmo. Alla oi sixnotites auksanontai gia kathe simbolo pou briskeis real time. Prepei na elegkseis olo to kriptografima gia na deis tis sixnotites olokliromenes. Ara prepei na deis tis sixnotites kai ton 25 grammaton

1)Μετράω τη συχνότητα του κάθε χαρακτήρα για ΟΛΟ το κείμενο

2)Sortάρω το array κατα non increasing order.

3)Το scanάρω από αριστερά υποθέτοντας οτι το current element, έστω array είναι το 'e'. Τότε το shiftάρισμα είναι κατα |array-'e'|mod256 θέσεις.

4)Με δεδομένο το (3) εμφανίζω το κείμενο. Αν βγαίνει νόημα η διαδικασία έχει τελειώσει. Διαφορετικά scanάρω το επόμενο στοιχείο του πίνακα και επαναλαμβάνω.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 125
  • Δημ.
  • Τελ. απάντηση

Ιδού και ένα πολύ απλό πρόγραμμα για πολυαλφαβιτική υποκατάσταση μέσω της XOR encryption.

Το τρέχετε στη μορφή

~/xor_encryption <key> <inputfile> <outputfile>

Ο ίδιος κώδικας κάνει προφανώς encryption και decryption.

 

PS: Το non increasing λέγεται και monotonically decreasing αλλα μέχρι να το γράψω όλο αυτό..

xor_encryption.zip

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ο αλγόριθμος XOR είναι και αυτός ένας απο τους πιο τρωτούς αλγορίθμους κρυπτογράφησης. Παρόλα αυτά παραλλαγές του χρησιμοποιούνται ακόμα και σήμερα είτε συμπληρωματικά σε άλλους αλγορίθμους είτε για άλλους σκοπούς.

 

Το νέο quiz είναι αρκετά πιο εύκολο από το προηγούμενο:

 

Με τον κώδικα:

>
/* K&R's 1.5.1. + XOR cipher by Ch Iossif*/
#include <stdio.h>

int main(void) {
   int c;
   while ((c = getchar()) != EOF)
       putchar(c^'X');
   return 0;
}

 

κρυπτογράφησα το αρχείο που επισυνάπτω μαζί με το εκτελέσιμο σε linux. Ζητείται η τιμή Χ του κλειδιού που χρησιμοποιήθηκε.

 

Υπόδ. Χρησιμοποιήστε πρώτα το μυαλό σας και μετά την cpu του υπολογιστή σας. Δυστυχώς είναι απαραίτητο το εκτελέσιμο αρχείο (μόνο σε linux). Απλά μετονομάστε το .zip σε .gz, αποσυμπιέστε και εκτελέστε με την εντολή ./xor_cipher <MyText_enc.txt >MyText.txt

 

Καλό ψάξιμο...

xor_cipher.tar.zip

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

One time pad can be broken if the attacker has atleast 1 plaintext-ciphertext pair. Its pretty simple. One time pad takes XOR of a random sequence of bits (called key) with the plaintext to produce the cipertext, so we can describe this mathematically as

 

C = P xor K

 

where C = ciphertext

P = plaintext

K = key

 

if we xor with the plaintext on both sides, we get

 

P xor C = P xor P xor K

 

P xor P on the rhs will yield 0, and anything xored with 0 returns the same

 

so we have effectively

 

K = P xor C

 

now if the attacker has even one plaintext-ciphertext pair then he can produce the key that was used for encryption.

 

For any other cipertext encrypted using the same key, its easy to get the palintext, simply xor the key with the ciphertext, the result would be the plaintext.

 

Following works out an example, (for simplicity only 4 bits are taken)

 

lets assume M = 0101, K = 1101

then C = 1000

 

Suppose attacker knows M & C

then key = 0101 xor 1000 = 1101 which is the original key.

 

now any new ciphertext (encrypted with the same key) can be decrypted.

 

Ego tha protimiso ti reverse engineering lisi :razz:

 

PS: poli mialo akribos 5 lepta sto google.......kala ego to ksero oti exo xarisma sto scouting :razz:

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το παρακάτω πρόγραμμα ξεκλειδώνει το κρυπτογράφημα με την εφαρμογή της μεθόδου “known plain-text attack” κατά την οποία ο χρήστης παρέχει στην εφαρμογή μια λέξη που πιστεύει ότι μπορεί να βρίσκεται κρυπτογραφημένη κάπου στο προς αποκρυπτογράφηση κείμενο.

 

Για να επιτύχει αυτή την διαδικασία η εφαρμογή υπολογίζει και αποθηκεύει σε μια λίστα και τις 255 (256) πιθανές μορφές που μπορεί να λάβει η λέξη μας βάση του αλγόριθμου XOR και ύστερα δοκιμάζει να εντοπίσει κάθε μια από αυτές εντός του κρυπτογραφημένου κειμένου, όταν το καταφέρει θεωρεί ότι εντόπισε το προς εύρεση κλειδί και διακόπτει την διαδικασία.

 

Η είσοδος της εφαρμογής είναι Software όνομα-αρχείου γνωστή-λέξη

 

Αν η εφαρμογή εντοπίσει το κλειδί, το παρουσιάζει στην δεκαδική και δεκαεξαδική μορφή του μαζί με μια πλήρη αποκρυπτογράφηση του κρυπτογραφήματος βάση αυτού του ευρεθέντος κλειδιού.

 

Φυσικά, η εφαρμογή μπορεί να αποκρυπτογραφήσει κρυπτογραφήματα που έχουν κρυπτογραφηθεί συνολικά με ένα κλειδί XOR (σε διαφορετική περίπτωση τα πράγματα ζορίζουν επικίνδυνα).

 

Ο κώδικας αναπτύχθηκε σε CodeGear Turbo C++ Explorer, όπως πάντα μπορεί να υπάρχουν bugs - προς σεβασμό στο Quiz δεν δημοσιεύω το ευρεθέν κλειδί.

 

>
/*-XORCRK R1 (C) BY DIRECTX--------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef __BORLANDC__
 #pragma hdrstop
#endif

/*---------------------------------------------------------------------------*/
char  *BuildKeys(char *pszKnownText,long *Size);
int    SearchBuff(char *pszBuffer,char *pszKey,long BSize,long Size);
void	 PrintBuff(char *pszBuffer,long Size,int nKey);
/*---------------------------------------------------------------------------*/

#ifdef __BORLANDC__
  #pragma argsused
#endif
int main(int argc, char* argv[])
{
 char  *pszKeys, *pszCip = NULL, cDecSuccess = 0;
  long  lCipLen, KeyLen;
  int   nKey;
 FILE  *Stream;

 if(argc==1 || argc>3)
	{
		printf("|XorCrk by Directx\n Usage: file-name plain-text\n");
     return -2;
   }

 /* Open file for read, find it's length and then store it in pszCip */
 if((Stream=fopen(argv[1],"rb"))==NULL)
	{
		printf(" Cannot open file for read - %s\n",argv[1]);
		return -1;
	}
 else
	{
		if(fseek(Stream,0,SEEK_END))
		 printf(" Cannot find end-of-file - %s\n",argv[1]);
		else
		 {
			 if((lCipLen=ftell(Stream))==-1L)
             printf(" Cannot detect file length - %s\n",argv[1]);
			 else
				{
					if((pszCip=(char*)malloc(lCipLen+1))!=NULL)
					 {
						 memset(pszCip,0,lCipLen+1);
						 rewind(Stream);
              if(fread(pszCip,lCipLen,1,Stream)!=1)
               printf(" Read I/O error - %s\n",argv[1]);
              else
							{
                 /* Build PlainText 256 possible keys */
                 if((pszKeys=BuildKeys(argv[2],&KeyLen))==NULL)
                  printf(" Not enough memory for KeySet build - %s\n",argv[1]);
                 else
								 {
									 // Search Ciphered text for possible keys
									 for(nKey=0;nKey<256;nKey++)
										{
											#ifdef _DEBUG_ME
											 printf("%d\n",nKey);
											#endif

											if(SearchBuff(pszCip,&pszKeys[nKey*KeyLen],lCipLen,
																		strlen(argv[2])))
											 {
												 cDecSuccess = 1;
												 printf(" KEY:%.2d (HEX:%.2X) ->\n",nKey,nKey);
												 PrintBuff(pszCip,lCipLen,nKey);
												 break;
											 }
										}
									 free(pszKeys); pszKeys=NULL;

									 if(!cDecSuccess)
									 	printf(" Nothing found, please try a different plain-text!\n");
								 }
							}
						 free(pszCip); pszCip=NULL;
					 }
					else
					 printf(" Not enough memory - %s\n",argv[1]);
				}
		 }
		fclose(Stream);
	}
 return 0;
}
/*---------------------------------------------------------------------------*/
char  *BuildKeys(char *pszString,long *Size)
{
 char  *KeyList    = NULL, *pszCip;
 long   KeyListLen = (strlen(pszString)+1)*sizeof(char),
				lNextKey;
  register int nKey, nKeyC;

  *(long*)Size = -1L;

  if((KeyList=(char*)calloc(256,KeyListLen))!=NULL)
	{
     for(nKey=lNextKey=0;nKey<256;nKey++,lNextKey+=KeyListLen)
      {
        if((pszCip=strdup(pszString))==NULL)
         { free(KeyList); KeyList=NULL; break; }

        for(nKeyC=0;nKeyC<(int)strlen(pszCip);nKeyC++)
         pszCip[nKeyC]^=nKey;

        memcpy(&KeyList[lNextKey],pszCip,strlen(pszString));
        free(pszCip);
      }

     *(long*)Size = KeyListLen;

     #ifdef _DEBUG_ME
     for(nKey=0;nKey<256;nKey++)
		 printf("%.2d\t\"%s\"\n",nKey,&KeyList[nKey*KeyListLen]);
		#endif
	}

 return KeyList;
}

int    SearchBuff(char *pszBuffer,char *pszKey,long BSize,long Size)
{
 register int	nChar,nRestChar;

 for(nChar=0;nChar<BSize;nChar++)
	if(pszBuffer[nChar]==pszKey[0])
	 {
		 if(nChar+Size>BSize)
			break;				
		 if(!memcmp(&pszBuffer[nChar],pszKey,Size))
			return 1;
	 }

 return 0;
}

void	 PrintBuff(char *pszBuffer,long Size,int nKey)
{
register int nCharIdx;

for(nCharIdx=0;nCharIdx<Size;nCharIdx++)
 putchar(pszBuffer[nCharIdx]^nKey);
}

 

Υ.Γ.

Ζητώ κατανόηση για τα tab-stops του Turbo C++ Editor καθώς έχουν ξεφύγει αρκετά :(

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δύο φίλοι έχουν συμφωνήσει μία ακολουθία (1024 για ευκολία, στην πράξη αυτό το νούμερο είναι τεράστιο) τυχαίων αριθμών στο διάστημα [0,255] αποθηκευμένη στο αρχείο key (αποτέλεσμα του κώδικα keygen.c στην δική μας περίπτωση). Με αυτήν κάνουν διαδοχική κρυπτογράφηση XOR κάθε χαρακτήρα του μυνήματος με ένα χαρακτήρα από το κλειδί (με τoν κώδικα XOR_OTP_cipher.c). Κάθε χαρακτήρας του κλειδιού χρησιμοποιείται μια φορά μόνο αφού για το επόμενο μύνημα συνεχίζει το XOR με τους υπόλοιπους χαρακτήρες του κλειδιού διαδοχικά. Ας υποθέσουμε ότι έχουμε στην διάθεση μας το αρχείο-κλειδί key και δύο διαδοχικά μυνήματα κωδικοποιημένα στα αρχεία msg1_enc.txt και msg2_enc.txt (τα οποία δεν είναι και τα μοναδικά που έχουν ανταλλάξει μεταξύ τους οι δύο φίλοι άρα έχει κωδικοποιηθεί τουλάχιστον ένα μύνημα πριν το msg1). Ζητείται η αποκωδικοποίηση του msg2.txt αν γνωρίζουμε ότι στο msg1.txt περιέχεται η λέξη insomnia. Πως θα το λύναμε αν δεν γνωρίζαμε την λέξη;

 

Θέλω να παρακαλέσω όσοι το βρούν ΑΠΛΩΣ να γράψουν - στείλουν εδώ το κείμενο του 2ου μυνήματος και μετά απο μία εβδομάδα τον τρόπο επίλυσης και τον κώδικα που χρησιμοποίησαν. Μετονομάστε το αρχείο .zip σε .gz και αποσυμπιέστε...

Καλή δουλειά...

3rd_Quiz.tar.zip

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

>
"The C Programming Language (sometimes referred to as K&R) is a well
-known computer science book written by Brian Kernighan and Dennis Ritchie, the
latter of whom originally designed and implemented the language (as well as co-d
esigned the Unix operating system with whose development the language was closel
y intertwined). The book was central to the development and popularization of th
e C programming language and is still widely read and used today. Because the bo
ok was co-authored by the original language designer, and because the first edit
ion of the book served for many years as the de facto standard for the language,
the book is regarded by many to be the authoritative reference on C.

 

Ραντεβού την 10/02 για τον κώδικα..

Καλή τύχη σε όλους!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το παρακάτω πρόγραμμα ξεκλειδώνει και τα δυο κρυπτογραφήματα χρησιμοποιώντας τα στοιχεία που υπάρχουν αποθηκευμένα στο διαθέσιμο αρχείο Key.

 

Για να το επιτύχει αυτό δοκιμάζει μια προς μια κάθε πιθανή αλληλουχία κλειδιών που προκύπτουν από τα διαθέσιμα στοιχεία του αρχείου Key αποκρυπτογραφώντας συνολικά το κρυπτογραφημένο αρχείο -δηλαδή εφαρμόζει την πιο απλή μέθοδο επίθεσης brute-force με ότι αυτό συνεπάγεται σε θέματα απόδοσης, το γιατί επέλεξα αυτή την προσέγγιση θα εξηγηθεί παρακάτω.

 

Ο εντοπισμός του σωστού κλειδιού βασίζεται στην εφαρμογή επίθεσης dictionary-based με κώδικα που έχω ήδη δημοσιεύσει σε παλαιότερο post αναδιοργανωμένο σε ορισμένα σημεία ώστε να είναι πιο ευανάγνωστος και ενδεχομένως ταχύτερος σε σχέση με το παρελθόν, αν και το τελευταίο εξαρτάται πολύ από τον χρησιμοποιούμενο compiler και τον τρόπο που κάνει registers optimization.

 

Τα θετικά και αρνητικά της επίθεσης dictionary-based έχουν ήδη αναφερθεί σε προγενέστερο post μου.

 

Ο λόγος που επέλεξα μια γενική επίθεση Brute-force σε ολόκληρο το κρυπτογράφημα αντί της πιο σοφιστικέ plain-text attack επίθεσης στις λέξεις του dictionary εντοπίζοντας τις ύστερα στο κρυπτογράφημα (όπως έκαμα στο λογισμικό XORCRK R1), προέρχεται από το γεγονός πως το παρόν challenge σε γενικές γραμμές ομοιάζει αρκετά με το προγενέστερο CEASAR challenge για το οποίο είχα ήδη αναπτύξει και αναρτήσει λογισμικό (δες το CEASAR De-Cryptography R2) του οποίου η φιλοσοφία και οι ρουτίνες μπορούσαν πολύ εύκολα να προσαρμοστούν στις ανάγκες ετούτου του Quiz -έστω και αν κοστίζουν σε ταχύτητα (αλλά τα δεδομένα του Quiz είναι μικρά έτσι και αλλιώς).

 

Ο κώδικας είναι γραμμένος σε CodeGear Turbo C++ Explorer, το MAX_KEY ορίζει το μέγιστο επιτρεπτό κλειδί του Key (προκύπτει από την τιμή Ι=Ν%[1024]) και φυσικά μπορεί να υπάρχουν bugs..

 

>
/*-XORCRK R2 (C) DIRECTX-----------------------------------------------------*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#ifdef _DEBUG_ME
#include <conio.h>
#endif

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#define	MAX_KEY	1024
/*---------------------------------------------------------------------------*/
typedef struct tagKeyRank
{ int	nScore, nKey; }_TKeyRank;
/*---------------------------------------------------------------------------*/
char	*LoadFile	(char *pszFilename,long *lSize);
char	*Decrypt	(char *pszKey,char *pszBuffer,register int nKey,register int nMaxKey,long lBufSize);
int		Score	(char *pszBuffer,long nLen);
int		QSRT	(const void*,const void*);
/*---------------------------------------------------------------------------*/
#ifdef __BORLANDC__
#pragma argsused
#endif
int main(int argc, char* argv[])
{
int		nKey, nModKey;
long	lKeyLen, lBufferLen;
char	*pszKey = NULL,
		*pszBuffer = NULL,
		*pszDecBuf = NULL;
_TKeyRank *KeyRank = NULL;

if(argc==1)
 printf("|XORCRK R2 (C) DIRECTX\n Usage: XorCrk R2 File-name Key\n");
else
 {
	if((pszBuffer=LoadFile(argv[1],&lBufferLen))==NULL)
	 printf(" File file not found - %s\n",argv[1]);
	else
	 if((pszKey=LoadFile(argv[2],&lKeyLen))==NULL)
	  printf(" Key not found - %s\n",argv[2]);
	 else
	  {
			if((KeyRank=(_TKeyRank*)calloc(MAX_KEY,sizeof(_TKeyRank)))==NULL)
			 printf(" Not enough memory for Key Ranking - %dKB\n",(MAX_KEY*sizeof(_TKeyRank))/1024);
			else
			 {
				for(nKey=0;nKey<MAX_KEY;nKey++)
				 {
						#ifdef _DEBUG_ME
						printf(" -> Using Key: %d\n",nKey);
						#endif
						nModKey=nKey%MAX_KEY;

						if((pszDecBuf=Decrypt(pszKey,pszBuffer,nModKey,MAX_KEY,lBufferLen))==NULL)
						 {
								free(pszDecBuf);
								printf(" Not enough memory for decryption - %s\n",argv[1]);
								break;
						 }

						KeyRank[nKey].nKey=nKey;
						if((KeyRank[nKey].nScore=Score(pszDecBuf,lBufferLen))==-1)
						 {
								free(pszDecBuf);
								printf(" Not enough memory for Key Ranking - %s\n",argv[1]);
								break;
						 }

						free(pszDecBuf); pszDecBuf=NULL;
				 }

				qsort(KeyRank,MAX_KEY,sizeof(_TKeyRank),QSRT);
				if(!KeyRank[0].nScore)
				 printf(" English dictionary attack failed - %s\n",argv[1]);
				else
				 {
						printf(" English dictionary attack proposed key: %d (0x%X) with score %d\n\n",
									 KeyRank[0].nKey,KeyRank[0].nKey,KeyRank[0].nScore);

						if((pszDecBuf=Decrypt(pszKey,pszBuffer,
																	KeyRank[0].nKey,MAX_KEY,lBufferLen))!=NULL)
						 {
								printf(" Plain Text:\"%s\"\n",pszDecBuf);
								free(pszDecBuf);
						 }
						else
						 printf("  Not enough memory for decryption with key %d - %s\n",
										KeyRank[0].nKey,argv[1]);
				 }

				free(KeyRank);
			}
		}
	free(pszKey); free(pszBuffer);
 }

#ifdef _DEBUG_ME
getch();
#endif

return 0;
}
/*---------------------------------------------------------------------------*/
char	*LoadFile(char *pszFilename,long *lSize)
{
FILE	*Stream;
char	*pszBuffer = NULL;

if((Stream=fopen(pszFilename,"rb"))!=NULL)
 {
	if(fseek(Stream,0,SEEK_END))
	 printf(" Cannot find end-of-file %s\n",pszFilename);
	else
	 if((*(long*)lSize=ftell(Stream))==-1L)
	  printf(" Cannot detect file length - %s\n",pszFilename);
	 else
	  if((pszBuffer=(char*)malloc(*(long*)lSize+1))==NULL)
		 printf(" Not enough memory - %s\n",pszFilename);
		else
		 {
            rewind(Stream);
		 if(fread(pszBuffer,*(long*)lSize,1,Stream)!=1)
		  printf(" File read error - %s\n",pszFilename);
	   }

	fclose(Stream);
 }

return pszBuffer;
}

char	*Decrypt(char *pszKey,char *pszBuffer,register int nKey,register int nMaxKey,long lBufSize)
{
register long	lIdx;
char *pszIntrBuffer = NULL;
int	nKeyOffset = nKey;

if((pszIntrBuffer=(char*)malloc(lBufSize+1))!=NULL)
 {
	 memset(pszIntrBuffer,0,lBufSize+1);
	 memcpy(pszIntrBuffer,pszBuffer,lBufSize);

	 for(lIdx=0;lIdx<lBufSize;lIdx++)
		{
			pszIntrBuffer[lIdx]^=pszKey[nKey];
			if(nKey>=nMaxKey) nKey = nKeyOffset; else nKey++;
		}
 }

return	pszIntrBuffer;
}

int		Score(char *pszBuffer,long nLen)
{
static char *pszWords[77] =
 { "the","of","to","and","a","in","is","it",
	 "you","that","he","was","for","on","are",
	 "with","as","I","his","they","be","at",
	 "one","have","this","from","or","had",
	 "by","hot","word","but","what","some",
	 "we","can","out","other","were","all",
	 "there","when","up","use","your","how",
	 "said","an","each","she","which","do",
	 "their","time","if","will","way","about",
	 "many","then","them","write","would",
	 "like","so","her","long","make","thing",
	 "see","him","two","has","look","more",
	 "day","could" };

char	*pszWBuffer = NULL, *pszToken = NULL;
register int nScore = -1, nWordIdx;

if((pszWBuffer=malloc(nLen+1))!=NULL)
 {
		nScore = 0;
		memset(pszWBuffer,0,nLen+1);
		memcpy(pszWBuffer,pszBuffer,nLen);

		if((pszToken=strtok(pszWBuffer," "))!=NULL)
		 {
				do{
						for(nWordIdx=0;nWordIdx<77;nWordIdx++)
						 {
								if(!strcmpi(pszToken,pszWords[nWordIdx]))
								 nScore+=78-nWordIdx;
						 }
					}while((pszToken=strtok(NULL," "))!=NULL);
		 }

		free(pszWBuffer);
 }

return nScore;
}

int	QSRT (const void *A,const void *
{
_TKeyRank	*ptrA = (_TKeyRank*)A,*ptrB = (_TKeyRank*)B;

if(ptrA->nScore>ptrB->nScore) return -1;
if(ptrA->nScore<ptrB->nScore) return 1;
return 0;
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Είχα στον νου μου τον αλγόριθμο κάπως έτσι:

 

Για κάθε χαρακτήρα του 2ου κωδικοποιημένου μυνήματος:

- Υπέθεσε ότι είναι ο πρώτος χαρακτήρας της λέξης insomnia και υπολόγισε το απόσπασμα μήκους 8 χαρακτήρων του κλειδιού

- Αναζήτησε αυτούς τους 8 χαρακτήρες στο κλειδί. Αν τους βρήκες BINGO! αλλιώς πήγαινε στον επόμενο χαρακτήρα του 2ου κωδικοποιημένου μυνήματος κ.ο.κ.

 

BINGO:

Απ' εδώ και πέρα είναι απλή αριθμητική ...

 

Φανταστείτε τον να τρέχει παράλληλα

σε 697 (697-8 για την ακρίβεια όπου

8 το μήκος της λέξης insomnia)

επεξεργαστές, έναν για κάθε

πιθανή θέση του insomnia στο 2o μύνημα!

 

@directX:

Αυτό έκανες;

Αν ΟΧΙ, ο δικός σου αλγόριθμος ή αυτός είναι ταχύτερος;

Ας μην ξεχνάμε ότι συνήθως το 1024 είναι ΤΕΡΑΣΤΙΟ...

 

@all: Thanks for your time and effort...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Φίλε, Chiossif εξήγησα αναλυτικά στο προηγούμενο post μου, τι έκανα, γιατί το έκανα κατ' αυτό τον τρόπο και τι επιπτώσεις έχει στην ταχύτητα υπολογισμού η μέθοδος που ακολούθησα γενικά μεν αλλά και σε συνάρτηση πάντα με το μέγεθος των διαθέσιμων δεδομένων του Quiz.

 

Δεν νομίζω ότι έχω να διευκρινίσω κάτι περισσότερο.

 

Η μέθοδος σου είναι σαφώς γρηγορότερη από αυτή που χρησιμοποίησα ειδικά όταν έχουμε πολλά υποψήφια κλειδιά προς έλεγχο.

 

Καλή συνέχεια :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

... που υλοποιεί τον παραπάνω αλγόριθμο -και λύνει το quiz- είναι:

 

>
/* XOR OneTimePad QUIZ SOLVED by Ch Iossif*/
#include <stdio.h>
#include <stdlib.h>

#define KEYSIZE 1024
char key[KEYSIZE];

int main(void) {
   FILE *fp;
   char *word, msg1_enc[241], wordkey[8];
   int i, j, k, wordlen, ok;
   
   if ((fp=fopen("key","rb"))==NULL)
       exit(1);
   for (i=0;i<KEYSIZE;i++)
       key[i]=fgetc(fp);
   fclose(fp);
   
   if ((fp=fopen("msg1_enc.txt","rb"))==NULL)
       exit(1);
   for (i=0;i<241;i++)
       msg1_enc[i]=fgetc(fp);
   fclose(fp);
   
   word="insomnia";
   wordlen=8;
   
   ok=0;
   for (i=0;i<241-wordlen&&!ok;i++) {
       for (j=0;j<wordlen;j++)
           wordkey[j]=word[j]^msg1_enc[i+j];
           
       for (ok=j=0;j<KEYSIZE-wordlen && !ok;j++)
           for (ok=1,k=0;k<wordlen && ok;k++)
               if (key[j+k]!=wordkey[k])
                   ok=0;
   }
   
   k=j-i+241;
   
   if ((fp=fopen("msg2_enc.txt","rb"))==NULL)
       exit(1);
   for (i=0;i<697;i++)
       putchar(fgetc(fp)^key[k++]);
   fclose(fp);
   putchar('\n');
   
   return 0;
}

 

όπου 241 και 697 είναι τα μεγέθη του 1ου και 2ου μυνήματος αντίστοιχα.

 

Παράδειγμα εκτέλεσης:

>
chiossif@SUSE102:~/MyCode/2007/Forums/OneTimePad_Quiz/Quiz_Solution> ls -l
total 16
-rw-r--r-- 1 chiossif users 1024 2007-02-02 19:11 key
-rw-r--r-- 1 chiossif users  241 2007-02-02 21:14 msg1_enc.txt
-rw-r--r-- 1 chiossif users  697 2007-02-02 21:14 msg2_enc.txt
-rw-r--r-- 1 chiossif users 1023 2007-02-10 21:30 XOR_OTP_decipher.c

chiossif@SUSE102:~/MyCode/2007/Forums/OneTimePad_Quiz/Quiz_Solution> gcc -o Quiz_Solution XOR_OTP_decipher.c

chiossif@SUSE102:~/MyCode/2007/Forums/OneTimePad_Quiz/Quiz_Solution> ./Quiz_Solution
The C Programming Language (sometimes referred to as K&R) is a well-known computer science book written by Brian Kernighan and Dennis Ritchie, the latter of whom originally designed and implemented the language (as well as co-designed the Unix operating system with whose development the language was closely intertwined). The book was central to the development and popularization of the C programming language and is still widely read and used today. Because the book was co-authored by the original language designer, and because the first edition of the book served for many years as the de facto standard for the language, the book is regarded by many to be the authoritative reference on C.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 1 μήνα μετά...

Πολυ καλη και αναλυτικο αρθρο αλλα πρπεει να κανουμε μια εισαγωγη στην C++ για τους αρχαριους ωστε να κατανοησουν τον τροπο λειτουργιας και την δομη της. Καλο ειναι θα ελεγα να ξεκινησουμεμε αναλογα αρθρα...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 1 μήνα μετά...

παιδια χρειαζομαι μια βοηθεια θελω στην c++ να φτιαξω ενα προγραμμα στο οποιο να διαβαζονται 15 αριθμοι και να τοποθετουνται σε πινακα αυτο το μερος το εχω κανει στη συνεχεια επειδει εχω κολησει θελω να βρεθει ο πρωτοσ αρτιος αριθμοσ του πινακα και να τυπωθει σε ποια θεση του πινακα υπαρχει και αν δν υπαρχει να διδετε μνμ.μπορει καποιος να βοηθεισει ξερω οτι ειναι κατι το απλο αλλα εχω κολλησει αυτη τη στιγμη αν μπορει καποιος ας βοηθεισει!!!!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.


  • Δημιουργία νέου...