paulogiann Δημοσ. 1 Φεβρουαρίου 2007 Δημοσ. 1 Φεβρουαρίου 2007 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άρω το επόμενο στοιχείο του πίνακα και επαναλαμβάνω.
FarCry Δημοσ. 1 Φεβρουαρίου 2007 Δημοσ. 1 Φεβρουαρίου 2007 ta idia leme. Aplos epeidi de ksereis poios xaraktiras tha einai kathe fora sto keimeno oi sigkriseis einai 50 gia kathe xaraktira kata meso oro. PS: to non increasing onomazetai decreasing :razz:
paulogiann Δημοσ. 1 Φεβρουαρίου 2007 Δημοσ. 1 Φεβρουαρίου 2007 Ιδού και ένα πολύ απλό πρόγραμμα για πολυαλφαβιτική υποκατάσταση μέσω της XOR encryption. Το τρέχετε στη μορφή ~/xor_encryption <key> <inputfile> <outputfile> Ο ίδιος κώδικας κάνει προφανώς encryption και decryption. PS: Το non increasing λέγεται και monotonically decreasing αλλα μέχρι να το γράψω όλο αυτό.. xor_encryption.zip
FarCry Δημοσ. 1 Φεβρουαρίου 2007 Δημοσ. 1 Φεβρουαρίου 2007 Sketo decreasing would suffice. Giati thelete na eiste toso formalistes? De sas katalabaino :razz: http://en.wikipedia.org/wiki/Monotonic_function
chiossif Δημοσ. 1 Φεβρουαρίου 2007 Δημοσ. 1 Φεβρουαρίου 2007 Ο αλγόριθμος 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
FarCry Δημοσ. 2 Φεβρουαρίου 2007 Δημοσ. 2 Φεβρουαρίου 2007 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:
Directx Δημοσ. 2 Φεβρουαρίου 2007 Δημοσ. 2 Φεβρουαρίου 2007 Το παρακάτω πρόγραμμα ξεκλειδώνει το κρυπτογράφημα με την εφαρμογή της μεθόδου “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 καθώς έχουν ξεφύγει αρκετά
chiossif Δημοσ. 2 Φεβρουαρίου 2007 Δημοσ. 2 Φεβρουαρίου 2007 Δύο φίλοι έχουν συμφωνήσει μία ακολουθία (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
Directx Δημοσ. 3 Φεβρουαρίου 2007 Δημοσ. 3 Φεβρουαρίου 2007 > "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 για τον κώδικα.. Καλή τύχη σε όλους!
Directx Δημοσ. 10 Φεβρουαρίου 2007 Δημοσ. 10 Φεβρουαρίου 2007 Το παρακάτω πρόγραμμα ξεκλειδώνει και τα δυο κρυπτογραφήματα χρησιμοποιώντας τα στοιχεία που υπάρχουν αποθηκευμένα στο διαθέσιμο αρχείο 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; }
chiossif Δημοσ. 10 Φεβρουαρίου 2007 Δημοσ. 10 Φεβρουαρίου 2007 Είχα στον νου μου τον αλγόριθμο κάπως έτσι: Για κάθε χαρακτήρα του 2ου κωδικοποιημένου μυνήματος: - Υπέθεσε ότι είναι ο πρώτος χαρακτήρας της λέξης insomnia και υπολόγισε το απόσπασμα μήκους 8 χαρακτήρων του κλειδιού - Αναζήτησε αυτούς τους 8 χαρακτήρες στο κλειδί. Αν τους βρήκες BINGO! αλλιώς πήγαινε στον επόμενο χαρακτήρα του 2ου κωδικοποιημένου μυνήματος κ.ο.κ. BINGO: Απ' εδώ και πέρα είναι απλή αριθμητική ... Φανταστείτε τον να τρέχει παράλληλα σε 697 (697-8 για την ακρίβεια όπου 8 το μήκος της λέξης insomnia) επεξεργαστές, έναν για κάθε πιθανή θέση του insomnia στο 2o μύνημα! @directX: Αυτό έκανες; Αν ΟΧΙ, ο δικός σου αλγόριθμος ή αυτός είναι ταχύτερος; Ας μην ξεχνάμε ότι συνήθως το 1024 είναι ΤΕΡΑΣΤΙΟ... @all: Thanks for your time and effort...
Directx Δημοσ. 10 Φεβρουαρίου 2007 Δημοσ. 10 Φεβρουαρίου 2007 Φίλε, Chiossif εξήγησα αναλυτικά στο προηγούμενο post μου, τι έκανα, γιατί το έκανα κατ' αυτό τον τρόπο και τι επιπτώσεις έχει στην ταχύτητα υπολογισμού η μέθοδος που ακολούθησα γενικά μεν αλλά και σε συνάρτηση πάντα με το μέγεθος των διαθέσιμων δεδομένων του Quiz. Δεν νομίζω ότι έχω να διευκρινίσω κάτι περισσότερο. Η μέθοδος σου είναι σαφώς γρηγορότερη από αυτή που χρησιμοποίησα ειδικά όταν έχουμε πολλά υποψήφια κλειδιά προς έλεγχο. Καλή συνέχεια
chiossif Δημοσ. 10 Φεβρουαρίου 2007 Δημοσ. 10 Φεβρουαρίου 2007 ... που υλοποιεί τον παραπάνω αλγόριθμο -και λύνει το 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.
21century Δημοσ. 19 Μαρτίου 2007 Δημοσ. 19 Μαρτίου 2007 Πολυ καλη και αναλυτικο αρθρο αλλα πρπεει να κανουμε μια εισαγωγη στην C++ για τους αρχαριους ωστε να κατανοησουν τον τροπο λειτουργιας και την δομη της. Καλο ειναι θα ελεγα να ξεκινησουμεμε αναλογα αρθρα...
xaritos_ Δημοσ. 3 Μαΐου 2007 Δημοσ. 3 Μαΐου 2007 παιδια χρειαζομαι μια βοηθεια θελω στην c++ να φτιαξω ενα προγραμμα στο οποιο να διαβαζονται 15 αριθμοι και να τοποθετουνται σε πινακα αυτο το μερος το εχω κανει στη συνεχεια επειδει εχω κολησει θελω να βρεθει ο πρωτοσ αρτιος αριθμοσ του πινακα και να τυπωθει σε ποια θεση του πινακα υπαρχει και αν δν υπαρχει να διδετε μνμ.μπορει καποιος να βοηθεισει ξερω οτι ειναι κατι το απλο αλλα εχω κολλησει αυτη τη στιγμη αν μπορει καποιος ας βοηθεισει!!!!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.