hilpers


  hilpers > comp.lang.* > comp.lang.perl

 #1  
11.11.2003, 17:29
mythos73
Salve a tutti.
Ho un problema che non so risolvere. Ho bisogno di codificare una sequenza
numerica in un'altra sequenza numerica. Mi spiego meglio.
Supponiamo di aver acquisito la seguente sequenza: 192 168 123 243 443 109.
Vorrei che questa sequenza venisse codificata in un'altra sequenza anch'essa
numerica.

Ho fatto quanto segue per la codifica

@data = (192,168,123,243,443,109);
push(@data,sum(@data) % 255) # calcolo il checksum
my $cipher = Crypt::CBC->new({key => "password",
iv => "01234567",
prepend_iv => 0,
cipher => "Blowfish"});

my $ciphertext = $cipher->encrypt(pack("C*",@data));
my @cipherpack = unpack("C*",$ciphertext);

Usando le funzioni pack e unpack con "C*" riesco ad ottenere una sequenza
numerica da quella di partenza. Purtroppo però se tra i numeri della
sequenza se ne trova almeno uno maggiore di 255, il calcolo del checksum in
fase di decodifica risulta errato.

In fase di decodifica ho fatto quanto segue:

my $cipherd = Crypt::CBC->new({key => "password",
iv =>"01234567",
prepend_iv => 0,
cipher =>
"Blowfish"});
my $cfrtext_rev = pack("C*",@cipherpack);
my @datad = unpack("C*",$cipherd->decrypt($cfrtext_rev));
print "Checksum ok\n" if (sum(@datad[0..@datad-2])%255)==$datad[-1];

Qualcuno ha qualche suggerimento (oppure un metodo alternativo) su come
posso risolvere questo problema e fare in modo che la sequenza acquisita
possa contenere numeri maggiori di 255?
Mi è stato suggerito di prendere i byte in parole di 2 byte (in pratica
leggerli due alla volta). Qualcuno sa come posso fare questa cosa in perl?

Grazie a tutti
 #2  
11.11.2003, 18:54
Andrea Maestrutti
mythos73 wrote:

> my $ciphertext = $cipher->encrypt(pack("C*",@data));


da perldoc -f pack leggo:

C An unsigned char value.

dunque da 0 a 254

Dunque invece che C, prova ad usare pack e unpack con il template I:

I An unsigned integer value

che dipenderà credo dall'architettura della macchina dunque in tempi
recenti almeno 32 bit.
 #3  
11.11.2003, 19:08
mythos73
Già fatto, ma per i miei scopi ogni numero della sequenza deve essere
codificato in un altro numero compreso tra 0 e al massimo 65535.
Grazie, comunque


"Andrea Maestrutti" <maestrutti> ha scritto nel messaggio
news:c6o1
mythos73 wrote:

> my $ciphertext = $cipher->encrypt(pack("C*",@data));


da perldoc -f pack leggo:

C An unsigned char value.

dunque da 0 a 254

Dunque invece che C, prova ad usare pack e unpack con il template I:

I An unsigned integer value

che dipenderà credo dall'architettura della macchina dunque in tempi
recenti almeno 32 bit.
 #4  
12.11.2003, 07:02
Max M
mythos73 wrote:

> Già fatto, ma per i miei scopi ogni numero della sequenza deve essere
> codificato in un altro numero compreso tra 0 e al massimo 65535.


Usa 'pack' con 'S' (che è _esattamente_ di 16 bit).

Max
 #5  
12.11.2003, 08:43
mythos73
Il 12 Nov 2003, 09:02, Max M <edgar> ha scritto:
> mythos73 wrote:
>
> > Già fatto, ma per i miei scopi ogni numero della sequenza deve essere
> > codificato in un altro numero compreso tra 0 e al massimo 65535.

>
> Usa 'pack' con 'S' (che è _esattamente_ di 16 bit).
>
> Max
>


L'ho usato e funziona. Ringrazio tutti
Alla prossima



--------------------------------
Inviato via http://arianna.libero.it/usenet/
Discussioni simili
Buffer (void *) a cui accede byte a byte

Nelle mie applicazioni mi ritrovo spesso a dover passare ad una funzione il puntatore ad un buffer in memoria. Come ho visto fare nelle varie funzioni di libreria (vedi...

come posso spostare un byte all'interno di un'altro byte?

mi spiego,ho 2 byte già definiti(tipo:11110000 e 10001000)e voglio che il secondo byte entri parzialmente nel primo occupandone i primi 3 bit ,quindi con un byte risultante...

Lettura byte a byte dell'HDD

Salve, Come da oggetto, avrei bisogno di leggere byte a byte ogni singolo cluster del mio HDD. Potete indicarmi se esiste una qualche libreria, un componente o quant'altro in...

[VC++.NET] prendere i singoli byte da un oggetto dword

Salve, ho un oggetto dword (nello specifico un indirizzo ip preso da un campo di testo ip). Ho visto nella guida che i 4 valori dell'indirizzo vengono salvati in 4 locazioni...


Tutti gli orari sono GMT. Attualmente sono le 10:34. | Privacy Policy