copko

Arduino sending data with XOR cipher

Mar 25th, 2018
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.28 KB | None | 0 0
  1. #include <SPI.h>
  2. #include <Ethernet.h>
  3.  
  4. //MAC adresa Arduina
  5. byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  6. char server[] = "www.spseke.sk";    // adresa webového servera (napríklad www.spseke.sk)
  7.  
  8. // IP konfigurácia pre Arduino v prípade, že sa nepodarí načítať ju cez DHCP
  9. IPAddress ip(192, 168, 0, 177);
  10. IPAddress gw(192,168 , 1, 1);
  11. IPAddress dnserver(8, 8, 8, 8);
  12. IPAddress sm(255, 255, 255, 0);
  13.  
  14. // Inicializácia webového klienta
  15. EthernetClient client;
  16.  
  17. void setup() {
  18.  
  19.   Serial.begin(9600);
  20.   // ak sa nepodarí načítať IP adresu cez DHCP
  21.  
  22.   if (Ethernet.begin(mac) == 0) {
  23.     Serial.println("Nepodarilo sa načítať adresu cez DHCP"); //výpis chybovej hlášky na serial monitor
  24.     Ethernet.begin(mac, ip, dnserver, gw, sm); //nastavenie statických parametrov do shieldu
  25.   }
  26.  
  27.  
  28.   delay(1000);
  29.   Serial.println("connecting...");
  30.  
  31.   String data="teplota=23&dvere1=otv&okno2=zat"; //data posielane cez GET request
  32.   String pswd="jablko"; // heslo pre šifrovanie
  33.  
  34.   String mPswd=""; //premenná, v ktorej bude za sebou nakopírované heslo tak, aby malo rovnakú dĺžku ako GET data
  35.  
  36.   for(int i=0;i<data.length();i++){ //cyklus, ktorý sa vykoná toľkokrát, koľko je dĺžka dát
  37.     mPswd += pswd.charAt(i%pswd.length()); //zakaždým vezmem znak z reťazca pswd a pridám ho do reťazca mPswd, pričom ak presiahnem dĺžku pswd, tak ju "pretočím" nanovo od začiatku cez modulo
  38.     }
  39.  
  40.   //debug výpisy, aby sme videli dĺžku
  41.   Serial.print("data = ");
  42.   Serial.println(data);
  43.   Serial.print("pswd = ");
  44.   Serial.println(mPswd);
  45.  
  46.  
  47.   // netlačiteľné znaky v URL sa nahrádzajú trojicou znakov %HH, kde HH je hexadecimálny kód znaku, preto každý jeden zašifrovaný znak nahradíme touto trojicou
  48.   String secret=""; //premenná, v ktorej budem udržiavať tajnú správu
  49.   for(int i=0;i<data.length();i++){ //cyklus, ktorý prejde celý reťazec data
  50.     secret += "%"; //prvý znak z trojice %HH
  51.     char c = data.charAt(i)^mPswd.charAt(i); //zašifrujem dátový reťazec XOR šifrou, pričom operácia XOR sa v C značí ako ^
  52.     if(c<16) //ak by hrozilo, že zašifrovaný znak bude len jedno hexa písmeno (teda 0-F tj. 0-15)
  53.       secret += "0"; //pridáme ešte pred tento jeden znak nulu, pretože v URL musí byť zašifrovaný takýto znak ako trojica %HH
  54.     secret += String(c,HEX); //nakoniec pridáme hexa vyjadrenie zašifrovaného znaku
  55.     }
  56.    
  57.   Serial.print("secret = ");
  58.   Serial.print(secret);
  59.   // spojenie na server
  60.   if (client.connect(server, 80)) {
  61.     Serial.println("connected");
  62.     // Make a HTTP request:
  63.     client.print("GET /uloz.php?data=");
  64.     client.print(secret); //posleme na server zašifrované dáta
  65.     client.println(" HTTP/1.1");
  66.     client.println("Host: www.spseke.sk");
  67.     client.println("Connection: close");
  68.     client.println();
  69.   } else {
  70.     // výpis chybovej hlášky v prípade neúspešného spojenia na server
  71.     Serial.println("connection failed");
  72.   }
  73. }
  74.  
  75. void loop() {
  76.   // výpis odpovede zo servera
  77.   if (client.available()) {
  78.     char c = client.read();
  79.     Serial.print(c);
  80.   }
  81.  
  82.  
  83.   if (!client.connected()) {
  84.     Serial.println();
  85.     Serial.println("disconnecting.");
  86.     client.stop();
  87.  
  88.     // "zastavenie" arduina
  89.     while (true);
  90.   }
  91. }
Advertisement
Add Comment
Please, Sign In to add comment