XOR mit char



  • Hallo allerseits,

    Ich möchte einen char[a<=20] und einen char[20] mit XOR verschlüsseln!

    Als Ausgabe hätte ich gern char[a], damit der rest aus meinem schlüssel (das ist der char[20] nicht auch im Ergebnis steht.

    HILFEEEEEEEE.................



  • was verstehst du denn unter XOR? bzw. welchen Zustand können denn deine char annehmen? unterscheidest du zwischen 0 und !0? wenn es einfach nur um ein simples XOR geht, dann versuche es doch mal selbst 😉
    if( feld[i] && !schlüssel[i] || !feld[i] && schlüssel[i] )
    ergebnis[i]=?



  • freshman schrieb:

    was verstehst du denn unter XOR?

    ^



  • @Bashar: nicht du 😃



  • Ob ich dir das sage oder er spielt (in diesem Fall) keine Rolle.



  • woher weißt du, daß er von operator^ spricht? (ich check nix mehr)

    for(int i=0; i<a ;i++){
      ergebnis[i] = feld[i] ^ schlüssel[i];  
    }
    


  • Wovon denn sonst, es gibt nur den einen Xor-Operator in C, und mit dem kann man prima verschlüsseln.



  • /edit: ---



  • okay hier einmal ganz präzise meine beiden funktionen:

    // --------------------------------------------------------------
    void RegisterCode::generate_key(const char* p_user_name, char* s_code)
    {
    	char temp[20];
    	strcpy(temp, p_user_name);
    	for (int i=0; i < strlen(temp); ++i)
    	{
    		temp[i] ^= h_mask[i];
    	}
    	temp[i+1]='\0';
    	strcpy(s_code, temp);
    }
    
    // --------------------------------------------------------------
    bool RegisterCode::check_key_ok(const char* p_code_in, const char* p_user_name) 
    { 
    	char temp[20];
    	strcpy(temp, p_code_in);
    	for (int i=0; i < strlen(temp); ++i)
    	{
    		temp[i] ^= h_mask[i];
    	}
    	temp[i+1]='\0';
    	return (strcmp(temp, p_user_name) == 0);
    }
    

    Das temp[i+1]='\0'; ist jeweils damit die Zeichenbeschränkung für den char stimmt. Aber leider passiert folgendes: Ich gebe einen Wert in die generate_key für user_name und das was dann in s_code steht gebe ich auch wieder als p_code_in in den check_key_ok... dummerweise liefert mir das manchmal true und manchmal false am ende und wenn ich die werte von s_code und p_user_name und p_code_in zwischendurch ausgebe kommen manchmal total konfuse Sachen dabei heraus, z.B. dass sie verschieden lang sind oder nach dem zweiten XOR (also ^) ein anderer Wert besteht als vorher. Mathematisch liefert aber (a XOR b) XOR b = a, und etwas anderes mache ich ja gar nicht, ich gebe a XOR b aus und mache in meiner nächsten Funktion wieder das Ergebnis davon XOR b... Aber woran mag es liegen, dass dabei so merkwürdige Sachen rauskommen?

    Thx!



  • a xor b = 0 wenn a = b



  • spielt aber doch keine rolle, denn ich mache das ja mit jedem char einzeln... oder was steht in einem char = 'a' ^ 'a' genau? mit cout sehe ich natürlich nichts ... -.-



  • 'a' ^ 'a' liefer ein leerzeichen... aber dennoch ein zeichen, jawohl 🙂 und nach
    'a' ^ 'a' ^ 'a' habe ich wieder 'a'! 🙂
    das sollte meinen algorithmus also nicht durcheinander bringen, denn leerzeichen gibt mir cout auch aus. :p



  • Nein, kein Leerzeichen. Das liefert ein '\0', also eine String-Ende-Markierung.



  • achso... mhm aber wieso gibt mir cout das dann aus wie ein leerzeichen und was könnte ich effektiv dagegen in meinem algorithmus tun? ich könnte natürlich immer sagen dass ein bestimmtes zeichen zugewiesen wird, wenn a == b, aber ich benutze ja alle zeichen... aber wenn wir schonmal dabei sind: eigentlich wäre es nicht schlecht, wenn nur buchstaben und zahlen in meinem schlüssel vorkommen. vllt gibt es da irgendwelche ideen von euch? ^^


Anmelden zum Antworten