IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Jenkings
Tvůrce
Avatar
Jenkings:1.2.2019 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.2.2019 14:06
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Odpovídá na Jenkings
Patrik Valkovič:1.2.2019 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.2.2019 15:56
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Jenkings
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
Jenkings:4.2.2019 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.2.2019 8:17
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Jenkings
Tvůrce
Avatar
Jenkings:4.2.2019 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.2.2019 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.