in reply to Crypt::CBC and IO:Socket
You read from the socket until a newline is found, and you assume you have a full (encrypted) message when you do. There's two problems with that:
Start by encrypting the stream rather than each message.
# Sender $cipher->start('encrypting'); print $sock $cipher->crypt($_) while <STDIN>; print $sock $cipher->finish();
# Receiver $cipher->start('decrypting'); local $/ = \4096; process_bytes($cipher->crypt($_)) while <$sock>; process_bytes($cipher->finish());
# Interactive receiver $cipher->start('decrypting'); for (;;) { my $rv = sysread($sock, my $buf='', 4096); die $! if !defined $rv last if !$rv; process_bytes($cipher->crypt($buf)); } process_bytes($cipher->finish());
I think $/=4096;<> will wait for 4096 bytes. sysread will return as soon as any bytes are available.
If you want to read a line at a time, you'll need to accumulate and find lines in the plaintext yourself.
Upgrade: Doh! Using sysread is not enough to be truly interactive. You'll need to pad your lines to a multiple of $cipher->blocksize() bytes.
Interactive or not, why not just use IO::Socket::SSL?
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Crypt::CBC and IO:Socket
by WMP (Initiate) on Jul 22, 2009 at 20:42 UTC | |
by ikegami (Patriarch) on Jul 22, 2009 at 20:58 UTC | |
by WMP (Initiate) on Jul 22, 2009 at 21:36 UTC | |
by ikegami (Patriarch) on Jul 22, 2009 at 22:45 UTC |