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

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


Jaco

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

Δημοσ.

Πολύ καλή δουλειά..

Ερώτηση 1: Είναι ανιχνεύσιμο?

Ερώτηση 2: Πόσο ανιχνεύσιμο είναι?

 

Thanx

Arni

  • 2 εβδομάδες αργότερα...
  • Απαντ. 125
  • Δημ.
  • Τελ. απάντηση
Δημοσ.
mporei kapoios na mou eksigisei pos akrivos simperiferete o alogithmos tou kairasa??

 

einai poli aplo. dedomenou enos kleidiou to opoio einai arithmos antikathistas ola ta grammata me to gramma = gramma proigoumeno + kleidi

 

paradeigma. to K me kleidi 3 tha ginei N diladi metathesi 3 grammata mprosta N=K+3

Δημοσ.
Πολύ καλή δουλειά..

Ερώτηση 1: Είναι ανιχνεύσιμο?

Ερώτηση 2: Πόσο ανιχνεύσιμο είναι?

 

Thanx

Arni

 

Όπως είπαν και οι προλαλήσαντες,

 

Το κρυπτογράφημα του Καίσαρα (ανήκει στην κατηγορία των «κρυπτογραφημάτων υποκατάστασης γραμμάτων») είναι το πιο διαδεδομένο και συνεπώς εύκολο να ξεκλειδωθεί κρυπτογράφημα, μάλιστα έχει γνωρίσει διαμέσου των αιώνων διάφορες παραλλαγές.

 

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

 

Για περισσότερες πληροφορίες σχετικά με την συγκεκριμένη γενιά κρυπτογραφημάτων διαβάστε από την σελ. 32+ του «Κώδικες και Μυστικά» (Simon Singh).

Δημοσ.

Το παρακάτω πρόγραμμα σε Borland C/C++ Builder 2006, εμπνευσμένο από προηγηθέν ανάλογο του που όμως στάθηκε αδύνατον να γίνει compile, υλοποιεί τον αλγόριθμο κρυπτογράφησης του Καίσαρα σε μικρούς αγγλικούς χαρακτήρες:

 

>
// CEASAR Cryptography in C by DIRECTX

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

//---------------------------------------------------------------------------
char	*_Ceasar(char *pszPlaintext,int nKey);
//---------------------------------------------------------------------------
char	szBuffer[128], szKey[128];
int		nKey;

int main(int argc, char* argv[])
{
for(;
 {
	 printf(" ENTER KEY 1..26 (NOTHING TO QUIT):"); gets(szKey);
	 if(!strlen(szKey))
	  break;
	 if(!(nKey=atoi(szKey)) || nKey>26)
	  {
		printf(" ERROR, INVALID KEY      : %d (RANGE: 1..26)\n",nKey);
		continue;
	  }

	 printf(" ENTER STRING:"); gets(szBuffer);
	 if(strlen(szBuffer))
	  printf(" CEASAR:%s\n",_Ceasar(strlwr(szBuffer),atoi(szKey)));
 }

return 0;
}
//---------------------------------------------------------------------------

char	*_Ceasar(char *pszPlaintext,int nKey)
{
int	nCharIdx,	nPlainLetter;

   // Approved values for nKey 1 to 26
if(nKey<1 || nKey>26)
    return	NULL;

for(nCharIdx=0;nCharIdx<strlen(pszPlaintext);nCharIdx++)
 {
	nPlainLetter	=	pszPlaintext[nCharIdx];

	// Are we dealing with small letter english alphabet?
	if(pszPlaintext[nCharIdx]>='a' && pszPlaintext[nCharIdx]<='z')
	 {
		// Does our key + plain character leads outside english alphabet letters?
		if(nPlainLetter+nKey>'z')
		 pszPlaintext[nCharIdx]	=	(char)96+(nPlainLetter+nKey)-'z'; 	// Swap to z => a etc..
		else
		 pszPlaintext[nCharIdx]+=nKey;				 					// plain char + nKey
	 }
 }

return	pszPlaintext;
}

 

Πυρήνας της εφαρμογής είναι η ρουτίνα _Caesar η οποία μεταθέτει κατά nKey θέσεις τους προς κρυπτογράφηση χαρακτήρες pszPlainText. Ιδιαίτερη μνεία χρειάζεται η συνθήκη:

 

>
if(nPlainLetter+nKey>'z')
pszPlaintext[nCharIdx]	=(char)96+(nPlainLetter+nKey)-'z'; 

 

Με την οποία εάν ένας χαρακτήρας του pszPlainText συν το nKey είναι μεγαλύτερος του τελευταίου αγγλικού γράμματος z (ASCII) ανακυκλώνεται στην αρχή του αλφάβητου (a) συν τις εναπομείνασες θέσεις. Ο αριθμός 96 συμβολίζει τον ASCII χαρακτήρα ` ο οποίος προηγείται του αγγλικού a στο ASCII αλφάβητο οπότε εάν το υπόλοιπο της προσθαφαίρεσης (nPlainLetter+nKey)-'z' για παράδειγμα είναι 1 τότε 96+1 = 97 -> a στο ASCII character set. Σε αυτό το σημείο ελπίζω να μην έχει παρεισφρήσει λάθος στους υπολογισμούς μου (δεν τα πάω καλά με τα μαθηματικά).

 

Πρακτικά με την βοήθεια του συγκεκριμένου λογισμικού κατάφερα να διαβάσω το ανάλογο κρυπτογράφημα που παρέχει ο Simon Singh στο «Κώδικες και Μυστικά» στην σελ. 538 (Στάδιο 2: Μεταθετικό Κρυπτόγραμμα του Καίσαρα).

 

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

:)

  • 5 μήνες μετά...
Δημοσ.

Επειδή είδα πως αρκετοί έχουν πρόβλημα με το compilation, ενώ δεν βλέπω κάποιο πρόβλημα στον κώδικα, ας μου πουν τι error τους δίνει ο compiler... επειδή είναι C++ τα libraries, δεν θα δουλέψει σε C compiler...!

 

Για C compilers τρέξτε το πρόγραμμα που έδωσε επάνω ο DirectX...

 

ΥΓ. Thanks DirectX... :)

  • 5 εβδομάδες αργότερα...
Δημοσ.

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

τα Μετσοβια σας μεσα!

Μπραβο ρε παλικαρια.Παντως J@co δεν ξερω αν φυλας καλα σκοπια,αλλα σιγουρα οι Τουρκαλαδες scrambled message δεν προκειται να περασουν μεσα στη μοναδα....

 

get going

  • 2 εβδομάδες αργότερα...
Δημοσ.

@atoukala:

 

Καλως ήρθες στην συζήτηση για τον Προγραμματισμό.

Φοβάμαι όμως ότι μπήκες από το παράθυρο, φορώντας γάντια. :)

 

Λοιπόν, σε αυτο το θέμα "Κρυπτογράφηση..." δεν συζητούν για δείκτες (αυτό είναι το θέμα σου σωστά;) αλλά για κρυπτογράφηση. Πρέπει πρώτα να αναζητήσεις στο forum αν το θέμα σου έχει ήδη συζητηθεί και που ή μπορείς αν θέλεις να ανοίξης δικό σου θέμα ή να διαβάσεις κάποιο από τα ήδη ανοιγμένα-παραπλήσια με το θέμα σου όπως το http://www.insomnia.gr/vb3/showthread.php?t=167487

 

Τώρα σου'γραψα ότι φορούσες γάντια διότι έγραφες etsi και όχι έτσι.

 

Φαντάζομαι ότι αφού διαβασεις αυτό ο διαχειριστής θα το σβήσει και πολύ καλά θα κάνει...

Δημοσ.

Μια και πέρασα απ' αυτό το θέμα είπα να ρίξω και εγώ τον "οβολό" μου. Έφτιαξα τον αλγόριθμο κρυπτογράφησης του Καίσαρα και σας τον στέλνω σε πηγαίο κώδικα C. Για το καλό όλων μας το πρόγραμμα αυτό στο σύνολό του ακολουθεί GNU General Public License (πιο πολλά byte είναι η άδεια παρά ο κώδικας :-) ).

 

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

 

1. Να κρυπτογραφεί ένα αρχείο σε ένα νέο με μετάθεση κατά ένα ακέραιο αριθμό για παράδειγμα: ...>Caesar_cipher file1.any file2.any 3

 

2. Να αποκρυπτογραφεί με την χρήση αντίθετης μετάθεσης για παράδειγμα: ...>Caesar_cipher file2.any file3.any -3. Αν εκτελεστούν οι δύο αυτές εντολές στην σειρά θα πρέπει να αρχεία file1.any και file3.any να είναι ίδια.

 

3. Επίσης: Έχει απλό έλεγχο σφαλμάτων. Σ'αυτόν περιλαμβάνεται η προσπάθεια αποφυγής καταστροφής υπάρχοντος αρχείου (αν και αυτό δεν είναι απίθανο ιδιαίτερα στα σύγχρονα συστήματα πολυεπεξεργασιών εξαιτίας της χρήσης της fopen και όχι της open - μάλλον πρόκειται για άλλο θέμα). Έχει σίγουρα σφάλματα ή/και παραλείψεις ελπίζω όχι σοβαρά. Λειτουργεί με κάθε μορφής αρχεία ακόμα και συμπιεσμένα -και αυτό το ελπίζω-. Προφανώς σε αυτήν την περίπτωση η αποκρυπτογράφηση χωρίς την γνώση του κλειδιού-αριθμού μετάθεσης ΚΑΙ του τύπου του αρχείου πχ gz jpg θα είναι μάλλον κοπιαστική αλλά στο κάτω κάτω, με το χέρι θα την κάνετε;

 

Γι'αυτό σας συμβουλεύω ΝΑ ΜΗΝ ΤΟ ΕΜΙΣΤΕΥΤΕΙΤΕ για την μετάδοση των πολύτιμων μυστικών σας. Γιατί ΟΛΟΙ όσοι το έχουν δει μπορούν να φτιάξουν έναν απλό εξαντλητικό αλγόριθμο και να σπάσουν τον κώδικα σε λεπτά ή ώρες ανάλογα με τον επεξεργαστή που θα έχουν στην διάθεση τους να προγραμματίσουν.

 

Για περισσότερα στο θέμα ρίξτε μια ματιά:

 

http://en.wikipedia.org/wiki/Caesar_cipher

 

( Όσοι δεν με πιστεύετε για το σπάσιμο του κώδικα ή εμπιστεύεστε το "κόλπο" του Καίσαρα, ρίξτε μια καλή ματιά στους εξωτερικούς συνδέσμους του προηγούμενου άρθρου της wikipedia :-) )

 

ΠΡΟΣΟΧΗ ! Για να αποσυμπιεστεί ΠΡΕΠΕΙ να μετονομαστεί από <Ceasar_Cipher.c.zip> σε <Ceasar_Cipher.c.gz> και φυσικά να χρησιμοποιηθεί το gzip ή κάποιο συμβατό του αποσυμπιεστικό αφού με αυτό συμπιέστηκε. Λυπάμαι για όλα αυτά αλλά δεν προβλέπεται επισύναψη gz αρχείων στο insomnia.

Ceasar_Cipher.c.zip

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

ειναι φοβερο, οστοσο σε ολουσ τουσ κωδικουσ μου βγαζει προβληματα :(

 

μπορει καποιοσ (απο αυτα που εχουμε πει) να κανει εναν κωδικο για C++ ή Visual Basic .net (2005)??

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

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

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