Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 12 Φεβ 2012, 00:10

Το bitwise shift που χρησιμοποιείς ( >> ) δεν έχει απολύτως καμία σχέση με τον όρο "shift" που διαβάζεις στις σελίδες της wikipedia. Μια πιθανή υλοποίηση του Ceasar για τη κρυπτογράφηση του κάθε χαρακτήρα του προς κρυπτογράφηση string θα μπορούσε, ΑΠΛΟΠΟΙΗΜΕΝΑ, να είναι η παρακάτω...

Κώδικας: Επιλογή όλων

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

#define ALPHABET "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#define VALID_CHAR(c) strchr(ALPHABET, (c))

#define pressENTER() \
do{ \
char mYcHAr; \
printf( "press ENTER..." ); \
while ( (mYcHAr=getchar()) != '\n' && mYcHAr != EOF ) \
; \
}while(0)


/*********************************************************//**
* http://en.wikipedia.org/wiki/Caesar_cipher#Example (
************************************************************/
char encrypt( const char c, const int shiftby )
{
if ( !VALID_CHAR(c) || shiftby < 0 )
return '\0';

return ALPHABET[ ((c-'A') + shiftby) % 26 ];
}

/*********************************************************//**
* http://en.wikipedia.org/wiki/Caesar_cipher#Example (
************************************************************/
char decrypt( const char c, const int shiftby )
{
int idx = 0;
if ( !VALID_CHAR(c) || shiftby < 0 )
return '\0';

idx = ((c-'A') - shiftby) % 26;
if (idx < 0 )
idx += 26;

return ALPHABET[ idx ];
}

/*********************************************************//**
*
************************************************************/
int main( void )
{
char c = 'Z', ce = '\0';
int shiftby = 2;

ce = encrypt(c, shiftby);
printf( "encrypt(%c, %d) = %c\n", c, shiftby, ce );
printf( "decrypt(%c, %d) = %c\n", ce, shiftby, decrypt(ce, shiftby) );

pressENTER();
exit( EXIT_SUCCESS );
}


που χρησιμοποιεί μόνο κεφαλαία λατινικά γράμματα. Ότι πληροφορία χρειάζεσαι την εξηγεί στη σελίδα της Wikipedia. Εξαίρεση αποτελεί η παραλλαγή της αποκρυπτογράφησης, επειδή το mod (%) στη C δεν λειτουργεί με τον τρόπο που θεωρεί η Wikipedia (το επισημαίνει κιόλας):

wikipedia έγραψε:
(There are different definitions for the modulo operation. In the above, the result is in the range 0...25. I.e., if x+n or x-n are not in the range 0...25, we have to subtract or add 26.)


Ουσιαστικά σου δίνω έτοιμο τον πυρήνα του Ceasar cipher/decipher υλοποιημένο σε C. Συνέχισέ το από εδώ για να το κάνεις ολοκληρωμένο πρόγραμμα με αρχή, μέση και τέλος, με όποιες προσθήκες/αλλαγές κρίνεις απαραίτητες.

Όταν το τελειώσεις, προσθέτεις και τον Vigenère cipher ;)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 12 Φεβ 2012, 00:28

Τον προσπάθησα τον αλγόριθμο του Καίσαρα αλλά για κάποιο λόγο, όταν βάζω περισπομένη με κλειδί 2 και πάνω μου εκτυπώνει αυτό το παράξενο ερωτηματικό :/
http://ideone.com/yzCwf
EDIT: Καληνύχτα! :D
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 12 Φεβ 2012, 00:35

stamatiou έγραψε:Τον προσπάθησα τον αλγόριθμο του Καίσαρα αλλά για κάποιο λόγο, όταν βάζω περισπομένη με κλειδί 2 και πάνω μου εκτυπώνει αυτό το παράξενο ερωτηματικό :/
http://ideone.com/yzCwf

Δεν βλέπω στον κώδικά σου να υπάρχει αλφάβητος από την οποία θα υπολογίζονται οι shifted/unshifted χαρακτήρες του string. Όταν την βάλεις, είναι κρίσιμης σημασίας τα σύμβολα της αλφάβητου να είναι ταξινομημένα σωστά, ακριβώς με τη σειρά που ορίζει το ascii-code του κάθε χαρακτήρα της αλφαβήτου.

Αλλιώς θα πρέπει να χρησιμοποιήσεις την αλφάβητο ως associative array (πράμα μη τετριμμένο στη C) και να κρατάς χειροκίνητα την σειρά με την οποία εμφανίζονται μέσα στην αλφάβητό σου τα σύμβολά της, ώστε να μπορείς να υλοποιήσεις shift & unshift.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 12 Φεβ 2012, 04:00

stamatiou έγραψε:Τον προσπάθησα τον αλγόριθμο του Καίσαρα αλλά για κάποιο λόγο, όταν βάζω περισπομένη με κλειδί 2 και πάνω μου εκτυπώνει αυτό το παράξενο ερωτηματικό :/
http://ideone.com/yzCwf
EDIT: Καληνύχτα! :D


Τι ακριβώς νομιζεις πως κάνει αυτο που έφτιαξες?????
Γιατι εγω παιρνω την παρακατω εισοδο :

Κώδικας: Επιλογή όλων

Enter text to encrypt: HELLO
Enter encryption key: 1
Source:
HELLO
Encrypted:
IFMMP
kostas@kostas-SSL:~/PROGRAMS$


Και δεν την καταλαβαινω και πολυ... βεβαια εχω κοπανίσει και μισο μπουκάλι (ισως και παραπανω) κρασάκι αποψε
οποτε ειμαι λιγο ντίρλα :lol: :lol: :lol:

ειχε γενεθλια ενα φιλαράκι.... τελοςπαντων migf1 θενξ αλλα θα κοιτάξω να ξεσκαλώσω μονος μου..... μετα θα δω και τον κωδικα σου
να παρω ιδεες αμα δεν τα καταφερω .... θα διαβασω πιο προσεκτικα και τον αλγοριθμο του Καισαρα
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 12 Φεβ 2012, 04:47

btw μπούρδες έκανα !

Άλα ντάλον.... ο αλγόριθμος του Καίσαρα δεν πάει έτσι....

Η κρυπτογράφηση γίνεται -> En( x ) = ( x + n ) mod 26

n ειναι το κλειδί ενω x η θέση του γράμματος στο αλφάβητο ξεκινώντας απο το 0..... 25

συνεπώς αν έχεις κλειδί 3 για παράδειγμα και το 1o γράμμα στο plaintext ειναι το Α τότε για το 1ο

γράμμα του κρυπτοκειμενου σε αντιστοιχία θα προκύψει οτι :

En( x ) = ( 0 + 3 ) mod26 το mod ειναι το υπόλοιπο της διαίρεσης και πάει σε όλο το (n+k) .

Σε αυτή τη περίπτωση οπως και σε περιπτώσεις οπου γενικά (n+k) < 26 λες πχ οτι το 3 (0+3) χωράει στο 26 ας πουμε 0 φορές και αφήνει υπόλοιπο 3

άρα 3 . Το 3 είναι το D ομως σύμφωνα με την θεωρία άρα το Α στο κρυπτοκείμενο θα αντιστοιχεί στο D . Στο επόμενο γράμμα τώρα στο Β έχουμε

En( x ) = ( 1 + 3) mod26 => Εn( x ) = 4 mod26 => En ( x ) = 4 ( το 26 στο 4 χωράει 0 φορές και αφήνει υπόλοιπο 4 ) το 1 αντιστοιχεί στο Β που έβαλα πριν άρα με το 4ο γράμμα που είναι το F για αυτο και στο σχήμα της Wikipedia κανει την αντίστοιχιση ακριβως ετσι.

Παντως αν θέλει κάποιος να ψάξει και τους γραμμικούς κρυπταλγόριθμους της μορφής :

Ek = (ap + b ) mod26 με κλειδί εδω ένα ζεύγος (a,b) πχ (7,12) => Εk= (7p + 12) mod26 αν έχει πχ σε κάποιο σημείο το -> 91 mod 24
(Για ελληνικά) τοτε σταματάει στο 1ο υπόλοιπο και δεν συνεχίζει !!!!
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 12 Φεβ 2012, 10:10

Καλημέρα,

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

Ξεκίνα προσπαθώντας να καταλάβεις πως και γιατί δουλεύει ο κώδικας που ποστάρισα. Κάθε τι που σου είναι άγνωστο ή δεν το καταλαβαίνεις, κοίταξέ το στις διαθέσιμες πηγές σου (βιβλία, σημειώσεις, εγχειρίδια, google, κλπ).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 12 Φεβ 2012, 12:07

Βρε παιδιά Ο αλγπριθμος δεν πρέπει να προσθέτει 3 σε κάθε γράμμα
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 12 Φεβ 2012, 12:32

Όχι 3, αλλά ότι επιλέξει ο χρήστης. Αυτό το shiftby value είναι βασικά το κλειδί της κρυπτογράφησης/αποκρυπτογράφησης. Τον ρωτάς και κάνεις shift τον κάθε χαρακτήρα του κειμένου όσες θέσεις σου έχει δώσει ως κλειδί (και προφανώς τους κάνεις τόσες θέσεις unshift κατά την αποκρυπτογράφηση).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 12 Φεβ 2012, 14:42

Όταν λες shift εννοείς πρόσθεση του κλειδί που στην ASCII τιμή του!
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 12 Φεβ 2012, 14:54

Ναι, αν π.χ σου δώσει για key = 4 στη λέξη "hello", θα πρέπει να προσθέσεις +4 στο κάθε γράμμα της "hello" για να προκύψει η κρυπτογραφημένη λέξη που της αντιστοιχεί.

ΥΓ. Κανονικά το πρόγραμμα δεν θα πρέπει να εξαρτάται από τα ASCII codes, αλλά για αρχή κάντε το έτσι γιατί είναι πολύ πιο απλό.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι