ITnetwork Flashka zdarma C a C++ týden
Pouze tento týden sleva až 80 % na kurzy C a C++
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Diskuze: Implementace RC4

Aktivity (1)
Avatar
Jenkings
Redaktor
Avatar
Jenkings:1. února 14:06

Ahoj, snažím se implementovat šifrování RC4, tak aby bylo možné komunikovat mezi Arduinem a PHP serverem. Bohužel se mi ale nedaří dosáhnout toho, aby lezla při stejném klíčí a textu stejná šifra z PHP a Arduina.

Arduino:

#include <string.h>
#include <base64.h>

unsigned char S[256];
char has[512];

#define S_SWAP(a,b) do { int t = S[a]; S[a] = S[b]; S[b] = t; } while(0)

void rc4(char *key, char *data){
     int i,j;
     Serial.print("Source : ");
     Serial.println(data);
     Serial.print("Key : ");
     Serial.println(key);

     for (i=0;i<256;i++){
         S[i] = i;
     }

     j = 0;
     for (i=0;i<256;i++){
         j = (j+S[i]+key[i%strlen(key)]) %256;
         S_SWAP(S[i],S[j]);
     }

     i = j = 0;
     for (int k=0;k<strlen(data);k++){
         i = (i+1) %256;
         j = (j+S[i]) %256;
         S_SWAP(S[i],S[j]);
         has[k] = data[k]^S[(S[i]+S[j]) %256];
     }
     has[strlen(data)+1] = '\0';
}

void setup() {
  Serial.begin(9600);
  delay(1500);
  char key[] = "abc";
  char sdata[] = "abc";

  rc4(key,sdata);
  Serial.print("Encrypted : ");
  Serial.println(base64::encode(has));

  rc4(key,has);
  Serial.print("Decrypted : ");
  Serial.println(has);
}

void loop(){
}

PHP:

function rc4($key, $str) {
        $s = array();
        for ($i = 0; $i < 256; $i++) {
                $s[$i] = $i;
        }
        $j = 0;
        for ($i = 0; $i < 256; $i++) {
                $j = ($j + $s[$i] + ord($key[$i % strlen($key)])) % 256;
                $x = $s[$i];
                $s[$i] = $s[$j];
                $s[$j] = $x;
        }
        $i = 0;
        $j = 0;
        $res = '';
        for ($y = 0; $y < strlen($str); $y++) {
                $i = ($i + 1) % 256;
                $j = ($j + $s[$i]) % 256;
                $x = $s[$i];
                $s[$i] = $s[$j];
                $s[$j] = $x;
                $res .= $str[$y] ^ chr($s[($s[$i] + $s[$j]) % 256]);
        }
        return $res;
}

$sifra = rc4("abc","abc");
echo "Šifra:                   " . $sifra . "<br>";
echo "Šifra BASE64:         " . base64_encode($sifra) . "<br>";
echo "Šifra jako int:         " . implode(",",unpack('C*', $sifra)) . "<br>";
echo "Dešifrováno:          " . rc4("abc",$sifra) . "<br>";

Zkusil jsem: Algoritmus jsem několikrát přepsal a mám pocit že oba kódy jsou v podstatě stejné.
Kontroloval jsem, zda na obou stranách probíhá stejně přepočet znaku na číslo a hodnoty se shodovaly. Stejně tak Base64 funguje identicky.

Chci docílit: Stejného výstupu při stejných vstupních hodnotách na obou zařízeních

Odpovědět 1. února 14:06
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Jenkings
patrik.valkovic:1. února 15:56

První pravidlo při šifrování - neimplementuj vlastní šifrovací algoritmy.
Pro PHP můžeš použít knihovnu - https://github.com/…ib/phpseclib.
Pro Arduino by mohlo fungovat tohle: https://gist.github.com/…67ab9ec32089 nebo tohle: https://github.com/…master/rc4.c.

Nahoru Odpovědět  +1 1. února 15:56
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Jenkings
Redaktor
Avatar
Odpovídá na patrik.valkovic
Jenkings:4. února 8:17

Bohužel ale i při použití těch knihoven co píšeš, mi to vyhazuje různé výsledky.
Php knihovnu jsem použil tu co píšeš a natáhl ji přes composer, a pro arduino jsem použil verzi od rverton (https://gist.github.com/…67ab9ec32089)

Nahoru Odpovědět 4. února 8:17
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Jenkings
Redaktor
Avatar
Jenkings:4. února 9:15

Tak ve finále se to podařilo, našel jsem ještě jinou knihovnu pro Arduino a ta nakonec hází stejné výsledky jako PHP

Nahoru Odpovědět 4. února 9:15
Největší časovou náročnost má výpočet časové náročnosti..
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.