PDA

View Full Version : (Programma in C) XOR tra variabili


agus83
12-11-2007, 16:50
Ciao a tutti,
ho un problema in un mio programma in C.
Devo fare un operazione XOR (bit-bit,operatore binario) con due variabili diverse:

char stringa[4]= "ciao";
int index=523;
char ris[10];

ris= stringa ^ index ....?????

come faccio?!?
Help Me! Thanks:)

agus83
13-11-2007, 11:20
Vi spiego bene la situazione:

In un programma in C devo eseguire un operazione per creare un vettore di inizializzazione

unsigned char ivec[AES_BLOCK_SIZE];
unsigned char session_encypt[AES_BLOCK_SIZE];
unsigned int ssrc_pkt, index_pkt;

ivec = (encrypt_salt * 2e16) XOR (ssrc_pkt * 2e64) XOR (index_pkt * 2e16);
Questa formula l'ho presa dal RFC che sto implementando perciò è corretta. Non so' pero come fare quelle operazioni in C. I dati e il tipo relativo sono quelli indicati

cionci
13-11-2007, 13:12
Devi usare appunto l'operatore ^
Ovviamente i dati deve essere applicato a dati interi ;)

agus83
13-11-2007, 13:50
cioè,se faccio direttamente:

ivec = (encrypt_salt * 2e16) ^ (ssrc * 2e64) ^ (index_pkt * 2e16);

funziona?????
(le variabili sono quelle che ho scritto nei precedenti mex)

cionci
13-11-2007, 14:09
Quel 2e16 rappresenta 2*10^16 ????
In tal caso non rientra fra gli interi a 32 bit...

agus83
13-11-2007, 14:31
2e16 è un tipo di espressione che in C significa 2^16,cioè a 32 bit (moltiplicare per questo numero è fare alla fin dei conti uno shift dei bit)

cionci
13-11-2007, 14:39
Che io sappia non vuole dire quello...l'unico modo per fare un 2^16 in C è 2 << 16
Cosa c'è scritto sulle RFC ? Proprio 2e16 ?

agus83
13-11-2007, 14:45
azzzz.....scusa,hai proprio ragione! avevo preso quell'espressione da un mio altro programma,ma era proprio 2*10^16 :P sorry!
cmq dovrei fare 2^16....altre alla prima domanda,come faccio a scrivere questo?

cionci
13-11-2007, 16:04
Basta sfruttare la forma binaria...un numero a 32 bit contenente il solo 1 è batto così (in esadecimale):

0x00001

Se sposti l'uno a sinistra di 16 posizioni è come se moltiplicassi l'uno per 2^16 ;)

Quindi:

1 << 16

è proprio 2^16 ;)
L'operatore << fa lo shift a sinistra.
Prima avevo scritto male, in realtà 2 << 16 è 2^17 ;)

agus83
13-11-2007, 17:41
Grazie Mille!
Putroppo pero' il codice non gira....
La formula:

ivec = (encrypt_salt * (1 << 16)) ^ (ssrc_pkt * (1 << 64)) ^ (index_pkt * (1 << 16));

con:
unsigned char index_pkt[6];
unsigned int ssrc_pkt;
unsigned char encrypt_salt[14];

I dati da utilizzare mi sono dati dal RFC perciò,in teoria, sono esatti....

cionci
13-11-2007, 17:46
Non avevo visto che dovevi usare anche 2^64.
Non può funzionare, 2^64 non si può rappresentare su numeri a 32 bit e nemmeno su numeri a 64 bit ;)
Puoi postare la parte dell'RFC che ti dice di fare quelle operazioni ?

agus83
13-11-2007, 18:55
Con quella formula trovo IV (inizialitation vector) per SRTP

/*
* where the 128-bit integer value IV SHALL be defined by the SSRC, the
* SRTP packet index i, and the SRTP session salting key k_s (112 bit default), as below.
*
* IV = (k_s * 2^16) XOR (SSRC * 2^64) XOR (i * 2^16)
* 48-bit quantity,the index of the SRTP packet i = 2^26 * ROC + SEQ
*/

cionci
13-11-2007, 19:19
Non puoi allora operare con gli interi a 32 bit e nemmeno con quelli a 64 bit.
Devi operare con una libreria che ti permette operazioni fra interi a dimensione arbitraria, anche perché lì si parla addirittura di 112 bit :eek:

agus83
13-11-2007, 19:34
...come temevo...
Grazie mille cmq per l'aiuto :)