Codifica XOR in C

di il
10 risposte

Codifica XOR in C

Salve a tutti, mentre svolgevo una traccia di esame, la quale diceva di creare un programma che prendesse in input una frase e una chiave e restituisse la frase codificata con la somma dei caratteri i-esimi della frase con quelli i-esimi della chiave,
esattamente: frase_cifrata = testo + chiave[i%strlen(chiave)];
mi è venuto in mente di aggiungere un ulteriore passaggio per incasinare un pò la stringa cifrata con uno xor logico.

Riscontro però un problema, intrinseco all'operatore xor: con lo stesso algoritmo di prima, quando vengono elaborati un carattere del testo uguale ad uno della chiave, lo xor restituisce uno '0' che il programma (che posto sotto) interpreta come un carattere di terminazione di stringa "\0" e termina. Cioè se nella chiave sono inseriti caratteri presenti nel testo da cifrare non funziona, cosa inaccettabile per qualsiasi scopo .

Stavo pensando a vari tipi di soluzioni, inizialmente di "imbottire" la chiave, sommando ad essa un carattere non printabile, ma non risolve nulla perchè se il valore del carattere ottenuto supera 255, il programma gli assegna il valore (X-255) se X > 255, dove X è il valore del carattere ascii della chiave sommato ad un carattere di imbottitura qualsiasi.

Sto pensando ad un'altra soluzione, cioè un controllo su ogni carattere prima dell'elaborazione degli stessi in modo tale che se ci sono coincidenze tra un carattere della chiave ed uno del testo, quello della chiave viene incrementato di 1 (oppure con il valore della lunghezza della chiave che è noto sia nella fase di cifratura che in quella di decifratura.. per fare una cosa un pò più crittografica ) però è molto più elaborata come cosa perchè genera un altro tipo di problema;

se ho il testo cifrato con questo procedimento come faccio a fargli capire quando un carattere è stato incrementato per evitare coincidenze?
Come potrei risolvere?

Il codice su cui sto lavorando momentaneamente è questo:

#include <stdio.h>
#include <string.h>
#define MAX 1000


int main(){

	int i;
	char input1[MAX];
	char input2[MAX];
	char output1[MAX];
	char output2[MAX];

	printf("\nInserisci la frase: ");
	fgets(input1, sizeof(input1), stdin);
	input1[strlen(input1) - 1] = '\0';
	printf("\nLa frase inserita e': %s\n", input1);

	printf("\nInserisci la chiave: ");
	fgets(input2, sizeof(input2), stdin);
	input2[strlen(input2) - 1] = '\0';
	printf("\nLa chiave inserita e': %s", input2);

	for(i=0; i<strlen(input1); i++){
		output1[i] = input1[i] ^ input2[i%strlen(input2)];
	}
		output1[i] = '\0';

	printf("\n\nLa stringa cifrata e': '%s'\n", output1);

	for(i=0; i<strlen(output1); i++){
		output2[i] = output1[i] ^ input2[i%strlen(input2)];
	}
        output2[i] = '\0';

	printf("\n\nLa stringa decifrata e': '%s'\n\n", output2);

	system("PAUSE");

return 0;
}
Vi ringrazio anticipatamente per la pazienza.

10 Risposte

  • Re: Codifica XOR in C

    Ciao...analizziamo il programma, ad occhio e croce, dovresti evitare di usare le funzion string, per la cifratura.
    Da quello che scrivi ho capito che se inserisco una lettera ad esempio A, lui me la cifra in un altro simbolo ad esempio 'Z'....
    SApendo che una frase è composta da diverse lettere, si da per scontato che una di queste lettere potrebbe esser convertita in uno zero (0).
    FIno qui tutto ok, però a questo punto il tuo risultato, non è esatto perchè la funzioe string come hai detto, leggendo il carattere di terminazione nullo, magari stampa la stringa a metà, quindi, la funzione string che usi, non va bene, dovresti creare la parte da cifrare manualmente.
    La lettura della stringa la fai con la funzione contenuta in string.h, mentra la cifratura, e quindi l'output che verrà fuori (la frase cifrata), dovrai costruirla evitando le librerie, cosi che, quando incontrerà uno zero(0) non lo considererà come un carattere di teminazione nullo.
    Spero di averti aiutato
  • Re: Codifica XOR in C

    Grazie per la risposta innanzitutto.
    La libreria string.h mi serve solo per la funzione strlen, quindi tu mi consigli di creare una funzione mia esterna al main che returni quanti caratteri contenga una stringa passata come argomento senza usare la funzione standard strlen perchè sennò genera questo inconveniente per il codice della libreria, giusto?
    E questo è fattibilissimo, in effetti la libreria string.h potrei non implementarla proprio ed usarne una mia, grazie mille per il consiglio, non ci avevo pensato minimamente.
    Adesso mi chiedo se l'output sarà effettivamente corretto, cioè se interpreterà correttamente anche in fase di decifratura gli '0'.
    Ora provo a codificare questa funzione e poi ti faccio sapere .
  • Re: Codifica XOR in C

    Funziona finalmente, ora posso implementarlo nell'altro programma per incrementare un pò la sicurezza
    
    #include <stdio.h>
    #define MAX 1000
    
    
    int lunghezza(char stringa[]){
    
    	int i = 0;
    
    	while(stringa[i]!=EOF){
    	i++;
    	}
    
    return i;
    }
    
    
    
        int main(){
    
           int i;
           char input1[MAX];
           char input2[MAX];
           char output1[MAX];
           char output2[MAX];
    
           printf("\nInserisci la frase: ");
           fgets(input1, sizeof(input1), stdin);
           input1[lunghezza(input1) - 1] = '\0';
           printf("\nLa frase inserita e': %s\n", input1);
    
           printf("\nInserisci la chiave: ");
           fgets(input2, sizeof(input2), stdin);
           input2[lunghezza(input2) - 1] = '\0';
           printf("\nLa chiave inserita e': %s", input2);
    
           for(i=0; i<lunghezza(input1); i++){
              output1[i] = input1[i] ^ input2[i%lunghezza(input2)];
           }
              output1[i] = '\0';
    
           printf("\n\nLa stringa cifrata e': '%s'\n", output1);
    
           for(i=0; i<lunghezza(output1); i++){
              output2[i] = output1[i] ^ input2[i%lunghezza(input2)];
           }
                output2[i] = '\0';
    
           printf("\n\nLa stringa decifrata e': '%s'\n\n", output2);
    
           system("PAUSE");
    
        return 0;
        }
    
  • Re: Codifica XOR in C

    Certo che usare il dev-c nel 2015 fa scappare dal ridere....
  • Re: Codifica XOR in C

    vbextreme ha scritto:


    certo che usare il dev-c nel 2015 fa scappare dal ridere....
    Cos'è che ti fa male?
  • Re: Codifica XOR in C

    Male? ho detto che rido!
    Ci sono migliaia di IDE anche professionali COMPLETAMENTE GRATUITI!
    e tu usi il dev? non più aggiornato e pieno zeppo di bug!
    Lo sai vero che quando passerai ad un'altro IDE con annesso nuovo compilatore capirai che fino adesso non hai studiato il c/c++ ma il c/c++ for dev?
    Poi vedi te se dar retta ai consigli o fare l'asino (senza offesa , riferito al fatto che gli asini,animali, spesso non ascoltano il padrone e proseguono per la loro strada.)
  • Re: Codifica XOR in C

    vbextreme ha scritto:


    male? ho detto che rido!
    Ci sono migliaia di IDE anche professionali COMPLETAMENTE GRATUITI!
    e tu usi il dev? non più aggiornato e pieno zeppo di bug!
    Lo sai vero che quando passerai ad un'altro IDE con annesso nuovo compilatore capirai che fino adesso non hai studiato il c/c++ ma il c/c++ for dev?
    Poi vedi te se dar retta ai consigli o fare l'asino (senza offesa , riferito al fatto che gli asini,animali, spesso non ascoltano il padrone e proseguono per la loro strada.)
    Primo: sei completamente OT, quindi segnalato soprattutto per l'ultimo messaggio, ma la segnalazione è motivata dagli altri punti;

    Secondo: in base a cosa riesci a dire che uso quello che dici? Se fino a quando non te ne sei uscito cosi non sapevo cosa fosse? Sono curioso di sapere in base a cosa, quindi vedi di rispondere.

    Terzo: questo forum dovrebbe chiamarsi iprogrammatori(scarsi).it; ho pubblicato questo post giorni fa senza che nessuno rispondesse, solo uno ci ha buttato un occhio e un consiglio vero dopo che ho replicato in questo e in altri thread per non farlo scomparire nell'anonimato del forum. Poi te. Quindi adesso spiegami, evita lo sputtanamento, poi magari passiamo anche a parlare di cazzate come gli editor di testo usati, stronzate ai confini dell'informatica.
  • Re: Codifica XOR in C

    Il mio post voleva essere una provocazione per vedere di convincerti a non usare tale ambiente obsoleto, deprecato, pieno di bug.
    Voleva essere un consiglio non un motivo di litigio.
    Ho dedotto che usi il dev da vari fattori, questo non significa che io non possa sbagliare, anzi, se vai a leggere i miei post vedrai che spesso mi sbaglio su tantissime cose!
    Però tu non hai risposto dicendo magari "grazie del consiglio ma uso xxx" affermando dunque l'utilizzo di tale IDE.

    @shebang ha scritto:


    questo forum dovrebbe chiamarsi iprogrammatori(scarsi).it
    Su questo forum ci sono persone esperte, molto esperte di cui nutro estremo rispetto e persone meno esperte o novizi a cui nutro lo stesso identico rispetto.
    Se una tua domanda ha raccolto poco entusiasmo forse perché è stata esposta male, forse perché poco interessante ,forse perché usi il dev o forse perché nessuno di noi aveva tempo di rispondenti, dopotutto non siamo retribuiti da nessuno ne su questo forum ne sull'altro di Ubuntu dove ogni tanto appari.
    Quindi pondera le parole e rispetta chi cerca di aiutarti, anche se potrebbe sbagliare pure lui!
  • Re: Codifica XOR in C

    vbextreme ha scritto:


    Il mio post voleva essere una provocazione per vedere di convincerti a non usare tale ambiente obsoleto, deprecato, pieno di bug.
    Voleva essere un consiglio non un motivo di litigio.
    Ho dedotto che usi il dev da vari fattori, questo non significa che io non possa sbagliare, anzi, se vai a leggere i miei post vedrai che spesso mi sbaglio su tantissime cose!
    Però tu non hai risposto dicendo magari "grazie del consiglio ma uso xxx" affermando dunque l'utilizzo di tale IDE.

    @shebang ha scritto:


    questo forum dovrebbe chiamarsi iprogrammatori(scarsi).it
    Su questo forum ci sono persone esperte, molto esperte di cui nutro estremo rispetto e persone meno esperte o novizi a cui nutro lo stesso identico rispetto.
    Se una tua domanda ha raccolto poco entusiasmo forse perché è stata esposta male, forse perché poco interessante ,forse perché usi il dev o forse perché nessuno di noi aveva tempo di rispondenti, dopotutto non siamo retribuiti da nessuno ne su questo forum ne sull'altro di Ubuntu dove ogni tanto appari.
    Quindi pondera le parole e rispetta chi cerca di aiutarti, anche se potrebbe sbagliare pure lui!

    Ma ponderale te le parole, maleducato che non sei altro, dare dell'asino senza nessuna base per argomentare ti pare educazione?
    Mi ricordo di te, che mi continuavi a chiedere di collaborare all'easy framework e ti ho dato anche quella funzioncina sul pi greco che non sapevi neanche farla..
    
    Veramente io non ho la piu pallida idea di cosa faccia quel programma ed è per quello che ti ho chiesto se volevi trasformarlo in una funzione da aggiungere all'easyframework.
    
    te scrivesti sta cosa quando ti dissi che potevi anche usarla; visto che ci conosciamo perchè dici di dare consigli con provocazioni e poi ti stupisci pure che la gente ti risponde sfociando nel litigio, ma che problemi hai?
    Che poi ancora non mi hai risposto in base a quali fattori capisci o non capisci quello che ti pare, ti diverti a fare lo psicologo in base a quanti TAB uno lascia in un sorgente per farlo capire?
    O spari minchiate perchè notepad, codeblocks avvolte li lasciano su winzozz?
    Quindi se dovessi scrivere:
    
    int main(){
    	
    	while(questo_è_scemo){
    		printf("\nMA SEI IDIOTA O COSA!?\n");
    	}
    }
    
    Te ne verresti fuori:
    WOW ha lasciato dei TAB, e neanche il return!, sicuro usa software di merda e adesso ci faccio l'esperto de sto cazzo, e non magari "cazzo ma mi sta prendendo per il culo..".
    Per tua norma e regola io uso gedit su linux e GCC come compilatore anche su win,
    almeno sei soddisfatto (un pò sputtanato, ma soddisfatto).

    Il rispetto è per la gente seria, non per presuntuosi e perditempo come te.
    Limpidezza, interesse non sono cose che ti riguardano a quanto pare, soprattutto non ti riguarda dove e quando appaio nei forum, che non sono nè tuoi nè degli esperti, ma di tutti per collaborare e darsi una mano come abbiamo fatto con il primo utente.
    scarsi.it non è sicuramente per tutti gli utenti, ma per quelli come te sicuro e tutti quelli che si sono dimostrati tali fino ad ora, inclusi gente che reputavo esperta io, e quelli che si divertono ad andare OT.

    Nella tua visione dovevo anche risponderti: "grazie del consiglio ma uso xxx"...
    Ma un bel calcio in culo, altro che!
  • Re: Codifica XOR in C

    Siccome state andando OT e oltre chiudo il thread e potete continuare in privato.
Devi accedere o registrarti per scrivere nel forum
10 risposte