migf1 έγραψε:Star_Light έγραψε:Λοιπον πρωτα εκατσα να ξαναθυμηθω την XOR . Και πηγα να την υλοποιησω προχειρα στον κωδικα
αλλα δεν μου βγαζει ας πουμε καλα αποτελεσματα.... μου βγαζει απο αριστερα δεκαδικη τιμη και απο δεξια δυαδικη κατι παιζει
με την μορφοποιηση μεσα στην printf :/Spoiler: show
γιατι? :S τα 0 και 1 τι μορφοποιητη θελουν πχ για να εκτυπωθουν?
Π.Σ αμα απο το XOR του x με το y έχεις βγαλει ενα z τοτε μετα αν πχ πας να κανεις XOR το x με το z παιρνεις το y κτλπ! Αυτο για οσους θελουν να ξαναθυμηθουν τα XORakia
Άσε τα δίκτυα και πιάσε την C από την αρχή, γιατί μου φαίνεται ότι παρα-αποτοξίνώθηκες στις διακοπές![]()
Πέρα από την πλάκα, τι κάνεις βρε συ στον κώδικα αυτόν; Δηλώνεις τα 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 )
{
unsigned char x = 0b10;
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;
}
Ε όχι και να αφήσει τα δίκτυα!



