web-dev-qa-db-fra.com

Comment puis-je bit XOR deux tableaux de caractères C?

Je me sens stupide de ne pas pouvoir comprendre cela, mais je suis perdu. J'essaie de XOR deux chaînes C.

#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
int main()
{
    char plainone[16]; 
    char plaintwo[16];
    char xor[17];
    strcpy(plainone, "PlainOne");
    strcpy(plaintwo, "PlainTwo");
    int i=0;
    for(i=0; i<strlen(plainone);i++)
        xor[i] ^= (char)(plainone[i] ^ plaintwo[i]);
    printf("PlainText One: %s\nPlainText Two: %s\n\none^two: %s\n", plainone, plaintwo, xor);
    return 0;
}

Ma sortie est:

$ ./a.out 
PlainText One: PlainOne
PlainText Two: PlainTwo

one^two: 

Pourquoi le tableau xor ne se lit-il pas comme quoi que ce soit?

10
Matthew Darnell

Une fois que vous avez affaire à XOR, vous avez affaire à des octets binaires qui peuvent ne pas être imprimables ASCII caractères.

Et lorsque vous XOR les mêmes caractères les uns avec les autres, vous obtenez un 0. Donc 'P' ^ 'P' Sera 0. C'est un octet NUL et il termine la chaîne. Si vous essayez de imprimer avec printf() vous n'obtenez rien; printf() considère la chaîne comme une chaîne de longueur 0 terminée.

En outre, vous devez simplement affecter le résultat XOR dans votre tampon cible avec = Plutôt que d'utiliser ^= Comme votre programme l'a fait.

Voici ma version de votre programme et ma sortie:

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

#define LENGTH 16
int main()
{
    char const plainone[LENGTH] = "PlainOne";
    char const plaintwo[LENGTH] = "PlainTwo";
    char xor[LENGTH];
    int i;

    for(i=0; i<LENGTH; ++i)
        xor[i] = (char)(plainone[i] ^ plaintwo[i]);
    printf("PlainText One: %s\nPlainText Two: %s\n\none^two: ", plainone, plaintwo);
    for(i=0; i<LENGTH; ++i)
        printf("%02X ", xor[i]);
    printf("\n");
    return 0;
}

Production:

PlainText One: PlainOne
PlainText Two: PlainTwo

one^two: 00 00 00 00 00 1B 19 0A 00 00 00 00 00 00 00 00

Remarquez comment les cinq premiers octets sont tous 00 Car Plain est XOR avec Plain.

12
steveha

Eh bien "Plain" xor "Plain" == 00000, où 0 est le caractère de terminaison. Les chaînes C s'impriment jusqu'au terminateur, ce qui signifie qu'il n'imprime rien.

2
naasking