Proyek ini bertujuan untuk meningkatkan keamanan transmisi data pada perangkat Software-Defined Radio (SDR) berbasis USRP B210. Pendekatan yang digunakan adalah dengan mengimplementasikan enkripsi ringan berbasis Advanced Encryption Standard (AES) pada lapisan aplikasi SDR. Hal ini dilakukan untuk melindungi data yang dikirim melalui SDR dari risiko intersepsi dan manipulasi. Proyek ini memanfaatkan perangkat keras USRP B210 dan antena SDR, serta menggunakan perangkat lunak GNU Radio untuk membangun sistem yang aman. Dengan penerapan enkripsi ini, diharapkan data yang ditransmisikan melalui SDR dapat terlindungi dari penyadapan dan manipulasi yang berpotensi merugikan.
- 2x USRP B210
- Ubuntu 24.04
- Docker
- GNU Radio v3.7
Berikut adalah langkah-langkah lengkap untuk menginstal Docker pada distribusi Ubuntu:
-
Perbarui daftar paket sistem:
sudo apt-get update
-
Pasang Docker dengan perintah berikut:
sudo apt install -y docker.io
-
Aktifkan layanan Docker agar berjalan otomatis saat sistem dinyalakan:
sudo systemctl enable docker --now
-
Tambahkan pengguna Anda ke grup Docker untuk menghindari penggunaan
sudo
saat menjalankan perintah Docker:sudo usermod -aG docker $USER
Catatan: Setelah menjalankan perintah ini, Anda perlu keluar dan masuk kembali agar perubahan grup diterapkan.
-
Verifikasi instalasi Docker dengan mengecek versinya:
docker --version
-
Periksa status layanan Docker untuk memastikan bahwa Docker berjalan dengan benar:
sudo systemctl status docker
- Clone repository:
git clone https://github.com/muhammadghalib/Docker-GNURadio
- Masuk ke direktori transmitter:
cd Docker-GNURadio/gnuradio-v37-transmitter
- Build image Docker:
sudo docker build -t ubuntu:gnuradio-v37-transmitter .
- Jalankan container:
sudo docker run --net=host \ --env="DISPLAY" \ --volume="$HOME/.Xauthority:/root/.Xauthority:rw" \ --privileged \ --device=/dev/bus/usb:/dev/bus/usb \ -v /dev/bus/usb:/dev/bus/usb \ --device=/dev/snd \ -v persistent-37-transmitter:/home/gnuradio-transmitter/persistent \ --group-add=audio \ -it ubuntu:gnuradio-v37-transmitter bash
- Keluar dari container dan tutup terminal:
exit
- Masuk ke direktori receiver:
cd Docker-GNURadio/gnuradio-v37-receiver
- Build image Docker:
sudo docker build -t ubuntu:gnuradio-v37-receiver .
- Jalankan container:
sudo docker run --net=host \ --env="DISPLAY" \ --volume="$HOME/.Xauthority:/root/.Xauthority:rw" \ --privileged \ --device=/dev/bus/usb:/dev/bus/usb \ -v /dev/bus/usb:/dev/bus/usb \ --device=/dev/snd \ -v persistent-37-receiver:/home/gnuradio-receiver/persistent \ --group-add=audio \ -it ubuntu:gnuradio-v37-receiver bash
- Keluar dari container dan tutup terminal:
exit
- Unduh dan pasang Visual Studio Code dari halaman resmi VS Code atau melalui AppCenter di ubuntu.
- Buka Visual Studio Code, lalu navigasikan ke tab Extensions di panel kiri.
- Cari dan pasang ekstensi Docker. Ekstensi ini memungkinkan Anda untuk mengelola container secara langsung dari dalam Visual Studio Code.
- Cari dan pasang ekstensi Dev Containers. Ekstensi ini berguna untuk mengembangkan aplikasi di dalam container yang terisolasi dan telah dikonfigurasi sebelumnya.
- Setelah ekstensi terpasang, buka tab Docker di panel kiri.
- Periksa pada bagian Containers di panel tersebut dan pastikan terdapat dua container aktif:
-
Menjalankan Container
- Klik kanan pada container
ubuntu:gnuradio-v37-transmitter
lalu pilih Start untuk menjalankan container. - Setelah container aktif, klik kanan kembali pada container yang sama dan pilih Attach Visual Studio Code untuk terhubung dengan Visual Studio Code.
- Klik kanan pada container
-
Membuka Terminal di Visual Studio Code
- Tekan
Ctrl + Shift + P
untuk membuka Command Palette. - Ketikkan
View: Toggle Terminal
dan tekanEnter
. - Pastikan Anda berada di terminal dengan path
gnuradio-transmitter@muhammad-ghalib
.
- Tekan
-
Membuat dan Mengisi File Pesan
- Di dalam folder
persistent
, buat file baru bernamasend_message.txt
. - Tambahkan pesan yang akan dikirimkan ke USRP B210 receiver ke dalam file tersebut.
- Di dalam folder
-
Memasang Library PyCryptodome
- Di terminal, jalankan perintah berikut :
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
- Lalu jalankan get-pip.py :
python get-pip.py
- Lalu restart Container, dan cek apakah pip sudah terinstall :
Jika sudah ada versi dari pip maka instalasi pip sudah berhasil.
pip --version
- Di terminal, jalankan perintah berikut untuk memasang library PyCryptodome:
pip install pycryptodome
- Di terminal, jalankan perintah berikut :
-
Membuat File Python untuk Enkripsi
- Buat file baru bernama
aes_encryptor_ecb.py
. - Salin dan tempel kode berikut ke dalam file tersebut:
from Crypto.Cipher import AES from Crypto.Util.Padding import pad import binascii input_file = "send_message.txt" output_file = "encrypted_send_message.txt" # Secret Key (harus 16, 24, atau 32 byte) secret_key = b"1111111111111111"[:16] with open(input_file, "r") as file: plaintext = file.read() cipher = AES.new(secret_key, AES.MODE_ECB) ciphertext = cipher.encrypt(pad(plaintext.encode('utf-8'), AES.block_size)) with open(output_file, "w") as file: file.write(binascii.hexlify(ciphertext).decode('utf-8') + "\n") print("Pesan dari '{}' telah berhasil dienkripsi dan disimpan di '{}'.".format(input_file, output_file))
- File ini akan mengenkripsi pesan dalam file
send_message.txt
menggunakan algoritma AES dengan mode ECB dan kunci rahasia1111111111111111
.
- Buat file baru bernama
-
Membuat File Output Enkripsi
- Buat file baru bernama
encrypted_send_message.txt
di dalam folderpersistent
. - File ini akan digunakan untuk menyimpan hasil enkripsi dalam format HEX.
- Buat file baru bernama
-
Membuat Skrip untuk Menjalankan Transmisi
- Buat file baru bernama
run_transmitter.sh
. - Salin dan tempel kode berikut ke dalam file tersebut:
echo "Step 1 = Menjalankan aes_encryptor_ecb.py ..." python aes_encryptor_ecb.py if [ $? -ne 0 ]; then echo "Eksekusi aes_encryptor_ecb.py gagal." exit 1 fi echo -e "\nStep 2 = Menjalankan top_block.py..." python top_block.py if [ $? -ne 0 ]; then echo "Eksekusi top_block.py gagal." exit 1 fi
- Skrip ini akan:
- Menjalankan file
aes_encryptor_ecb.py
untuk enkripsi. - Menjalankan file
top_block.py
untuk memulai transmisi.
- Menjalankan file
- Buat file baru bernama
-
Memberikan Izin Eksekusi pada Skrip
- Di terminal, masuk ke direktori
persistent
:cd persistent
- Berikan izin eksekusi ke file
run_transmitter.sh
:chmod +x run_transmitter.sh
- Di terminal, masuk ke direktori
-
Membuka GNU Radio
-
Memastikan USRP B210 Terhubung
-
Menjalankan dan Menghentikan Flowgraph
- Jalankan flowgraph untuk menghasilkan file
top_block.py
. - Setelah selesai, hentikan flowgraph.
- Jalankan flowgraph untuk menghasilkan file
-
Menjalankan Skrip Transmisi
-
Menjalankan Container
- Klik kanan pada container
ubuntu:gnuradio-v37-receiver
lalu pilih Start untuk menjalankan container. - Setelah container aktif, klik kanan kembali pada container yang sama dan pilih Attach Visual Studio Code untuk terhubung dengan Visual Studio Code.
- Klik kanan pada container
-
Membuka Terminal di Visual Studio Code
- Tekan
Ctrl + Shift + P
untuk membuka Command Palette. - Ketikkan
View: Toggle Terminal
dan tekanEnter
. - Pastikan Anda berada di terminal dengan path
gnuradio-receiver@muhammad-ghalib
.
- Tekan
-
Membuat File Pesan
- Di dalam folder
persistent
, buat file baru bernamareceiver_message.txt
.
- Di dalam folder
-
Memasang Library PyCryptodome
- Di terminal, jalankan perintah berikut untuk memasang library PyCryptodome:
pip install pycryptodome
- Di terminal, jalankan perintah berikut untuk memasang library PyCryptodome:
-
Membuat File Python untuk Dekripsi
-
Buat file baru bernama
aes_decryptor_ecb.py
. -
Salin dan tempel kode berikut ke dalam file tersebut:
from Crypto.Cipher import AES import binascii import time import os def decrypt_aes_ecb(hex_string, secret_key): cipher = AES.new(secret_key, AES.MODE_ECB) encrypted_bytes = binascii.unhexlify(hex_string) decrypted_bytes = cipher.decrypt(encrypted_bytes) return decrypted_bytes.strip() def read_and_decrypt_file(file_name, secret_key): with open(file_name, 'r') as f: for index, line in enumerate(f): hex_value = line.strip() try: decrypted_value = decrypt_aes_ecb(hex_value, secret_key) print("Baris {}: {}".format(index + 1, decrypted_value)) except Exception: print("Baris {}: HEX not valid".format(index + 1)) time.sleep(0.2) if __name__ == "__main__": file_name = "receive_message.txt" # Kunci rahasia untuk dekripsi (harus sepanjang 16 byte) secret_key = "1111111111111111" read_and_decrypt_file(file_name, secret_key)
-
File ini akan mengdekripsi pesan dalam file
receive_message.txt
menggunakan algoritma AES dengan mode ECB dan kunci rahasia1111111111111111
.
-
-
Membuat Skrip untuk Menjalankan Penerima
- Buat file baru bernama
run_receiver.sh
. - Salin dan tempel kode berikut ke dalam file tersebut:
echo "Step 1 = Menjalankan top_block.py..." python top_block.py & if [ $? -ne 0 ]; then echo "Eksekusi top_block.py gagal." exit 1 fi sleep 3 echo -e "\nStep 2 = Menjalankan aes_decryptor_ecb.py..." python aes_decryptor_ecb.py if [ $? -ne 0 ]; then echo "Eksekusi aes_decryptor_ecb.py gagal." exit 1 fi
- Skrip ini akan:
- Menjalankan file
top_block.py
untuk memulai penerima. - Menjalankan file
aes_decryptor_ecb.py
untuk enkripsi.
- Menjalankan file
- Buat file baru bernama
-
Memberikan Izin Eksekusi pada Skrip
- Di terminal, masuk ke direktori
persistent
:cd persistent
- Berikan izin eksekusi ke file
run_receiver.sh
:chmod +x run_receiver.sh
- Di terminal, masuk ke direktori
-
Membuka GNU Radio
-
Memastikan USRP B210 Terhubung
-
Menjalankan dan Menghentikan Flowgraph
- Jalankan flowgraph untuk menghasilkan file
top_block.py
. - Setelah selesai, hentikan flowgraph.
- Jalankan flowgraph untuk menghasilkan file
-
Menjalankan Skrip Transmisi
- Instalasi Docker di Ubuntu: PhoenixNAP
- Instalasi Docker di Kali Linux: Kali Docs
- Instalasi GNU Radio: GNU Radio Wiki
- Instalasi UHD: GNU Radio UHD
- Repository Docker GNU Radio: Git Artes
- Onnocenter GNU Radio: Onnocenter
- Essential Docker Images: OpenVerso Docker Hub
Gambar di atas diambil di Laboratorium Teknik Telekomunikasi, Politeknik Negeri Sriwijaya.