DEV Community

Glaezz.
Glaezz.

Posted on

Encryption in IOT

1. Penjelasan dan Contoh Perhitungan

RSA

Studi Kasus:
Misalkan kita ingin mengenkripsi dan mendekripsi pesan "HELLO" menggunakan RSA.

Langkah Perhitungan:

  1. Pilih Bilangan Prima:

    • ( p = 61 )
    • ( q = 53 )
  2. Hitung ( n ) dan ( ϕ(n) ):

    • ( n = p . q = 61 . 53 = 3233 )
    • ( ϕ(n) = (p-1)(q-1) = 60 . 52 = 3120 )
  3. Pilih ( e ):

    • ( e = 17 ) (relatif prima terhadap 3120)
  4. Hitung ( d ):

    • ( d . e % ϕ(n) = 1 )
    • ( d = 2753 ) (invers dari ( e ))
  5. Enkripsi Pesan:

    • Pesan "HELLO" -> Konversi ke angka (contoh: A=0, B=1, ..., Z=25)
    • "HELLO" = 7 4 11 11 14
    • Enkripsi setiap karakter:
      • ( c = m^e % n )
      • Untuk H (7): ( c = 7^{17} % 3233 )
  6. Dekripsi:

    • ( m = c^d % n )

Contoh Kode Python:

def mod_exp(base, exp, mod):
    return pow(base, exp, mod)

p = 61
q = 53
n = p * q
phi_n = (p - 1) * (q - 1)
e = 17
d = 2753

# Enkripsi
message = "HELLO"
ciphertext = [mod_exp(ord(char) - 65, e, n) for char in message]

# Dekripsi
decrypted = ''.join(chr(mod_exp(c, d, n) + 65) for c in ciphertext)

print(f'Ciphertext: {ciphertext}')
print(f'Decrypted: {decrypted}')
Enter fullscreen mode Exit fullscreen mode

AES

Studi Kasus:
Kita akan mengenkripsi pesan "HELLO" menggunakan AES.

Langkah Perhitungan:

  1. Kunci:

    • Kunci 128-bit: 0123456789abcdef
  2. Padded Data:

    • Pesan "HELLO" -> Padding hingga 16 byte: "HELLO\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
  3. Enkripsi:

    • Gunakan AES dalam mode CBC (Cipher Block Chaining).
  4. Dekripsi:

    • Lakukan dekripsi menggunakan kunci yang sama.

Contoh Kode Python:

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import os

key = b'0123456789abcdef'
cipher = AES.new(key, AES.MODE_CBC)
plaintext = b'HELLO'
padded_data = pad(plaintext, AES.block_size)

ct_bytes = cipher.encrypt(padded_data)

# Dekripsi
cipher_dec = AES.new(key, AES.MODE_CBC, cipher.iv)
decrypted = unpad(cipher_dec.decrypt(ct_bytes), AES.block_size)

print(f'Ciphertext: {ct_bytes.hex()}')
print(f'Decrypted: {decrypted.decode()}')
Enter fullscreen mode Exit fullscreen mode

DSA

Studi Kasus:
Kita akan menandatangani pesan "HELLO" menggunakan DSA.

Langkah Perhitungan:

  1. Kunci:

    • ( p ) dan ( q ) adalah bilangan prima yang sesuai.
    • Pilih ( x ) secara acak sebagai kunci privat.
  2. Tanda Tangan:

    • Hitung hash dari pesan.
    • Hitung ( r ) dan ( s ) berdasarkan langkah-langkah DSA.

Contoh Kode Python:

from Crypto.Signature import DSS
from Crypto.PublicKey import DSA
from Crypto.Hash import SHA256

key = DSA.generate(2048)
message = b'HELLO'
h = SHA256.new(message)

# Tanda Tangan
signature = DSS.new(key, 'fips-186-3').sign(h)

# Verifikasi
verifier = DSS.new(key.publickey(), 'fips-186-3')
verifier.verify(h, signature)

print(f'Signature: {signature.hex()}')
Enter fullscreen mode Exit fullscreen mode

2. Studi Kasus Penggunaan di Arduino

RSA di Arduino

Studi Kasus:
Menggunakan RSA untuk mengamankan komunikasi antara Arduino dan PC.

Contoh Kode:

#include <Arduino.h>
#include <RSAPublicKey.h>

void setup() {
    Serial.begin(9600);

    // Inisialisasi kunci publik
    const char *publicKey = "YOUR_PUBLIC_KEY_HERE";
    RSAPublicKey rsaPublicKey(publicKey);

    // Enkripsi pesan
    const char *message = "HELLO";
    byte ciphertext[256];
    int cipherLen = rsaPublicKey.encrypt((byte *)message, strlen(message), ciphertext);

    Serial.print("Ciphertext: ");
    for (int i = 0; i < cipherLen; i++) {
        Serial.print(ciphertext[i], HEX);
        Serial.print(" ");
    }
}

void loop() {}
Enter fullscreen mode Exit fullscreen mode

AES di Arduino

Studi Kasus:
Menggunakan AES untuk mengenkripsi data sensor.

Contoh Kode:

#include <AES.h>
#include <Crypto.h>

AES aes;

void setup() {
    Serial.begin(9600);
    byte key[16] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10};
    byte plaintext[16] = "HELLO WORLD!!!";
    byte ciphertext[16];

    aes.do_aes_encrypt(plaintext, 16, ciphertext, key, 128);

    Serial.print("Ciphertext: ");
    for (int i = 0; i < 16; i++) {
        Serial.print(ciphertext[i], HEX);
        Serial.print(" ");
    }
}

void loop() {}
Enter fullscreen mode Exit fullscreen mode

DSA di Arduino

Studi Kasus:
Menggunakan DSA untuk menandatangani data yang diterima dari sensor.

Contoh Kode:

#include <DSA.h>

void setup() {
    Serial.begin(9600);
    DSA dsa;

    // Gen kunci DSA
    dsa.generateKeys();

    // Tanda tangan pesan
    const char *message = "HELLO";
    byte signature[40];
    dsa.sign(message, signature);

    Serial.print("Signature: ");
    for (int i = 0; i < 40; i++) {
        Serial.print(signature[i], HEX);
        Serial.print(" ");
    }
}

void loop() {}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)