2013-02-20 21 views
6

Recentemente ho iniziato a giocare con C# e sto cercando di capire perché il seguente codice non viene compilato. In linea con il commento di errore, ottengo:Stringhe XOR in C#

Impossibile convertire in modo implicito il tipo 'int' in 'carattere'. Esce una conversione esplicita (ti manca un cast?)

Sto provando a eseguire un'operazione XOR semplice con due stringhe.

public string calcXor (string a, string b) 
{ 
    char[] charAArray = a.ToCharArray(); 
    char[] charBArray = b.ToCharArray(); 
    char[] result = new char[6]; 
    int len = 0; 

    // Set length to be the length of the shorter string 
    if (a.Length > b.Length) 
     len = b.Length - 1; 
    else 
     len = a.Length - 1; 

    for (int i = 0; i < len; i++) { 
     result[i] = charAArray[i]^charBArray[i]; // Error here 
    } 

    return new string (result); 
} 
+2

Se la tua stringa è ASCII, prova questo 'result [i] = (char) ((short) charAArray [i]^(short) charBArray [i]);' – ebattulga

+3

Gli operatori bitwise prendono solo numeri come operandi. La tua stringa è una serie di cifre numeriche? O stai provando a fare questa operazione sulla base dei valori ASCII? – JohnFx

+1

Grazie, ho dimenticato che xor è un operatore bit a bit quindi impiega 1 e 0 ed è per questo motivo che si lamenta della conversione int. –

risposta

4

Si sta facendo uno xor su 2 caratteri. Ciò comporterà una conversione di tipo implicita a int per te poiché non ci sono perdite di dati. Tuttavia, la conversione da int a char ti richiederà di fornire un cast esplicito.

è necessario convertire in modo esplicito il vostro int ad un char per result[i]:

result[i] = (char) (charAArray[i]^charBArray[i]); 
+0

capito, grazie! –

13

Se si utilizza XOR-zione per nascondere i dati, dare un'occhiata al codice qui sotto. La chiave verrà ripetuta per il tempo necessario. E 'forse una più breve/approccio migliore:

public static string xorIt(string key, string input) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for(int i=0; i < input.Length; i++) 
     sb.Append((char)(input[i]^key[(i % key.Length)])); 
    String result = sb.ToString(); 

    return result; 
} 
+0

+1 per il codice. Ma l'uso di qualsiasi Stream Cipher senza un PRG appropriato (Pseudo Random Generator) infrange il principio della sicurezza semantica. E mi dispiace dirlo, ma nel tuo codice il PRG utilizzato è estremamente lontano dall'aspetto casuale ed è completamente prevedibile. In realtà questo potrebbe essere rotto con un attacco di testo cifrato solo in un intervallo molto breve. Quindi, in breve, NON UTILIZZARE MAI questo tipo di crittografia a meno che non lo si utilizzi insieme a un PRP protetto (Pseudo Random Permutation) o qualsiasi altro tipo di cifrario sicuro affidabile. –

+0

Sono pienamente d'accordo. Se vuoi una soluzione sicura usa gli strumenti e le strutture disponibili. Faranno il lavoro nel modo giusto per te con il PRG menzionato e tutte le altre belle campane e fischietti. –

+2

IMHO, il punto delle stringhe XOR-in non è una sicurezza forte, ma piuttosto un passaggio in "offuscamento" - rendendo più lavoro per qualcuno che esegue il reverse-engineering del codice per capire che lavoro sta facendo la tua app. Nello specifico, non possono semplicemente cercare le tue stringhe. Devono tracciare la logica, trovare il metodo XOR e alimentare tutte le stringhe attraverso quel metodo, con chiavi appropriate. – ToolmakerSteve

0

Se il valore del risultato è importante allora Allan è corretta (risposta accettata). Se stai cercando una corrispondenza e non sei preoccupato per le prestazioni, usa strcmp() o memcmp() come alternativa.

Nell'assembler è comune inizializzare le cose da un XOR contro se stessi poiché i cicli T sono meno. Se fossi un forzante brutale (confronto di hash), allora questo sarebbe un miglioramento rispetto a strcmp o memcmp poiché in realtà non faccio l'ordinamento, ma solo match/nomatch.

I lettori devono anche essere a conoscenza di this che possono essere modificati.

+0

IMHO, questa risposta non è pertinente a questa domanda, che non dice nulla sulla ricerca di una corrispondenza. – ToolmakerSteve

+0

Lo pagherò. Ho letto troppo nel codice. Normalmente, quando eseguo le stringhe di xor, mi piacerebbe riempire la stringa più corta con la prima x'00 '. Progredire invece dal LHS mi ha portato a credere che si stia cercando una corrispondenza o che si stia verificando una trasformazione per oscurare i dati. – mckenzm