NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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
Neaktivní uživatel: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
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
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
Odpovídá na Patrik Valkovič
Neaktivní uživatel: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
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel: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
Neaktivní uživatelský účet
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.