Enkripsi sederhana berbasis arduino (Improve XOR)

Sistem keamanan komunikasi arduino

Arduino memiliki port komunikasi bawaan seperti Serial, SPI, I2C dan di beberapa jenis arduino juga memiliki JTAG, USB, CAN, selain itu arduino juga dapat ditambahkan modul komunikasi seperti Bluetooth, BLE, WiFi, Ethernet, GPRS dan lainnya.

Masing-masing memiliki protokol, namun sebagian besar transfer data-nya dengan mudah diretas, misalnya komunikasi Serial: dengan menyadap jalur rx/tx dengan baud rate yang sesuai maka data-datanya sudah bisa di baca.

Enkripsi adalah metode menyembunyikan informasi melalui proses enkripsi dan hanya dapat dibaca setelah melalui proses decode dengan kunci yang tepat.

terdapat bermacam-macam metode enkripsi mulai dari metode lama seperti substitusi, transposisi hingga metode enkripsi modern seperti MD2, MD4, MD5, SHA, RC4, Base64. Metode-metode ini memiliki kelebihan dan kekurangan masing-masing.

Penerapan metode enkripsi pada aplikasi arduino dibatasi oleh kecepatan dan kapasitas memori arduino itu sendiri terutama jika transmisi data dalam jumlah besar.

Metode XOR

XOR adalah operasi logika yang memberikan hasil yang sama jika diterapkan dua kali sehingga cocok digunakan sebagai operasi enkripsi.

void setup() {
  Serial.begin(9600);
  Serial.println(F("Enkripsi sederhana berbasis arduino"));
  Serial.println(F("https://www.project.semesin.com"));
  Serial.println();

  char textBiasa[]      = "semesin.com";
  char kunci[]          = "kunci";
  byte chiperTeks[32];
  char teksDecode[32];
  
  //encode
  int i;
  for (i = 0; i < strlen(textBiasa); i++)
  {
    chiperTeks[i] = textBiasa[i] xor kunci[i % sizeof(kunci)];
  }
  chiperTeks[i] = 0;

  Serial.print("textBiasa = ");
  Serial.println(textBiasa);
  Serial.print("kunci = ");
  Serial.println(kunci);
  Serial.print("chiperTeks = ");
  Serial.println((char*)chiperTeks);

  Serial.print("chiperTeks (hex) = ");

  //decode
  for (i = 0; i < strlen(textBiasa); i++)
  {
    Serial.print(chiperTeks[i], HEX);
    Serial.print(' ');
  }
  Serial.println();

  for (i = 0; i < strlen(chiperTeks); i++)
  {
    teksDecode[i] = chiperTeks[i] xor kunci[i % sizeof(kunci)];
  }
  teksDecode[i] = 0;

  Serial.print("teksDecode = ");
  Serial.println(teksDecode);
  Serial.println();

  //hack
  char textHacker[] = {0, 0, 0, 0, 0, 0};

  for (i = 0; i < strlen(kunci); i++)
  {
    chiperTeks[i] = textHacker[i] xor kunci[i % sizeof(kunci)];
  }
  chiperTeks[i] = 0;

  Serial.print("Bobol kunci = ");
  Serial.println((char*)chiperTeks);

}

void loop() {


}

kelemahan metode sederhana ini adalah mudah dibobol dengan memasukkan plaintext/teks biasa dengan 0x00.

 

Metode XORS

metode ini tetap menggunakan logika xor sebagai operator utama dengan tambahan operator penambahan/pengurangan, pertimbangan utama metode ini adalah kecepatan dan penggunaan memory yang minimal.

Metode ini di gambarkan dalam skema berikut:

koding encode dan decode berbasis arduino:

char key[] = "www.Semesin.com/";

byte encode(byte dataEncode, byte index)
{
  return ((dataEncode xor key[index % 8]) + key[(index % 4) + 8]) xor key[(index % 4) + 12];
}
byte decode(byte dataDecode, byte index)
{
  return ((dataDecode xor key[(index % 4) + 12]) - key[(index % 4) + 8]) xor key[index % 8];
}