Jaco Δημοσ. 31 Ιουλίου 2008 Μέλος Δημοσ. 31 Ιουλίου 2008 O AES δεν έχει "αυθεντικό" ή κάτι άλλο είναι απλά ένας αλγόριθμος κρυπτογράφησης... το πώς θα τον υλοποιήσεις και με ποιό τρόπο ορίζεται σαφέστατα από τον ίδιο τον αλγόριθμο και δεν μπορείς να κάνεις κάτι διαφορετικό γιατί δεν θα είναι AES... τον κώδικα μπορείς να τον δεις εδώ..: http://www.hoozi.com/Articles/AES_Encryption.htm Δουλεύει παντού και πάντα... είναι σε C (δηλαδή δουλεύει αυτούσια στην C++)...
Black Tears Δημοσ. 31 Ιουλίου 2008 Δημοσ. 31 Ιουλίου 2008 Σε ευχαριστώ πολύ για την άμεση απάντηση σου Jaco. Συγνώμη για την ανόητη διατύπωση του αυθεντικού απλά δεν έβρισκα κάποιον άλλο τροπο να εκφράσω ότι ήθελα έναν λυτό και απέρριτο κώδικα που θα υλοποιεί τον AES. Ευχαριστώ και πάλι..
FarCry Δημοσ. 31 Ιουλίου 2008 Δημοσ. 31 Ιουλίου 2008 http://fp.gladman.plus.com/AES/index.htm http://www.lomont.org/Software/Misc/AES/AES.php
miza Δημοσ. 29 Σεπτεμβρίου 2008 Δημοσ. 29 Σεπτεμβρίου 2008 Kαθώς σέρφαρα είδα τυχαία αυτό το thread,και είπα να ποστάρω το παρακάτω πρόγραμμα που είχα φτιάξει πριν κάποιο καιρό.Το πρόγραμμα μου κωδικοποιεί ένα κείμενο και το αντίθετο για ένα κείμενο που έχει κωδικοποιηθεί με το πρόγραμμα μου. Δεν έχω διαβάσει κάτι σχετικά με την κωδικοποιήσει απλά μου ήρθε να το φτιάξω ξεκάρφωτα μια ωραία πρωία.Δεν έχω γράψει και καθόλου σχολεια, δεν ξέρω αν θα βγάλετε άκρη άμα το κοιτάξετε . > #include<iostream> #include<conio.h> #include <string> #include <fstream> using namespace std; class kod { public: void kwdikopoihths() { orismos(); do { do { system("cls"); st=""; sv=""; strcpy(sf,""); cout << "1|Kwdikopoihsh--2|Apokwdikopoihsh--3|exit" << endl; l=getch(); if(l=='3') { goto end; } } while(l!='1'&&l!='2'); cout << "1|Apo keyboard--2|Apo arxeio" << endl; do { k=getch(); } while(k!='1'&&k!='2'); if(k=='1') { cout<< "Grapse thn protash: "; getline(cin,st); } else if(k=='2') { m=1; cout<< "Plikrologise to arxeio pou thes na anixeis: "; cin.getline(sf,256); if(srfile()==1) goto end; } len=st.length(); len=len-1; if(l=='1') { trans(); cout << sv <<endl; } else if(l=='2') { untrans(); cout << sv <<endl; } cout<<"Thes na to apothikefseis? y/n" << endl; do { b=getch(); tolower(; } while(b!='y'&&b!='n'); if(b=='n') goto end; do { cout<< "Plikrologise to arxeio pou thes na apothikeftei: "; cin.getline(sf,256); } while(sf==NULL); m=0; srfile(); end:cout << endl; system("pause"); }while(l!='3'); } private: void orismos() { a [ 0 ] = 31 ; for(i=1;i<=95;i++) { a[i]=a[i-1]+1; } for(i=1;i<=95;i++) { for(j=1;j<=95;j++) { z[i][j]=static_cast<char>((a[i]+a[j])%95+32); } } for(i=1;i<=95;i++) { z1[i]=static_cast<char>((a[i]+666)%95+32); } } void trans() { n=0; sv=""; for(i=1;i<=95;i++) { if(st[n]==a[i]) { sv=sv+z1[i]; i=95; } } for(n=1;n<=len;n++) { for(i=1;i<=95;i++) { for(j=1;j<=95;j++) { if(st[n]==a[j]&&st[n-1]==a[i]) { sv=sv+z[i][j]; i=j=95; } } } } } void untrans() { n=0; sv=""; for(i=1;i<=95;i++) { if(st[n]==z1[i]) { sv=sv+static_cast<char>(a[i]); i=95; } } for(n=1;n<=len;n++) { for(i=1;i<=95;i++) { for(j=1;j<=95;j++) { if(st[n]==z[i][j]&&sv[n-1]==static_cast<char>(a[i])) { sv=sv+static_cast<char>(a[j]); i=j=95; } } } } } int srfile() { if(m==0) { ofstream outfile( sf , ios :: out ); outfile << sv; } else if(m==1) { ifstream infile( sf , ios::in ); if(infile==NULL) { cout << "To arxeio den iparxei" << endl; return 1; goto error; } while(infile.eof()!=1) { getline(infile,st2); st=st+st2; } } return 0; error:system("pause"); } int a[97],i,j,k,l,len,m,n,b; string st,sv,st2; char z[97][97],z1[97]; char sf[256]; }; int main() { kod kodip; kodip.kwdikopoihths(); return 0; }
PhreakeR Δημοσ. 22 Νοεμβρίου 2008 Δημοσ. 22 Νοεμβρίου 2008 Καλησπέρα σας... Παρακαλώ αν είναι δυνατόν μπορεί κάποιος να ποστάρει σε C το ceasar cipher και το affine cipher? (όσο απλό αν γίνεται καλύτερα) (κρυπτογράφηση κ αποκρυπτογράφηση) Είναι μεγάλη ανάγκη... Σας ευχαριστώ προκαταβολικά και συγνώμη για το request..
bokarinho Δημοσ. 23 Νοεμβρίου 2008 Δημοσ. 23 Νοεμβρίου 2008 Καλησπέρα σας... Παρακαλώ αν είναι δυνατόν μπορεί κάποιος να ποστάρει σε C το ceasar cipher και το affine cipher? (όσο απλό αν γίνεται καλύτερα) (κρυπτογράφηση κ αποκρυπτογράφηση) Είναι μεγάλη ανάγκη... Σας ευχαριστώ προκαταβολικά και συγνώμη για το request.. Ακολουθεί με απλό όσο το δυνατόν τρόπο το κρυπτογράφημα του Καίσαρα σε C γραμμένο σε MS Visual C++ 2008 Express Edition IDE το οποίο είναι και free από το διαδίκτυο σε MS Windows XP Pro SP2. Απλά αυτό που δεν καταλαβαίνω είναι γιατί να μην προσπαθεί κανείς να μάθει λίγο C, να νιώσει λίγο τον προγραμματισμό. Φίλε μου δεν σου γράφω την αποκρυπτογράφηση, δεν είναι δύσκολο να φτιάξεις ένα brute force attacker να σπάει τον Καίσαρα, αλλά θα μου πεις εδώ δεν φτιάχνουν το ευθύ θα φτιάξουν το αντίστροφο; Τέλος πάντων για να μείνει και στο φόρουμ ορίστε: > /* Caesar Cipher Encryption by BokDB-Bokarinho.*/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <errno.h> /* Encrypt Function. */ char *CaeserCiperEncrypt(const char *PlainText, const int Key) { char *CipherText = NULL; if(!PlainText) return NULL; if(Key < 0 || Key > 25) { printf("You should enter the correct key.\nAborting....\n"); return NULL; } else { /* Start the encryption procedure. */ static unsigned int Idx; if((CipherText = calloc((int)strlen(PlainText)+1, sizeof(char))) == NULL) { printf("Can not allocate enough heap memory for the cipher text..\n"); return NULL; } for(Idx = 0; Idx < strlen(PlainText); Idx++) CipherText[idx] = PlainText[idx] != ' ' ? PlainText[idx] + fmod(Key, 26) : PlainText[idx]; CipherText[idx] = '\0'; return CipherText; } } /* Main Code. */ int main(int argc, char *argv[]) { char *PlText = "Hello Cruel World."; char *CipherText = CaeserCiperEncrypt(PlText, 3); printf("PlainText: %s\n", PlText); printf("CipherText:%s\n", CipherText); /* Free memory gained on heap. */ free(CipherText); getchar(); return EXIT_SUCCESS; } Εκτυπωμένα αποτελέσματα: PlainText: Hello Cruel World. CipherText:Khoor Fuxho Zruog1 Δεν ξέρω τώρα, θα το δώσεις στον καθηγητή σου και θα σου πει μπράβο; Για πες μου; -----Προστέθηκε 23/11/2008 στις 03 : 18 : 44----- Πραγματικά ξέχασα και σαν νιουμπάς και εγώ έγραψα κώδικα όταν ο φίλτατος DirectX έχει δώσει recital στις προηγούμενες σελίδες, προς θεού τα πάντα υπάρχουν σε αυτό το φόρουμ, ούτε καν στον κόπο να ψάξουν κάποιοι δεν μπαίνουν. Φίλε, η άσκηση σου είναι έτοιμη..Μην το πεις ούτε του παπά. :X:X
FarCry Δημοσ. 23 Νοεμβρίου 2008 Δημοσ. 23 Νοεμβρίου 2008 Πραγματικά ξέχασα και σαν νιουμπάς και εγώ έγραψα κώδικα όταν ο φίλτατος DirectX έχει δώσει recital στις προηγούμενες σελίδες, προς θεού τα πάντα υπάρχουν σε αυτό το φόρουμ, ούτε καν στον κόπο να ψάξουν κάποιοι δεν μπαίνουν. Φίλε, η άσκηση σου είναι έτοιμη..Μην το πεις ούτε του παπά.:X:X επειδή ζήτησε και το affine θα υποθέσω με κάθε επιφύλαξη ότι πρόκειται για πληροφορική τει αθηνών η κάνω λάθος?
Directx Δημοσ. 23 Νοεμβρίου 2008 Δημοσ. 23 Νοεμβρίου 2008 @Bokarinho: Σε ευχαριστώ πολύ @PhreakeR : Ακολουθεί μια υλοποίηση του Affine Cipher / Decipherer σε ANSI-C απλά διότι δεν το είχα υπόψη μου και μου κέντρισε το ενδιαφέρον, ειδικά όλα όσα αφορούν τα coprime και multiplicand inversions που απαιτεί για να επιτευχθεί η αποκρυπτογράφηση. Για περισσότερες πληροφορίες μελετήστε τα σχόλια του source: > /*-Affine Cipher / Decipher by Directx in ANSI-C----------------------------- * * Για περισσότερο ψάξε το Google! Το Google είναι φίλος σου!! */ #include <stdio.h> #include <string.h> #ifdef __BORLANDC__ /* Εντολές pragma για CodeGear/Borland compilers */ #pragma hdrstop #endif /*---------------------------------------------------------------------------*/ void AffineEnc(char *pszInput, int nKeyA, int nKeyB); void AffineDec(char *pszInput, int nKeyA, int nKeyB); int BruteMInv(int nKeyA, int nMod); #define _KEYA 11 /* Το κλειδί Affine */ #define _KEYB 7 /* Το κλειδί Καϊσαρ */ #define _MODBASE 26 /* Τα γράμματα της αλφάβητου */ #ifdef __BORLANDC__ /* Εντολές pragma για CodeGear/Borland compilers */ #pragma argsused #endif int main() { /* Τοπικές μεταβλητές */ char *pszPlainText = "THISISASIMPLETEST"; int nMulInv; /* * Το κλειδί μας είναι ( (Affine) _KEYA * pszPlainText + _KEYB (Ceasar shift) ) % _MODBASE */ AffineEnc(pszPlainText, _KEYA, _KEYB); printf("Encrypted:\t%s\n", pszPlainText); /* Υπολογισμός του multiplicative inverse για το nKeyA */ if((nMulInv = BruteMInv(_KEYA, _MODBASE)) == -1) printf(" KeyA (%d) not coprime within mod %d\n", nMulInv, _MODBASE); else { /* * Το κλειδί αποκρυπτογράφησης μας είναι ( (Affine) nMulInv * pszPlainText - _KEYB (Ceasar shift) ) % _MODBASE */ AffineDec(pszPlainText, nMulInv, _KEYB); printf("Decrypted:\t%s\nMulInv = %d\n", pszPlainText, nMulInv); } /* Τέλος προγράματος */ printf("\nPress Enter to resume.."); getchar(); return 0; } /*---------------------------------------------------------------------------*/ void AffineEnc(char *pszInput, int nKeyA, int nKeyB) { int nCharIdx = 0; /* * Σε πρώτη φάση εφαρμόζουμε το κρυπτόγραμμα του Καίσαρα με βάση το nKeyB * και ύστερα πολλαπλασιάζουμε το κρυπτογράφημα του Καίσαρα με το nKeyA (Affine). * * Το nKeyA οφείλει να είναι coprime (πρώτος) μεταξύ των γραμμάτων / τιμών * του αλφάβητου (coprime). * * Σε κάθε περίπτωση φροντίζουμε ώστε να ανακυκλώνουμε το γινόμενο των * παραπάνω υπολογισμών μεταξύ των _MODBASE γραμμάτων του αλφαβήτου (μοδιακά μαθηματικά modulo). */ for(; nCharIdx < strlen(pszInput); nCharIdx++) pszInput[nCharIdx] = 'A' + ((nKeyA * pszInput[nCharIdx] - 'A' + nKeyB) % _MODBASE); } void AffineDec(char *pszInput, int nKeyA, int nKeyB) { int nCharIdx = 0; /* * Αντιστρέφουμε την διαδικασία της ρουτίνας AffineEnc με την προϋπόθεση όμως * ότι γνωρίζουμε το multiplicative inverse του nKeyA που χρησιμοποιήσαμε κατά * την διαδικασία κρυπτογράφησης. */ for(; nCharIdx < strlen(pszInput); nCharIdx++) pszInput[nCharIdx] = 'A' + (nKeyA * ((pszInput[nCharIdx] + 'A') - nKeyB) % _MODBASE); } int BruteMInv(int nKeyA, int nMod) { /* * Επέστρεψε το Modulo Multiplicative Inverse του nKeyA. * * Η μέθοδος υπολογισμού είναι Brute-Force καθώς το εύρος τιμών είναι * μικρό (_MODBASE γράμματα / αριθμοί). * * Για μεγαλύτερους αριθμούς δες την μέθοδο του Ευκλείδη / GCD. */ int nMulInv = 0; for(; nMulInv < nMod; nMulInv++) if((nMulInv * nKeyA) % nMod == 1) return nMulInv; return -1; /* Το nKeyA δεν είναι coprime στο εύρος nMod */ } Τεχνικά ως κρυπτογραφική μέθοδος δεν είναι καθόλου ασφαλής, πρόκειται για ένα ενισχυμένο κρυπτογράφημα Καίσαρα και μπορεί να αναλυθεί με την βοήθεια συχνοτήτων (απλό κρυπτογράφημα αντικατάστασης) και άλλες εξελιγμένες μαθηματικές τεχνικές. Για ακόμα περισσότερες πληροφορίες σχετικά με αυτό τον απλό στο να σπάσει Cipher ψάξτε στο Google. Υ.Γ. Μαθηματικός δεν είμαι οπότε πιθανόν να υπάρχουν bugs ή άλλες αβλεψίες. Ελπίζω να φανεί χρήσιμος ή τουλάχιστον ενδιαφέρον στους fans της Κρυπτογραφίας.
vtsafantakis Δημοσ. 23 Νοεμβρίου 2008 Δημοσ. 23 Νοεμβρίου 2008 Παιδιά επειδη και εγω κανω κατι τετοιες εργασίες, ξερει κανεις που μπορω να βρώ τον Extended Greatest Common Divisor του ευκλείδη σε C ,C++ . Η ακομα καλητερα σε visual basic. TO χρειάζομαι άμεσα κάθε βοήθεια είναι πολύτιμη. Thanks kai pali.
bokarinho Δημοσ. 23 Νοεμβρίου 2008 Δημοσ. 23 Νοεμβρίου 2008 Παιδιά επειδη και εγω κανω κατι τετοιες εργασίες, ξερει κανεις που μπορω να βρώ τον Extended Greatest Common Divisor του ευκλείδη σε C ,C++ . Η ακομα καλητερα σε visual basic. TO χρειάζομαι άμεσα κάθε βοήθεια είναι πολύτιμη. Thanks kai pali. Γιατί δεν φτιάχνεται ένα νέο thread που θα ποστάρουν άτομα που θέλουν να τους κάνουν τους εργασίες; Θα βόλευε πιστεύω...
PhreakeR Δημοσ. 23 Νοεμβρίου 2008 Δημοσ. 23 Νοεμβρίου 2008 καταρχήν ευχαριστώ όσους απάντησαν και τους ζητώ συγνώμη... Φυσικά και ξέρω προγραμμστισμό (τουλάχιστον δεν είμαι τελείως άσχετος) Σπουδάζω πληροφορική απλώς δεν προλάβαινα μέσα στο deadline Βλέπετε έχουν μαζευτεί τόσες εργασίες (έδωσα μεγαλύτερη σημασία στην Ψηφιακή επεξεργασία Σήματος κ Εικόνας άλλωστε όσοι ασχολούνται με το άθλημα ξέρουν τι παλούκι είναι ) Πραγματικά είναι η πρώτη φορά που ζητάω κάτι τέτοιο σε φόρουμ...κ ντρέπομαι γι αυτο Απλά τους χρειαζόμουν τους κώδικες όσο το δυνατόν πιο γρήγορα..και ρώτησα γτ είδα ότι κ άλλοι έχουν ασχοληθεί με το ζήτημα.. Σαφώς κ ξενερώνω με όσους (ακόμα κ μένα σε αυτήν την περίπτωση) ζητάνε κώδικα χωρίς να φτιάξουν κάτι οι ίδιοι πρώτα... Πιστεύω μέσα από τα επόμενα ποστ μου να μπορέσω να επανορθώσω... Πραγματικά συγνώμη... -----Προστέθηκε 23/11/2008 στις 06 : 53 : 23----- όπως και σαφώς δεν θα δώσω τον κώδικα στον καθηγητή μου αυτούσιο μια κ ο καθηγητής κρυπτογραφίας είναι κατα βάση μαθηματικός (κ δεν ξέρει τι του γίνεται) οπότε ακόμα κ οι ντιρεκτίβες math.h θα του φανούν βουνό
Directx Δημοσ. 9 Ιανουαρίου 2009 Δημοσ. 9 Ιανουαρίου 2009 Μια απλή και αρκετά διαδεδομένη στους κύκλους των μυστικιστών κρυπτογραφική μέθοδος είναι το κρυπτογράφημα “Atbash”. Πρόκειται για ένα κρυπτογράφημα υποκατάστασης των χαρακτήρων με τα αντίστροφα γράμματα του αλφάβητου που μας ενδιαφέρει. Έτσι για παράδειγμα το Α γίνεται Ω, το Β γίνεται Ψ ενώ το Γ γίνεται Χ κτλ (ΑΒΓ -> ΧΨΩ). Η αποκρυπτογράφηση επιτυγχάνεται με αντίστροφη διαδικασία (ΧΨΩ -> ΑΒΓ). Ο “Atbash” χρησιμοποιήθηκε αρκετά αποτελεσματικά (για την εποχή του καθώς σήμερα δεν προσφέρει καμιά ουσιαστική ασφάλεια!) σε διάφορα σημεία της Εβραϊκής βίβλου κεντρίζοντας μετέπειτα το ενδιαφέρον των Ευρωπαίων μελετητών – ερευνητών (αποκρυφιστών). Ακολουθεί μια γρήγορη υλοποίηση του σε C++ για το λατινικό αλφάβητο: > /* *-ATBASH CODEC in C++ (c) directx------------------------------------------- */ #include <iostream> #include <string> #include <locale> #ifdef __BORLANDC__ #pragma hdrstop #endif //--------------------------------------------------------------------------- #ifdef __BORLANDC__ #pragma argsused #endif int main(int argc, char* argv[]) { // Usage: ATBASHCODEC \"text\" if(argc == 1) { std::cout << "ATBASHCODEC \"TEXT\"" << std::endl; return 1; } else { std::string strCipher = argv[1]; // On ATBASH input you get plain-text else you get ATBASH ciphered-text for(int nCharIdx = 0; nCharIdx < strCipher.length(); nCharIdx++) if(std::isalpha(strCipher.at(nCharIdx))) std::cout << (char) ('Z' - ( ( 'Α' + std::toupper(strCipher.at(nCharIdx)) ) - 1) + 1); else // Invalid character - "spit" space std::cout << " "; } // End of program return 0; } //--------------------------------------------------------------------------- Αν εισαχθεί (ως παράμετρος) κρυπτογραφημένο κείμενο θα πάρετε την αποκρυπτογράφηση του, αν εισαχθεί αποκρυπτογραφημένο κείμενο θα πάρετε την κρυπτογράφηση του. Παράδειγμα: > Εντολή: ATBASHCODEC TEST Αποτέλεσμα: GVHG > Εντολή: ATBASHCODEC GVHG Αποτέλεσμα: TEST Ο κώδικας έχει δοκιμασθεί σε ET/CodeGear C++ Builder (ενδεχομένως να χρειασθούν μικρές μετατροπές στις δηλώσεις std:: σε άλλους compilers).
Brainy Δημοσ. 6 Απριλίου 2009 Δημοσ. 6 Απριλίου 2009 Καλησπερα παιδια. Μηπως μπορει καποιος να ποσταρει καποιους, απλους οσο γινεται, κωδικες σε C για καποιους συγκεκριμενους αλγοριθμους? Συγκεκριμενα χρειαζομαι (για εργασια της σχολης): 1)Monoalphabetic Substitution cipher 2)Transposition cipher 3)Homophonic Substitution cipher 4)Vigenere cipher 5)Beauford cipher Ευχαριστω!
Directx Δημοσ. 7 Απριλίου 2009 Δημοσ. 7 Απριλίου 2009 Αν ψάξεις λίγο το παρόν θέμα (δεν είναι δα και πολλές σελίδες) θα βρεις κώδικα τόσο για monoalphabetic όσο και για Vigenere κρυπτογράφηση!
bokarinho Δημοσ. 8 Απριλίου 2009 Δημοσ. 8 Απριλίου 2009 Ακολουθεί μία υλοποίηση του Beaufort cipher κρυπτογραφήματος σε C, επεκτείνοντας έτσι το thread της κρυπτογράφησης με επιπλέον κώδικα και γνώση. Είναι μία δοκιμαστική έκδοση θα βελτιωθεί με μία καλύτερη main function, φυσικά μπορεί να περιέχει bugs ή άλλου είδους αβλεψίες. > #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #define LCOUNT 26 /* Main Functions. */ char *CreateAlphabetText(int _offset, int nLetters) { static int i = 0; unsigned short int _LSUM; char *Alphabet = NULL; if(!(Alphabet = (char *)calloc(nLetters+1, sizeof(char)))) { printf("Error, unable to allocate memory:%s\n", strerror(errno)); return NULL; } for(i = 0; i < nLetters; i++) { _LSUM = i+_offset; if(_LSUM >= nLetters) { Alphabet[i] = 'A' + (_LSUM % nLetters); continue; } Alphabet[i] = 'A'+_LSUM; } /* Terminate the alphabet. */ Alphabet[nLetters] = '\0'; return i == nLetters ? Alphabet : NULL; } /* Creates the array tableau that consists the letter struct, sse wikipedia. */ char **Tabula_Recta(int RowCnt, int ColCnt) { static int i = 0, j = 0; char **tableau = NULL; if(!(tableau = (char **)calloc(RowCnt, sizeof(char*)))) { printf("Error, unable to allocate memory:%s\n", strerror(errno)); return NULL; } else { for(i = 0; i < RowCnt; i++) { if(!(tableau[i] = CreateAlphabetText(i, ColCnt))) break; } if(i != RowCnt) { free(tableau); return NULL; } return tableau; } } /* Dumps a string array. */ void DumpArray(char **A, int RowCnt, int ColCnt) { static int i, j; for(i=0; i < RowCnt; i++) { for(j = 0; j < ColCnt; j++) { printf("%2c ", A[i][j]); } printf("\n"); } } /* Frees an array. */ void FreeArray(char **A) { unsigned short int i = 0; if(A) { while(i < LCOUNT) { free(A[i]); i++; } free(A); A = NULL; } } /* Trims the space character. */ char* TrimSP(char *Text) { if(Text) { unsigned short int i = 0, j = 0; char *rText = NULL; if(!(rText = calloc(strlen(Text)+1, sizeof(char)))) { printf("Memory Error: %s\n",strerror(errno)); return NULL; } for(i = 0; i < (unsigned int)strlen(Text); i++) { if(Text[i] == ' ') continue; rText[j++] = Text[i]; } if(j < i) { rText = realloc(rText, (j+1) * sizeof(char)); rText[j] = '\0'; return rText; } } } /* Basic encode function, encodes the plain text. */ char *EncodeBC(char *PText, char *KText) { if(PText && KText) { /* This array will hold the encoded value of PText string using the Beaufort Cipher according to KText key value. */ char *CipherText = NULL; /* Firstly we need to trim whitespaces from the input string. */ char *tPText = TrimSP(PText); CipherText = strdup(tPText); memset(CipherText, 0, strlen(CipherText)); if(tPText) { /* We create the Tabula Recta array here, english alphabet LCOUNT letters. */ char **TRecta = Tabula_Recta(LCOUNT,LCOUNT); if(TRecta) { int index = 0, nIndex = 0; static int iDx, jDx; for(iDx = 0,jDx = 0; iDx < strlen(tPText); iDx++) { if(jDx == strlen(KText)) jDx = 0; for(index = 0; index < LCOUNT; index++) { if(TRecta[0][index] == tPText[iDx]) break; } for(nIndex = 0; nIndex < LCOUNT; nIndex++) { if(TRecta[nIndex][index] == KText[jDx]) break; } /* Fetch me the key. */ CipherText[iDx] = TRecta[nIndex][0]; /* Reset the values. */ nIndex = 0; index = 0; jDx++; } /* Terminate message. */ CipherText[iDx] = '\0'; /* Free used memory. */ FreeArray(TRecta); free(tPText); } else { printf("Memory Fault: %s\n", strerror(errno)); free(tPText); return NULL; } } /* Return the Cipher Text. */ return CipherText; } else { printf("Invalid function arguments: %s\n", strerror(errno)); return NULL; } } /* Main Code. */ int main(int argc, char *argv[]) { char *Cipher = EncodeBC("DEFEND THE EAST WALL OF THE CASTLE", "FORTIFICATION"); printf("Bokarinho Beaufort Cipher Encode Implementation.\n\n"); printf("PlainText:DEFEND THE EAST WALL OF THE CASTLE\n"); printf("Key:FORTIFICATION\n"); printf("CipherText:%s\n", Cipher); free(Cipher); printf("Hit enter to continue...\n"); getchar(); return 0; }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.