|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Oct 2007
Messaggi: 48
|
(Programma in C) XOR tra variabili
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 ![]() |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Oct 2007
Messaggi: 48
|
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 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Devi usare appunto l'operatore ^
Ovviamente i dati deve essere applicato a dati interi ![]() |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Oct 2007
Messaggi: 48
|
cioè,se faccio direttamente:
ivec = (encrypt_salt * 2e16) ^ (ssrc * 2e64) ^ (index_pkt * 2e16); funziona????? (le variabili sono quelle che ho scritto nei precedenti mex) |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quel 2e16 rappresenta 2*10^16 ????
In tal caso non rientra fra gli interi a 32 bit... |
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Oct 2007
Messaggi: 48
|
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)
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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 ? |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Oct 2007
Messaggi: 48
|
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? |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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 ![]() |
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Oct 2007
Messaggi: 48
|
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.... |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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 ? |
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Oct 2007
Messaggi: 48
|
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 */ |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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 ![]() |
![]() |
![]() |
![]() |
#14 |
Member
Iscritto dal: Oct 2007
Messaggi: 48
|
...come temevo...
Grazie mille cmq per l'aiuto ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:58.