Etherrape/Verschlüssellung

From Lochraster

Jump to: navigation, search

Contents

[edit] Ansätze

Blockchipher:

     DES
     AES
     IDEA
     Blowfish

Blockverschlüssellung ist zwar gut getestet aber DES ist zu langsam, IDEA ist patentiert, AES zwar sicher, aber schwierig zu implementieren. Rijndael wäre hier also das bevorzugte Ziel,

Streamcipher:

     RC2
     RC4

Stromverschlüssellungen sind flexibel einsetzbar und leicht zu implementieren. Zwar ist RC4 in WEP gebrochen, aber das ist ein Problem der Implementierung und es tritt nur bei großen Datenmengen auf.

Deshalb denke ich das RC4 erstmal der beste Trade-Off zwischen Sicherheit, Geschwindigkeit und Code-Größe ist.


[edit] AES

Folgt bald.


[edit] RC4

This code is taken from http://zer0.droids-corp.org/doxygen/html/rc4_8c-source.html.

Inspired by the ARC4 implementation by Christophe Devine.

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.


#rc4.h

typedef unsigned char  u08;
struct rc4_state
{
  u08 x, y;
  u08 m[256];
}; 
void rc4_init( u08 *key,  u08 length );
u08 rc4_crypt_char(u08 data);

#endif /* rc4.h */

#rc4.c

#include "rc4.h"
struct rc4_state s;
void rc4_init(u08 *key,  u08 length )
{
  u08 i, j, k, a;
  u08 * m;
  s.x = 0;
  s.y = 0;
  m = s.m;
  i=0;
  m[i] = i;
  for( i = 1; i !=0 ; i++ )
    {
      m[i] = i;
    }
  j = k = 0;
  i=0;
  a = m[i];
  j = (u08) ( j + a + key[k] );
  m[i] = m[j]; m[j] = a;
  if( ++k >= length ) k = 0;

  for( i = 1; i != 0 ; i++ )
    {
      a = m[i];
      j = (u08) ( j + a + key[k] );
      m[i] = m[j]; m[j] = a;
      if( ++k >= length ) k = 0;
    }
}
u08 rc4_crypt_char(u08 data)
{ 
    u08 a, b;
    s.x = (u08) ( s.x + 1 ); 
    a = s.m[s.x];
    s.y = (u08) ( s.y + a );
    s.m[s.x] = b = s.m[s.y];
    s.m[s.y] = a;
    data ^= s.m[(u08) ( a + b )];
    return data;
}
void rc4_crypt(unsigned char *data, int length )
{
  int i;
  for (i=0 ; i<length ; i++)
    data[i] = rc4_crypt_char(data[i]);
}

static unsigned char keys[30]={8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
static unsigned char data_len=8;
static unsigned char data[30]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xff};
static unsigned char output[30]={0x75,0xb7,0x87,0x80,0x99,0xe0,0xc5,0x96,0x00};

int testrc4( void )
{
    u08 i;
    u08 buffer[30];
    uart_puts_P( "\n RC4 Validation Test:" );
       memcpy( buffer, data, data_len );
       rc4_init( &keys[1], keys[0] );
       rc4_crypt( buffer, data_len );

        if( memcmp( buffer, output, data_len ) )
          {
            uart_puts_P( "failed!\n" );
            while( 1 );
          }
                uart_puts_P( "passed.\n" );
}


Dieser Code kann einfach per copy und paste verwendet werden, es MÜSSEN noch die Schlüssel geändert werden!!! Weiterhin muss man noch Daten in PC ver-und-entschlüsseln können. RC4 ist zwar in OpenSSL implementiert, jedoch gelang es mir nicht etwas damit zu entschlüsseln, was vom etherrape kam. http://www.cypherspace.org/adam/rsa/rc4.c funktioniert dagegen.

[edit] Weblinks