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

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


Jaco

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

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

 

for (int i=0; i<15 ; i++)

if ( pinakasmod(2) ==0 ) {

cout<<"Found in position"<<i;

break;

}

else {

cout<<"Not found" }

 

Κάπως έτσι.Δε θυμάμαι όμως αν όντως είναι έτσι η συνάρτηση που σου δίνει το υπόλοιπο της διαίρεσης ενός αριθμού με έναν άλλο.Ψάχτο λίγο.

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

  • Απαντ. 125
  • Δημ.
  • Τελ. απάντηση
for (int i=0; i<15 ; i++)

if ( pinakasmod(2) ==0 ) {

cout<<"Found in position"<<i;

break;

}

else {

cout<<"Not found" }

 

Κάπως έτσι.Δε θυμάμαι όμως αν όντως είναι έτσι η συνάρτηση που σου δίνει το υπόλοιπο της διαίρεσης ενός αριθμού με έναν άλλο.Ψάχτο λίγο.

Αν βέβαια το επιτρέπει η περίσταση, μπορείς να κάνεις τον έλεγχο για τον άρτιο κατα την ένθεση.

Καλύτερα ν ανοίξεις ξεχωριστό thread ωστόσο...

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

  • 4 εβδομάδες αργότερα...

Γεια σας,

Εχω ενα μικρό πρόβλημα οσον αφορά τη γλώσσα c++.Εχω ενα λαβυρινθο(τετραγωνικο πινακα) ο οποιος ειναι γεματος με '*' (=εμποδιο) και '.' (=διαδρομος).Εστω οτι θελω να μπω απο μια συγκεκριμενη γραμμη και στηλη και στη συνεχεια να κανω ολες τις πιθανες διαδρομες(χωρις να απαγορευεται να περασω ξανα απο το ιδιο σημειο).Πως ειναι δυνατον να κανω το πρόγραμμα να τρεξει αυτον τον πινακα κατα μηκος και κατα πλατος μονο χωρις να τον τρεξει διαγώνια?(καθε φορα που συνανταει εμποδιο πρεπει να αλλαζει κατευθυνση=να κανει δλδ ολες τις πιθανες διαδρομες προκειμενου να βρει καποιο μονοπατι εξοδου).

Αν καποιος γνωριζει οτιδηποτε πανω σε αυτο το θεμα θα το εκτιμουσα πολυ αν με βοηθουσε μια και μεχρι τωρα δεν εχω βρει ενα σωστο κωδικα για να το υλοποιησω.

Ευχαριστω

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

Nai alla an den vrw eksodo prepei na kanei ta vimata pisw kai na sinexisei na psaxnei gia tin eksodo.Auto pws borw na to kanw?

Τον "εξερευνητή σου", πρέπει να τον αντιμετωπίζεις ως άνθρωπο και όχι ως σημείο. Δηλαδή, αν βρεθεί σε σημείο που δεν έχει στο δεξί του χέρι τοίχο, να κάνει μία στροφή 90 μοιρών προς τα δεξιά μέχρι να βρει τοίχο στο δεξί του χέρι. Μόλις βρει τοίχο στο δεξί του χέρι, τότε να προχωρήσει ένα βήμα μπροστά. Και μετά φτου κι από την αρχή.. Το κατάλαβες ή να το εξηγήσω ξανά (επειδή εγώ δεν είμαι πολύ σίγουρος ότι βγάζουνε νόημα τα παραπάνω)?

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

Nai alla an den vrw eksodo prepei na kanei ta vimata pisw kai na sinexisei na psaxnei gia tin eksodo.Auto pws borw na to kanw?

Αυτό που θες να υλοποιήσεις είναι μια αναζήτηση πρώτα κατα βάθος.

Εύκολα μπορείς να καταλάεις πως το ακόλουθο οδηγεί σε λύση αν αυτή υπάρχει:

 

Ορίζεις την προτεραιότητα με την οποία θα ψάχνεις σε κάθε κόμβο για τον επόμενο διαθεσιμο.

Μπορείς πχ να ελέγχεις αν μπορείς να στρίψεις δεξιά, διαφορετικά να πας ευθεία, διαφορετικά αριστερά,διαφορετικά να γυρίσεις πίσω ένα τετράγωνο.

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

Αυτό που θες να υλοποιήσεις είναι μια αναζήτηση πρώτα κατα βάθος.

Εύκολα μπορείς να καταλάεις πως το ακόλουθο οδηγεί σε λύση αν αυτή υπάρχει:

 

Ορίζεις την προτεραιότητα με την οποία θα ψάχνεις σε κάθε κόμβο για τον επόμενο διαθεσιμο.

Μπορείς πχ να ελέγχεις αν μπορείς να στρίψεις δεξιά, διαφορετικά να πας ευθεία, διαφορετικά αριστερά,διαφορετικά να γυρίσεις πίσω ένα τετράγωνο.

 

Με αυτή την υλοποίηση όμως θα πρέπει να κρατάει ιστορικό με όλες τις προηγούμενες μεταβάσεις και θα πρέπει να ελέγχει τι έχει κάνει για να μην το ξανακάνει. Αυτό για να υλοποιηθεί κοστίζει σε μνήμη επιπλέον & έχω την εντύπωση ότι δεν είναι και το πιο απλό πράγμα στον κόσμο.. Πχ ένας τρόπος για να υλοποιηθεί το παραπάνω είναι η δημιουργία πίνακα που θα είναι αρχικοποιημένες όλες οι θέσεις του στο 0 & ανάλογα με την κίνηση που έχει κάνει, θα αυξάνει κατά ένα το i-οστό στοιχείο του πίνακα εφόσον μιλάμε για την i-οστή κίνηση. Πχ, αν έχει πάει ήδη δεξιά, το array = 1,αν πάει ευθεία, τότε array++ κοκ.

 

Υπάρχει κάποια πιο εύκολη & λιγότερο περίπλοκη λύση του παραπάνω προβλήματος (της δημιουργίας ιστορικόυ δλδ)?

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

Το ίδιο πράγμα λέμε.

Δεν υπάρχει κάποια διαδρομή που να γίνεται 2 φορές.

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

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

Το ίδιο πράγμα λέμε.

Δεν υπάρχει κάποια διαδρομή που να γίνεται 2 φορές.

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

 

Τώρα που το λες και το παρατηρώ, δίκιο έχεις, τον ίδιο αλγόριθμο περιγράφουμε πάνω κάτω με διαφορετικό τρόπο.:lol:

Πάντως πιστεύω ότι είναι πιο εύκολο να λυθεί το πρόβλημα με μία μεταβλητη που θα λέει που βλέπει ο "εξερευνητής" από το να δημιουργηθούν 4-5 if.

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

Φίλοι,

 

πιστεύω ότι η συζήτηση είναι πια εκτός του παροντος θέματος.

Η απάντηση στα ερωτήματα που διάβασα είναι μονολεκτική:

 

Α Ν Α Δ Ρ Ο Μ Ι Κ Α

 

Για περισσότερα μεταφέρετε την συζήτηση σε νέο θέμα.

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

  • 3 μήνες μετά...

Ανάμεσα στις διάφορες κρυπτογραφικές μεθόδους που εξιστορεί ο Simon Singh στο θαυμάσιο βιβλίο «Κώδικες και Μυστικά» εξέχουσα θέση στην καρδιά μου κατέχει ο κώδικας που ανέπτυξε ο Μπλεζ ντε Βιζενέρ (Blaise de Vigenère) ίσος διότι έμεινε στην ιστορία της κρυπτογραφίας ως «Άθραυστος» (Le Chiffre Indechiffrable) –Κεφάλαιο 2 σελ. 83.

 

Επειδή όμως ο χώρος εδώ είναι μικρός για να σας τον εξηγήσω (αφήστε που δεν είμαι κρυπτογράφος ή κρυπτο-αναλυτής) και δεν είμαι σίγουρος εάν έχετε διαβάσει το βιβλίο του Simon Singh, ας διαβάσουμε το πώς δουλεύει η πιο γνωστή και απλή έκδοση του (διότι υπήρξε και μια πολύ πιο ισχυρή ο “Vigenere Autoclave Cipher” –πραγματικά εκείνα τα χρόνια “Le Chiffre Indechiffrable” :D) από το περιεκτικότατο άρθρο της WikiPedia: http://en.wikipedia.org/wiki/Vigenère_cipher.

 

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

 

---

 

Αυτό που ακολουθεί είναι ένας σχετικά απλός κώδικας (αν εξαιρέσουμε την δημιουργία 2D C arrays :D) γραμμένος σε ANSI-C με την βοήθεια του CodeGear Turbo C++ Explorer.

 

Το πρόγραμμα δέχεται ως πρώτη παράμετρο τον κωδικό με τον οποίο θέλουμε να κρυπτογραφήσουμε το κείμενο που εισάγουμε ως δεύτερη παράμετρο, π.χ. Vigenere.exe password plaintext

Αν όλα πάνε καλά πατώντας το Enter θα πρέπει να διαβάσουμε δίπλα από το Cipher, το κείμενο μας κρυπτογραφημένο πια κατά Vigenere.

 

Για να αντιστρέψουμε την διαδικασία (αποκρυπτογράφηση) αρκεί να προσθέσουμε μετά την δεύτερη παράμετρο που τώρα θα πρέπει να περιέχει τα κρυπτογράφημα μας, τον διακόπτη –d, π.χ Vigenere.exe password cipheredtext –d

Αν όλα πάνε καλά πατώντας το Enter θα πρέπει να διαβάσουμε δίπλα από το Plain, το κείμενο μας αποκρυπτογραφημένο.

 

Ο κώδικας ακολουθεί τα βήματα κρυπτογράφησης όπως περιγράφονται στις σελίδες 83..91 του «Κώδικες & Μυστικά» (οπότε εφαρμόζει την απλή εκδοχή του κώδικα Vigenere όπως θα έκανε ένας άνθρωπος) με την διαφορά πως α)αντίθετα με το «Κώδικες & Μυστικά» χρησιμοποιεί το Αγγλικό αλφάβητο των 26 γραμμάτων αντί του ελληνικού αλφάβητου που παρέχει το βιβλίο (Πίνακας σελ. 88 ) και β)σε αντίθεση με το «Κώδικες & Μυστικά» όπου το πρώτο (ελληνικό) αλφάβητο ξεκινά από το Β και το τελευταίο (24ο) από το Α αποφάσισα να ακολουθήσω τον προτεινόμενο από την WikiPedia πίνακα όπου το πρώτο αλφάβητο ξεκινά από το Α και το τελευταίο (26ο) από το Z. Αν παρόλα αυτά κάποιος θέλει να παράγει έναν πίνακα Vigenere ίδιο με εκείνον του βιβλίου απλά ας αλλάξει την “#undef _VIGENERE_GREEK_TABULA_RECTA” σε “#define _VIGENERE_GREEK_TABULA_RECTA”.

 

Το πρόγραμμα επιτρέπει κωδικούς μέχρι 26 χαρακτήρες (καλύπτει την αγγλική γλώσσα), παρόλα αυτά αφήνω την δυνατότητα να αλλάξετε το μέγεθος της αλφάβητου Vigenere αλλάζοντας τον αριθμό του “#define _VIGENERE_ALPHABET_LEN” από 26 σε ότι επιθυμείτε. Σε αυτή την περίπτωση όμως θα πρέπει να προσαρμόσετε κατάλληλα την δηλωμένη στην τοπική μεταβλητή pszAlphabet της ρουτίνας _MakeVigenereMatrix.

 

Αν αποφασίσετε την χρήση της ελληνικής αλφάβητου θα πρέπει α)να αναθεωρήσετε την χρήση της ρουτίνας isalpha με την οποία ελέγχω για το εάν οι χαρακτήρες είναι αλφαβητικοί καθώς ο αυθεντικός Vigenere εφαρμόζεται μόνο σε συνεχόμενο κείμενο, β)να αναθεωρήσετε την χρήση της ρουτίνας toupper με την οποία μετατρέπω σε κεφαλαία κάθε χαρακτήρα καθώς ο Vigenere δουλεύει παραδοσιακά με κεφαλαία γράμματα και γ)φυσικά να τροποποιήσετε τον υπολογισμό της “nLetterIndex = toupper(argv[2][nPlainChar])-'A';” και της “printf("%c",nLetterIndex+'A');” ώστε να λαμβάνει υπόψη της τις θέσεις των ελληνικών χαρακτήρων στον πίνακα ASCII ώστε να γίνονται οι κατάλληλοι υπολογισμοί της θέσης του νέου Vigenere χαρακτήρα (ciphered ή de-ciphered). Αυτά όσον αφορά το ελληνικό conversion (ελπίζω ειλικρινά να μην μου ξέφυγε τίποτα!).

 

Για να διευκολύνω το Debugging συμπεριέλαβα μια ρουτίνα (_DebugVigenere) που εκτυπώνει το τετράγωνο Vigenere που δημιουργεί η ρουτίνα _MakeVigenereMatrix. Η ρουτίνα αυτή συμπεριλαμβάνεται και καλείται από το πρόγραμμα όταν υπάρχει “#define _DEBUG” (στην CodeGear Turbo C++ αυτό το #define προστίθεται αυτόματα για κάθε Debug Release).

 

Παράδειγμα χρήσης,

Κρυπτογράφηση:

>
VIGENERE INSOMNIA THISISASIMPLETEST
Key    :INSOMNIA
Plain: :THISISASIMPLETEST
Cipher :BUAGUFISQZHZQGMSB

 

Αποκρυπτογράφηση:

>
VIGENERE INSOMNIA BUAGUFISQZHZQGMSB -d
Key    :INSOMNIA
Cipher :BUAGUFISQZHZQGMSB
Plain: :THISISASIMPLETEST 

 

Ελπίζω να φανεί ενδιαφέρον -φυσικά μπορεί να περιέχει bugs ή άλλες αβλεψίες.

 

Μπορεί να υπάρχει ευκολότερος τρόπος υπολογισμού του Vigenere tabula recta, εγώ δεν τον γνωρίζω - αλλά το αφήνω σε εσάς!

 

>
/*-Vigenere Cipher Demo (c) by Directx-(non Autoclave Cipher version)----------------*/

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

/*
* Pragmas for CodeGear/Borland C-Compilers.
*/
#ifdef __BORLANDC__
#pragma hdrstop
#endif

/*-C custom function prototypes----------------------------------------------*/
char **_MakeVigenereMatrix(void);
char **_KillVigenereMatrix(char**,int);

/* Standard English Alphabet [26]
*
* If you change this value, you must also review the local _MakeVigenereMatrix 
* function variable: pszAlphabet.
*/
#define	_VIGENERE_ALPHABET_LEN	26
#undef	_VIGENERE_GREEK_TABULA_RECTA

#ifdef _DEBUG
void   _DebugVigenere(char**,int);
#endif

#ifdef __BORLANDC__
#pragma argsused
#endif
int main(int argc, char* argv[])
{
char **pbyVigenereMatrix = NULL;
int nPlainChar, nDecrypt = 0;

printf("Vigenere Cipher Example by Directx\n\n");
	 
if(argc<3 || argc>4)		
	printf(" Usage: VIGENERE password plaintext [-d]\n");
else
 {		 
	/*
	 * Password should be up to 26 characters wide.
	 */
	if(strlen(argv[1])>_VIGENERE_ALPHABET_LEN)
		printf(" Input Error: Very long password - \"%s\"\n",argv[1]);
	else
	 {
		/*
		 * Do we want to de-crypt a Vigenere?
		 */
		if(argc==4)		 
		 if(!strcmp(argv[3],"-d") || !strcmp(argv[3],"-D"))
			nDecrypt = 1;

		/*
		 * Create an English Vigenere Cipher-Matrix ("Tabula Recta").
		 */
		if((pbyVigenereMatrix=_MakeVigenereMatrix())==NULL)
			printf(" System Error: Not enough memory for Vigenere Cipher!\n");		
		else
		 {
			#ifdef _DEBUG
				_DebugVigenere(pbyVigenereMatrix,_VIGENERE_ALPHABET_LEN);
				putchar('\n');
			#endif

			printf(" Key\t:%s\n %s\t:%s\n %s\t:",argv[1],
												 (nDecrypt)?"Cipher":"Plain:",
												 argv[2],				
												 (!nDecrypt)?"Cipher":"Plain:");

			/*
			 * Apply Vigenere Cipher (or de-cipher) on argv[2] using 
			 * key stored on argv[1]..
			 */
			for(nPlainChar=0;nPlainChar<strlen(argv[2]);nPlainChar++)
			 {  	
				int	nVigenereKeyA = nPlainChar % strlen(argv[1]),
					nCol, nRow,
					nVigenereKeyB = -1,
					nLetterIndex;			

				/*
				 * Encrypt or de-crypt?
				 */										 
				if(nDecrypt)
				 {
					/* 
					 * Decipher Vigenere.
					 */
					for(nCol=0;nCol<_VIGENERE_ALPHABET_LEN;nCol++)
					 {
						char *pszCharIdx;
					
						if(isalpha(argv[1][nVigenereKeyA]))
						 {
							if(pbyVigenereMatrix[nCol][0]==toupper(argv[1][nVigenereKeyA]))
							 {
								if((pszCharIdx = memchr(&pbyVigenereMatrix[nCol][0],
														 toupper(argv[2][nPlainChar]),
														 _VIGENERE_ALPHABET_LEN))==NULL)
								 {
									nVigenereKeyB = -3;
									break;
								 }

								nLetterIndex = pszCharIdx-&pbyVigenereMatrix[nCol][0];

								printf("%c",nLetterIndex+'A');
								nVigenereKeyB = 1;
							 }							 
						 }
					 }
				 }
				else
				 {
					/*
					 * Cipher Vigenere.
					 */
					for(nCol=0;nCol<_VIGENERE_ALPHABET_LEN;nCol++)
					 {				 	
						if(isalpha(argv[2][nPlainChar]))				 
						 {
							if(pbyVigenereMatrix[nCol][0]==toupper(argv[1][nVigenereKeyA]))
							  {
								nVigenereKeyB = 1;
								nLetterIndex = toupper(argv[2][nPlainChar])-'A';

								printf("%c",pbyVigenereMatrix[nCol][nLetterIndex]);						
								break;
							  }			
						 }
						else
							nVigenereKeyB=-2;					
					}
				 }						 

				/*
				 * Some short of Vigenere fault?
				 */
				if(nVigenereKeyB==-1)
				 {
					printf(" \a\n\nUnexpected error: Cannot find Vigenere key column (%c)\n",argv[1][nVigenereKeyA]);
					break;
				 }				 
				if(nVigenereKeyB==-2)
				 {
					printf(" \a\n\nVigenere error: Plain text contains illegal character '%c'\n",argv[2][nPlainChar]);
					break;
				 }
				if(nVigenereKeyB==-3)
				 {
					printf(" \a\n\nUnexpected error: Cannot find Vigenere key row (%c)\n",argv[2][nPlainChar]);
					break;
				 }				 				 
			}

			/*
			 * Free Vigenere Cipher-Matrix and other program resources..
			 */
			pbyVigenereMatrix = _KillVigenereMatrix(pbyVigenereMatrix,_VIGENERE_ALPHABET_LEN+1);
		 }
	 }
 }

/*
 * Confirm quit.
 */
printf("\n\nPress Enter to exit..");
getchar();

return 0;
}
/*---------------------------------------------------------------------------*/
char **_MakeVigenereMatrix(void)
{
/*
 * Build a standard Vigenere Matrix for the English language.
 */
char **pbyVigenere = NULL,
	  *pszAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
					/*01234567890123456789012345*/
int nCol, nRow, nChar;

/*
 * Create a Vigenere Matrix -2D- C array..
 */			
if((pbyVigenere=calloc(_VIGENERE_ALPHABET_LEN+1,sizeof(int)))==NULL)
	return NULL;		
for(nCol=0;nCol<_VIGENERE_ALPHABET_LEN+1;nCol++)
 if((pbyVigenere[nCol]=calloc(_VIGENERE_ALPHABET_LEN+1,sizeof(int)))==NULL)
  {
	/* 
	 * On error attempt to get rid of the incomplete
	 * Vigenere Cipher-Matrix..
	 */
	return _KillVigenereMatrix(pbyVigenere,nCol-1);
  }

/*
 * Fill Vigenere Matrix with multi-Ceasar cipher-lines..
 */
for(nCol=0;nCol<_VIGENERE_ALPHABET_LEN;nCol++)
 {
	#ifdef _VIGENERE_GREEK_TABULA_RECTA
		nChar = pszAlphabet[0];
		memmove(pszAlphabet,&pszAlphabet[1],strlen(pszAlphabet)-1);	 
		pszAlphabet[_VIGENERE_ALPHABET_LEN-1] = nChar;
	#endif		

	for(nRow=0;nRow<_VIGENERE_ALPHABET_LEN;nRow++)
		pbyVigenere[nCol][nRow] = pszAlphabet[nRow];
	
	#ifndef _VIGENERE_GREEK_TABULA_RECTA
	/*
	 * Scroll pszAlphabet:
	 *  ABCDEF <- BCDEFA
	 *            CDEFBA
	 *			  DEFBAC
	 *				...	
	 */	 
	nChar = pszAlphabet[0];
	memmove(pszAlphabet,&pszAlphabet[1],strlen(pszAlphabet)-1);	 
	pszAlphabet[_VIGENERE_ALPHABET_LEN-1] = nChar;
	#endif
 }

/*
 * Return 2D Vigenere Matrix..
 */
return	pbyVigenere;
}

char **_KillVigenereMatrix(char **pbyVigenereMatrix,int nDimensions)
{
/*
 * De-allocate pbyVigenereMatrix.
 */
int nCol, nRow;

for(nCol=0;nCol<nDimensions;nCol++)
	free(pbyVigenereMatrix[nCol]);
free(pbyVigenereMatrix);	

return (pbyVigenereMatrix = NULL);
}

#ifdef _DEBUG
void   _DebugVigenere(char **pbyVigenereMatrix,int nDimensions)
{
/*
 * Print a Vigenere Cipher-Matrix on Stdout.
 */
int nCol, nRow, nRowNumber = 1;

printf("   ");
for(nRow=1;nRow<=nDimensions;nRow++)
	printf("%d",nRow%10);
putchar('\n');	
printf("   ");	
for(nRow=1;nRow<=nDimensions;nRow++)
	printf("-");
printf("\n");

for(nCol=0;nCol<nDimensions;nCol++)
 {
	for(nRow=0;nRow<nDimensions;nRow++)
	 {
		if(nRowNumber)
		 {
			printf("%.2d ",nCol+1);
			nRowNumber = 0;
		 }			     			
		putchar(pbyVigenereMatrix[nCol][nRow]);
	 }
	putchar('\n');
	nRowNumber = 1;
}		
}
#endif

vigenere.zip

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

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

Έκανα ένα μικρό project για ένα add-in για το Office 2003... στην ουσία είναι ένα add-in για το Outlook 2003 το οποίο αναλαμβάνει την κρυπτογράφηση και αποκρυπτογράφηση e-mails μέσα από την ίδια εφαρμογή του Outlook, προσθέτοντάς της κάποιες extra λειτουργίες...

 

Ο αλγόριθμος είναι ο AES και υποστηρίζει 128 και 256-bit encryption/decryption... πηγαίνοντας στα θεωρητικά, ο AES είναι ένας συμμετρικός αλγόριθμος κρυπτογράφησης και το κλειδί της επικοινωνίας παραμένει σταθερό για όσο αυτή διαρκεί... στο συγκεκριμένο πρόγραμμα η υλοποίηση του AES είναι πολύ γρήγορη (από τις γρηγορότερες AES που υπάρχουν), όχι ότι παίζει ρόλο στα σημερινά συστήματα που είναι υπερ-γρήγορα, αλλά έτσι ενημερωτικά...

 

Όσων αφορά τον κώδικα της εφαρμογής, αποφάσισα να μην τον δώσω για έναν και μοναδικό λόγο, ο οποίος είναι η ασφάλεια των προσωπικών δεδομένων... ανακάλυψα μέσα στις δυο μέρες που ασχολήθηκα με την δημιουργία του προγράμματος αυτού, ότι η Microsoft είναι πραγματικά ξεβράκωτη σε θέματα ασφαλείας και ότι η προσπάθεια της να κάνει απαραίτητη την χρήση verification keys και του CAS policy δεν έχει ουσιαστικό αποτέλεσμα παρά μόνο σου δυσκολεύει την ζωή όταν γράφεις μια εφαρμογή... με λίγα λόγια βρήκα ένα τρόπο με ένα add-in να μπορώ να αποστέλω το περιεχόμενο των e-mail που γράφει ο χρήστης και σε δεύτερο παραλήπτη ο οποίος δεν φαίνεται πουθενά και το firewall δεν ανιχνεύει την κίνηση αυτή... επομένως όπως είναι λογικό αποφάσισα ότι είναι φρόνιμο να μην δώσω τον κώδικα, γιατί θα μπορούσε κάποιος να καταλάβει πως μπορεί να γίνει αυτό και να το εκμεταλευτεί για "κακούς" σκοπούς... για αυτούς που αναρωτιούνται και πως ξέρουν ότι αυτό το add-in δεν κάνει αυτό το πράγμα, τότε απλά αναφέρω ότι πρώτον δεν με ενδιαφέρουν τα e-mails καθενός και δεύτερον είμαι κατεξοχήν αυτός που φωνάζει για ασφάλεια δεδομένων που σαν αποτέλεσμα είχε και την δημιουργία αυτού του thread...

 

Τα λογισμικά που χρησιμοποιήθηκαν για την εφαρμογή αυτή είναι το .ΝΕΤ VS2005, VS98, .Νet Framework 2.0, Visual Studio Tools for Office και αναλυτικά...:

- Το AES.dll το οποίο αποτελεί την εφαρμογή (add-in) είναι γραμμένο σε VB .NET

- To JacoAES.dll το οποίο είναι η υλοποίηση του AES είναι γραμμένο σε VC++ 6

- Τα CAS policies είναι γραμμένα σε C# .NET

 

Μια αναλυτικότερη παρουσίαση του προγράμματος θα βρείτε ΕΔΩ...

 

Αν βγουν κάποιες διορθώσεις που ελέγχουν τις τρύπες που έχω βρει, τότε θα κάνω και publish τον κώδικα...

 

Ότι λεπτομέρειες χρειαστείτε για την χρήση του προγράμματος, γράψτε μου εδώ ή μέσω pm....

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

Καταρχήν, συγχαρητήρια :-)

 

Όμως, επέτρεψε μου να πιστεύω πως θα ήταν καλύτερα να μην ανέφερες καν το εύρημα σου (μέχρι το patch του..) - τώρα οι γνωρίζοντες έχουν κάποια hints για να το βρουν και να το εκμεταλλευτούν και (τουλάχιστον, ευτυχώς) οι χειριστές για να το γνωρίζουν.

 

Το "ο AES που έχει στο JacoAES.dll θέλω να μείνει δικός μου για προσωπικούς λόγους" που γράφεις στο TheLab ήταν μια πολύ καλή & δίκαια αιτία μη αποκάλυψης του source-code σου, σε σχέση με την ήμι-αποκάλυψη ενός security issue.

 

Sub rosa ...

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

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

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


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