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

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

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

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

Δημοσίευσηαπό migf1 » 27 Αύγ 2011, 13:22

Στο συγκεκριμένο δεν μπορούμε.

Με τους πίνακες που είχα ποστάρει πριν φύγω για διακοπές έχει ασχοληθεί κανείς; Υπάρχει ενδιαφέρον για συνέχεια; viewtopic.php?p=202666#p202666
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 27 Αύγ 2011, 14:13

Star_Light έγραψε:ΕΓω στις διακοπές σκέφτηκα πως θα ήταν φοβερο να μπορέσω να φτιάξω ενα πρόγραμμα κρυπτογράφησης σε C είτε του stdin είτε κάποιου άλλου αρχείου. Μιας και τα strings τα έχουμε έτοιμα. Θα πρέπει να φτιάξω μια συναρτηση cypher η οποία θα κάνει ολη την δουλειά και να εισάγω και ένα κλειδί μέσα. Πιστευω ειναι πολυ καλη ιδέα εσεις τι λέτε? :P

Για αρχή ας πούμε μπορεί ο χρήστης να δίνει την φράση

"hello friend"

και το πρόγραμμα να τυπώνει στην οθόνη

"ehlol rfeidn" δηλαδη θα κάνει μια αντιμετάθεση των στοιχείων ενος πίνακα.
Το ενα θα μπαίνει στην θέση του άλλου (φυσικά εδω δεν χρειάζεται κλειδί)
θα σκεφτω πως μπορω να το υλοποιησω και μονος μου... σκεφτείτε να φτιάξετε ενα ωραιο δικο σας προγραμματακι σε C το οποιο θα κρυπτογραφεί ένα αρχείο κειμένου πριν το στείλετε καπου... ειναι σαν να τρως λαχανικά απο τον κήπο σου!!!!!!!!! :lol: :lol: :lol:


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

#include <stdio.h>
// ----------------------------------------------------------------------------------------
char *cipher( char *s )
{
if ( !s )
return NULL;

char *cp = s;
while( *s )
*s++ ^= 13;

return cp;
}
// ----------------------------------------------------------------------------------------
int main( void )
{
char s[] = "This is a test for (dummy) ciphering. / Παράδειγμα (χαζής) κρυπτογράφησης.";

printf("Original:\n%s\n\n", s);
printf("Ciphered:\n%s\n\n", cipher( s ) );
printf("DeCiphered:\n%s\n\n", cipher( s ) );

return 0;
}

Απλή αντικατάσταση κάθε χαρακτήρα του s με τον χαρακτήρα που προκύπτει όταν κάνουμε XOR τον αυθεντικό με μια τιμή (έβαλα 13 εγώ). Εφαρμόζοντας ξανά το ίδιο XOR επανέρχονται στην αυθεντική τους τιμή. Προφανώς δεν πρόκειται για σοβαρή κρυπτογράφηση, εξού και το "dummy cipher" στον κώδικα :lol:

Όποιος θέλει μπορεί να δοκιμάσει να φτιάξει το (εξίσου χαζό) ROT13 ciphering: http://en.wikipedia.org/wiki/ROT13
Τελευταία επεξεργασία από migf1 και 27 Αύγ 2011, 15:08, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 27 Αύγ 2011, 14:47

migf1 έγραψε:
Star_Light έγραψε:ΕΓω στις διακοπές σκέφτηκα πως θα ήταν φοβερο να μπορέσω να φτιάξω ενα πρόγραμμα κρυπτογράφησης σε C είτε του stdin είτε κάποιου άλλου αρχείου. Μιας και τα strings τα έχουμε έτοιμα. Θα πρέπει να φτιάξω μια συναρτηση cypher η οποία θα κάνει ολη την δουλειά και να εισάγω και ένα κλειδί μέσα. Πιστευω ειναι πολυ καλη ιδέα εσεις τι λέτε? :P

Για αρχή ας πούμε μπορεί ο χρήστης να δίνει την φράση

"hello friend"

και το πρόγραμμα να τυπώνει στην οθόνη

"ehlol rfeidn" δηλαδη θα κάνει μια αντιμετάθεση των στοιχείων ενος πίνακα.
Το ενα θα μπαίνει στην θέση του άλλου (φυσικά εδω δεν χρειάζεται κλειδί)
θα σκεφτω πως μπορω να το υλοποιησω και μονος μου... σκεφτείτε να φτιάξετε ενα ωραιο δικο σας προγραμματακι σε C το οποιο θα κρυπτογραφεί ένα αρχείο κειμένου πριν το στείλετε καπου... ειναι σαν να τρως λαχανικά απο τον κήπο σου!!!!!!!!! :lol: :lol: :lol:


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

#include <stdio.h>
// ----------------------------------------------------------------------------------------
char *cipher( char *s )
{
if ( !s )
return NULL;

char *cp = s;
while( *s )
*s++ ^= 13;

return cp;
}
// ----------------------------------------------------------------------------------------
int main( void )
{
char s[] = "This is a test for (dummy) ciphering. / Παράδειγμα (χαζής) κρυπτογράφησης.";

printf("Original:\n%s\n\n", s);
printf("Ciphered:\n%s\n\n", cipher( s ) );
printf("DeCiphered:\n%s\n\n", cipher( s ) );

return;
}

Απλή αντικατάσταση κάθε χαρακτήρα του s με τον χαρακτήρα που προκύπτει όταν κάνουμε XOR τον αυθεντικό με μια τιμή (έβαλα 13 εγώ). Εφαρμόζοντας ξανά το ίδιο XOR επανέρχονται στην αυθεντική τους τιμή. Προφανώς δεν πρόκειται για σοβαρή κρυπτογράφηση, εξού και το "dummy cipher" στον κώδικα :lol:

Όποιος θέλει μπορεί να δοκιμάσει να φτιάξει το (εξίσου χαζό) ROT13 ciphering: http://en.wikipedia.org/wiki/ROT13

:bow: :bow: :bow: :bow: :bow: :bow:
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 27 Αύγ 2011, 15:05

Χεχε, thanks ρε συ, αλλά είναι πολύ απλό για να αξίζει... υποκλίσεις :)

Ορίστε και μια πολύ πρόχειρη υλοποίηση του ROT13 ciphering (δουλεύει μονάχα για λατινικά γράμματα):

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

#include <stdio.h>

#define ALPHA "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
#define ALPHA13 "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"
// ----------------------------------------------------------------------------------------
char c_rot13( const char c, const char *alpha, const char *alpha13 )
{
register int i;

for ( i=0; alpha[i]; i++ )
if ( c == alpha[i] )
return alpha13[i];

return '\0';
}

// ----------------------------------------------------------------------------------------
char *s_rot13( char *s )
{
if ( !s )
return NULL;

char c, *cp = s;
for(; *s; s++ )
*s = (c=c_rot13(*s, ALPHA, ALPHA13)) != '\0' ? c : *s;

return cp;
}
// ----------------------------------------------------------------------------------------
int main( void )
{
char s[] = "This is a test for (dummy) ROT13 ciphering.";

printf("Original:\n%s\n\n", s);
printf("Ciphered:\n%s\n\n", s_rot13( s ) );
printf("DeCiphered:\n%s\n\n", s_rot13( s ) );

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

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

Δημοσίευσηαπό stamatiou » 27 Αύγ 2011, 16:33

Στο cipher το cp τι το θέλουμε;
Edit: Προσπάθησα να φτιάξω και την συνάρτηση αποκρυπτογράφησης και να τα ενώσω σε ένα αλλά όταν ζητά το κείμενο πάει αμέσως μετά στο κλειδί και συνεχίζει να ζητά το κλειδί μέχρι να δώσω 0, μετά δεν εκτυπώνει το κείμενο :problem:
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 27 Αύγ 2011, 17:51

Λοιπον ανοιγω τον μεταγλωττιστη και ξεκιναω και εγω :D το ιδεατο θα ειναι να δημιουργησω κατι χωρις να κοιταξω καν τον κωδικα του migf1 αλλα κατι τετοιο μαλλον θα μεινει φιλοδοξια αααχχαχαχαχαχα \m/

παμε!
Γνώσεις ⇛ 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 » 27 Αύγ 2011, 17:52

migf1 έγραψε:Στο συγκεκριμένο δεν μπορούμε.

Με τους πίνακες που είχα ποστάρει πριν φύγω για διακοπές έχει ασχοληθεί κανείς; Υπάρχει ενδιαφέρον για συνέχεια; viewtopic.php?p=202666#p202666


δεν προλαβα ρε συ :/ γιατι επρεπε να ολοκληρωσω τον οδηγο στα δικτυα για το 2ο επιπεδο .
Γνώσεις ⇛ 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 » 27 Αύγ 2011, 18:28

Λοιπον πρωτα εκατσα να ξαναθυμηθω την XOR . Και πηγα να την υλοποιησω προχειρα στον κωδικα
αλλα δεν μου βγαζει ας πουμε καλα αποτελεσματα.... μου βγαζει απο αριστερα δεκαδικη τιμη και απο δεξια δυαδικη κατι παιζει
με την μορφοποιηση μεσα στην printf :/

Spoiler: show
Κώδικας: Επιλογή όλων
#include<stdio.h>
int main()
{
int x=01001101;
int y=11010001;
int z;
int i;

// Pairnoume to z
for(i=0; i<8; i++)
{
z=x^y;
printf(" %d XOR %d dinei %d \n ",x,y,z);
}

printf("\n========================================================\n");
// Pairnoume to y me x XOR z

for(i=0; i<8; i++)
{
y=x^z;
printf(" %d XOR %d dinei %d \n ",x,z,y);
}


return 0;
}


γιατι? :S τα 0 και 1 τι μορφοποιητη θελουν πχ για να εκτυπωθουν?

Π.Σ αμα απο το XOR του x με το y έχεις βγαλει ενα z τοτε μετα αν πχ πας να κανεις XOR το x με το z παιρνεις το y κτλπ! Αυτο για οσους θελουν να ξαναθυμηθουν τα XORakia
Γνώσεις ⇛ 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 » 27 Αύγ 2011, 18:47

stamatiou έγραψε:Στο cipher το cp τι το θέλουμε;

Σε αυτό σώζω την αρχή του s, και το επιστρέφω στο τέλος ως τιμή επιστροφής της συνάρτησης (διότι στο ενδιάμεσο έχουν αλλάξει οι χαρακτήρες του s μέσα στο for-loop, και το s δείχνει στο τέλος του string, δλδ στο '\0', άρα άμα επέστρεφα το s θα ήταν σαν να επέστρεφα το '\0').

Τη συνάρτηση τη βάζω να επιστρέφει το αλλαγμένο string για να μπορώ να τη χρησιμοποιώ απευθείας κατόπιν μέσα στην printf (αλλιώς θα έπρεπε πρώτα να καλέσω μόνη της την cipher(s) για να αλλάξει το s, και μετά σε άλλη γραμμή να καλέσω την printf και να της περάσω το s... ενώ τώρα καλώ μόνο την printf και της περνάω απευθείας την cipher(s) στη θέση του s).

έγραψε:Edit: Προσπάθησα να φτιάξω και την συνάρτηση αποκρυπτογράφησης και να τα ενώσω σε ένα αλλά όταν ζητά το κείμενο πάει αμέσως μετά στο κλειδί και συνεχίζει να ζητά το κλειδί μέχρι να δώσω 0, μετά δεν εκτυπώνει το κείμενο :problem:

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

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

Δημοσίευσηαπό migf1 » 27 Αύγ 2011, 19:13

Star_Light έγραψε:Λοιπον πρωτα εκατσα να ξαναθυμηθω την XOR . Και πηγα να την υλοποιησω προχειρα στον κωδικα
αλλα δεν μου βγαζει ας πουμε καλα αποτελεσματα.... μου βγαζει απο αριστερα δεκαδικη τιμη και απο δεξια δυαδικη κατι παιζει
με την μορφοποιηση μεσα στην printf :/

Spoiler: show
Κώδικας: Επιλογή όλων
#include<stdio.h>
int main()
{
int x=01001101;
int y=11010001;
int z;
int i;

// Pairnoume to z
for(i=0; i<8; i++)
{
z=x^y;
printf(" %d XOR %d dinei %d \n ",x,y,z);
}

printf("\n========================================================\n");
// Pairnoume to y me x XOR z

for(i=0; i<8; i++)
{
y=x^z;
printf(" %d XOR %d dinei %d \n ",x,z,y);
}


return 0;
}


γιατι? :S τα 0 και 1 τι μορφοποιητη θελουν πχ για να εκτυπωθουν?

Π.Σ αμα απο το XOR του x με το y έχεις βγαλει ενα z τοτε μετα αν πχ πας να κανεις XOR το x με το z παιρνεις το y κτλπ! Αυτο για οσους θελουν να ξαναθυμηθουν τα XORakia

Άσε τα δίκτυα και πιάσε την C από την αρχή, γιατί μου φαίνεται ότι παρα-αποτοξίνώθηκες στις διακοπές :lol: :lol:

Πέρα από την πλάκα, τι κάνεις βρε συ στον κώδικα αυτόν; Δηλώνεις τα x και y ως δεκαδικούς ακέραιους και μετά προσπαθείς να τα επεξεργαστείς μέσα σε ένα loop σαν να ήταν δυαδικοί, χωρίς μάλιστα καν να ασχολείσαι στο loop με το κάθε (υποτιθέμενο) δυαδικό ψηφίο ξεχωριστά.

Στη C δεν υπάρχει τύπος δεδομένων για να δηλώνεις μεταβλητές ως δυαδικούς αριθμούς (μπορείς βέβαια να διαχειριστείς binary bits σε οποιονδήποτε αριθμό με bit shifts και bit operators, αλλά δεν χρειάζεται τίποτα από όλα αυτά εδώ πέρα).

Κάνε απλά XOR τον κάθε χαρακτήρα του s με μια οποιαδήποτε τιμή. Κατόπιν ξανά κάνε τους XOR με την ίδια τιμή και θα επανέλθουν.

Btw, ορίστε νέος κώδικας χρησιμοποιεί και τους 2 τρόπους cipher (XOR και ROT13) που πόσταρα ξεχωριστά σε προηγούμενα posts. Μόνο που τώρα το ROT13 το έκανα να δουλεύει και με ελληνικά γράμματα (μόνο τα άτονα όμως)... και μιλάω πάντα για 8-μπιτες γραμματοσειρές (όχι Unicode).

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

#include <stdio.h>

#define XOR_KEY 0x13

#define ALPHA "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψω"

#define ALPHA13 "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm\
ΝΞΟΠΡΣΤΥΦΧΨΩΑΒΓΔΕΖΗΘΙΚΛΜνξοπρστυφχψωαβγδεζηθικλμ"

//--------------------------------------------------------------------------------------
char c_rot13( const char c, const char *alpha, const char *alpha13 )
{
register int i;

for ( i=0; alpha[i]; i++ )
if ( c == alpha[i] )
return alpha13[i];

return '\0';
}
//--------------------------------------------------------------------------------------
char *s_rot13( char *s )
{
if ( !s )
return NULL;

char c, *cp = s;
for(; *s; s++ )
*s = (c=c_rot13(*s, ALPHA, ALPHA13)) != '\0' ? c : *s;

return cp;
}
//--------------------------------------------------------------------------------------
char *s_xor( char *s, const int key )
{
if ( !s )
return NULL;

char *cp = s;
while( *s )
*s++ ^= key;

return cp;
}
//--------------------------------------------------------------------------------------
void print_header( const char *title, const char *text )
{
printf("%74s\n", title);
puts("--------------------------------------------------------------------------");
puts( text );
puts("--------------------------------------------------------------------------\n");

return;
}
//--------------------------------------------------------------------------------------
int main( void )
{
char s[] = "This is a test for (dummy) ciphering. / Παράδειγμα (χαζής) κρυπτογράφησης.";

puts("D U M M Y C I P H E R\n");

print_header( "U s i n g X O R", s );
printf("C I P H E R E D:\n%s\n\n", s_xor( s, XOR_KEY ) ); // cipher & print
printf("D E C I P H E R E D:\n%s\n\n", s_xor( s, XOR_KEY ) ); // decipher & print

print_header( "U s i n g R O T 1 3", s );
printf("C I P H E R E D:\n%s\n\n", s_rot13( s ) ); // cipher & print
printf("D E C I P H E R E D:\n%s\n\n", s_rot13( s ) ); // decipher & print

return 0;
}

Τελευταία επεξεργασία από migf1 και 27 Αύγ 2011, 19:34, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

cron