[Perl] Geëncrypt communiceren via socket

Pagina: 1
Acties:

  • rene_404
  • Registratie: Maart 2001
  • Laatst online: 11-03-2007
Ik ben momenteel bezig met het schrijven van een perl scripje dat geëncrypted moet kunnen communiceren tussen twee pc's. Hiervoor maak ik gebruik van een socket en de Rijndael opties in perl. Dit werkt al aardig alleen zit ik nog met een aantal probleempjes waar ik niet helemaal uit kom. Misschien dat één van jullie mij in de goede richting kan helpen.

Ik heb het zover dat ik text geëncrypted over kan zenden, dit gaat alleen gedeeltelijk goed, de eerste regel gaat helemaal goed, deze kan helemaal worden gelezen. Bij de tweede regel gaat het echter fout, deze kan maar een gedeelte gelezen worden. Zie:
code:
1
2
3
4
Socked open
Hoi dit is een testje...
®H¬¶JSê8¾¬weede testje...
Socked close

Het is de bedoeling dat de client een commando (text) naar de server stuurt waarop de server weer iets terug stuurt naar de client. Dit moet allemaal geëncrypt gebeuren voor de veiligheid. Naast het versturen van text moet hij uiteindelijk ook binare gegevens geencrypt gaan versturen.

Huidige script:

Server.pl:

Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 use IO::Select;
 use IO::Socket;
 use Crypt::Rijndael;

 # Create new Crypt::Rijndeal object
 $cipher = new Crypt::Rijndael "keyhere", Crypt::Rijndael::MODE_CBC;

 # Create new Socket object on port $port
 my $socket = new IO::Socket::INET (
                                   LocalPort => '65121',
                                   Proto => 'tcp',
                                   Listen => 1,
                                   Reuse => 1,
                                  );
 die "Could not create socket: $!\n" unless $socket;

 # Allow multiple connection with new IO::Select object
 $mulserver = new IO::Select();
 $mulserver->add($socket);

 while(1){

     #select() blocks until a socket is ready to be read
     ($server) = IO::Select->select($mulserver,undef,undef,0);

     #We now have at least one readable handle.
     foreach $sock (@$server){

         if ($sock == $socket){

             $new_sock = $sock->accept();
             #new connection, add to list, May not be readable yet.
             $mulserver->add($new_sock);
             print "Socked open\n";

         } else {

             #check to see if socket closed
             $buf = <$sock>;

             if($buf) {

                 #print length($buf) . "\n";;
                 print $cipher->decrypt($buf);

             } else {

                 #socket was closed
                 print "Socked close\n";
                 $mulserver->remove($sock);
                 close($sock);

             }
         }
     }
 }


Client.pl:

Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 use IO::Socket;
 use Crypt::Rijndael;

 $cipher = new Crypt::Rijndael "keyhere", Crypt::Rijndael::MODE_CBC;

 my $sock = new IO::Socket::INET (
                                   PeerAddr => 'localhost',
                                   PeerPort => '65121',
                                   Proto => 'tcp',
                                  );
 die "Could not create socket: $!\n" unless $sock;

 print $sock $cipher->encrypt(get16("Hoi dit is een testje...\n"));
 print $sock $cipher->encrypt(get16("Tweede testje...\n"));

 close($sock);

 #this sub makes all data blocksize of 16 bytes.
 sub get16 {
        my $data = shift;
        return "\0" x ( 16 - length($data)%16 ) . $data;
 }

huh, heb ik dat gedaan?


Verwijderd

Het enige wat ik kan vinden is dat je in 2 stappen encrypt en in 1 stap decrypt. Wat gebeurd er bijv. als je het hele te encrypte eertst in een string knalt en dan encrypt.

  • rene_404
  • Registratie: Maart 2001
  • Laatst online: 11-03-2007
Verwijderd schreef op 23 April 2003 @ 15:34:
Het enige wat ik kan vinden is dat je in 2 stappen encrypt en in 1 stap decrypt. Wat gebeurd er bijv. als je het hele te encrypte eertst in een string knalt en dan encrypt.
Zo bedoel je?
Perl:
1
2
$string = get16("Hoi dit is een testje...\nTweede testje...\n");
print $sock $cipher->encrypt(get16($string));
Nu komt het wel goed aan bij de server, maar hoe moet ik dan nu interactief tussen elkaar communiceren? Bijv.
code:
1
2
3
4
Client: Hoi ik ben ....
Server: Welkom ...
Client: RUN CMD
Server: OK
Als ik dan alles in één string moet zetten dan kan ik het op de server toch niet goed op het juiste moment uitlezen zodat ik iets kan terug zenden...

huh, heb ik dat gedaan?


Verwijderd

Dit is volgens mij in je huidige situatie het probleem.

#this sub makes all data blocksize of 16 bytes.

Als je namelijk 2 berichten door de encrypter gooit en die in blokken van 16 byte verdeelt krijg je tussen het eerste en het tweede bericht een gat van resterende bytes.

je zou voor iedere encrypte string een bepaalde unieke waarde moeten zetten waar je mee bij kunt houden in welke stap van de communicatie je zit en waar je kan herkennen hoe je string 1 en 2 uit elkaar houdt voor het decrypten.