Back to IF4020 Kriptografi
Algoritma Knapsack Merkle-Hellman
Questions/Cues
- Apa itu knapsack problem dan mengapa dipakai untuk kriptografi?
- Mengapa knapsack biasa hanya bisa dienkripsi tetapi tidak didekripsi?
- Apa itu barisan superincreasing dan bagaimana menyelesaikannya dalam ?
- Bagaimana Merkle-Hellman membangun kunci publik dari kunci privat?
- Bagaimana enkripsi dan dekripsinya?
- Bagaimana Shamir memecahkannya?
Reference Points
- IF4020 Kriptografi — Algoritma Kriptografi Knapsack (Slides 2-24)
Pendahuluan
Salah satu algoritma kunci-publik awal, ditemukan Ralph Merkle dan Martin Hellman (1978); disebut juga algoritma Merkle-Hellman. Berbasis Knapsack Problem: diberi bobot knapsack dan objek berbobot , tentukan dengan
M = b_1 w_1 + b_2 w_2 + \dots + b_n w_n \tag{1}
berarti objek dimasukkan. Knapsack termasuk NP-complete: tidak diketahui penyelesaian berorde polinomial. Ide dasar: pesan dikodekan sebagai rangkaian solusi knapsack; bobot adalah kunci, bit-bit plainteks adalah .
Knapsack Biasa
, , plainteks
111001 010110 000000 011000(blok 6 bit):
Blok Kriptogram 111001 010110 000000 011000 Cipherteks:
32 30 0 11. Namun algoritma sederhana ini hanya bisa dipakai untuk enkripsi, bukan dekripsi: menemukan dari kriptogram 32 (persamaan (1)) tak dapat dipecahkan dalam waktu polinomial bila barisan bobot tidak berurutan menaik. Justru ini kekuatannya.Superincreasing Knapsack
Barisan superincreasing: tiap nilai lebih besar daripada jumlah semua nilai sebelumnya. Contoh: superincreasing; bukan (). Knapsack superincreasing dapat dipecahkan dalam (polinomial) sehingga mudah dan lemah bila dipakai langsung.
Algoritma penyelesaian (dekripsi): dari bobot terbesar ke terkecil, bila bobot sisa , masukkan dan kurangkan; jika tidak, lewati. Bila sisa akhir , solusi ada.
Contoh: , :
Bobot sisa? Sisa 52 52 70 18 27 27 > 18 18 13 13 18 5 6 6 > 5 5 3 3 5 2 2 2 2 0 Sisa 0, jadi plainteks
110101(). (Slide menulis "" pada langkah terakhir, tetapi 2 dimasukkan sehingga .)Knapsack Kunci-Publik (Merkle-Hellman)
Superincreasing dijadikan non-superincreasing (sulit, waktu eksponensial): kunci publik = barisan non-superincreasing, kunci privat = barisan superincreasing asal.
Pembangkitan kunci: (1) tentukan barisan superincreasing; (2) kalikan tiap elemen dengan modulo , dengan lebih besar dari jumlah semua elemen dan ; (3) hasilnya kunci publik, barisan asal kunci privat.
Contoh: , , :
, , , , , . Kunci publik , privat .
flowchart TD S["Barisan superincreasing<br/>{2,3,6,13,27,52}<br/>(kunci privat)"] --> MUL["x n mod m<br/>n = 31, m = 105"] MUL --> PUB["Barisan non-superincreasing<br/>{62,93,81,88,102,37}<br/>(kunci publik)"] PUB --> ENC["Enkripsi: jumlahkan elemen<br/>sesuai bit 1 plainteks"] ENC --> C["Kriptogram"] C --> DEC["x n^-1 mod m<br/>lalu selesaikan superincreasing"] S --> DECEnkripsi
Pecah plainteks menjadi blok sepanjang kardinalitas kunci publik; kalikan tiap bit dengan elemen kunci publik yang berkoresponden lalu jumlahkan. Plainteks
011000 110101 101110:
Blok Perhitungan Kriptogram 011000 174 110101 280 101110 333 Cipherteks: 174, 280, 333.
Dekripsi
Hitung dengan (). Kalikan tiap kriptogram dengan , lalu selesaikan superincreasing knapsack dengan kunci privat:
011000110101101110Plainteks kembali:
011000110101101110.Implementasi dan Kriptanalisis
Cipherteks lebih besar daripada plainteks. Untuk kekuatan, kunci sebaiknya minimal 250 elemen, tiap elemen 200-400 bit, modulus 100-200 bit; brute force butuh “1046 tahun” menurut slide (pada percobaan/detik; kemungkinan besar maksudnya tahun, pangkat hilang saat konversi).
Namun knapsack sudah tidak aman: Adi Shamir (1982) memecahkan Merkle-Hellman dasar dalam waktu polinomial dengan mentransformasi kembali knapsack biasa menjadi superincreasing (“A polynomial time algorithm for breaking the basic Merkle-Hellman cryptosystem”, FOCS 1982).
Knapsack Merkle-Hellman (1978) memakai subset-sum/knapsack problem (NP-complete): bit plainteks memilih bobot , kriptogram . Knapsack biasa sulit didekripsi; superincreasing (tiap elemen > jumlah sebelumnya) dipecahkan secara greedy dari bobot terbesar. Kunci privat = barisan superincreasing; kunci publik = tiap elemen ( jumlah elemen, ). Contoh: , , menghasilkan publik ;
011000 110101 101110174, 280, 333; dekripsi mengalikan lalu menyelesaikan superincreasing. Cipherteks lebih besar dari plainteks. Meski brute force mustahil pada parameter besar, algoritma ini dipatahkan Shamir (1982) dalam waktu polinomial. Sisi lain keluarga kunci publik: Algoritma RSA dan Algoritma ElGamal.
Additional Information
Mengapa Knapsack Runtuh
Serangan Shamir mencari bilangan (bukan yang asli) sehingga kembali superincreasing, dengan pemrograman integer berdimensi tetap (algoritma Lenstra). Serangan yang lebih umum memakai lattice reduction (LLL) (Lagarias-Odlyzko 1985) yang menyelesaikan knapsack berkerapatan rendah. Versi iteratif (Chor-Rivest) juga dipatahkan (Vaudenay 1998). Pelajarannya: kesulitan NP-complete di kasus terburuk tidak menjamin sulit di kasus rata-rata/berstruktur.
Lattice dalam Kriptografi Modern
LLL, senjata yang memecahkan knapsack, kini menjadi alat dan sekaligus fondasi: kriptografi berbasis lattice (Kyber/ML-KEM, Dilithium) memakai masalah lattice (LWE) yang dipercaya sulit bahkan bagi komputer kuantum (Ekosistem, Tantangan Masa Depan, dan Miskonsepsi).
Proyek Eksplorasi Mandiri
- Implementasikan Merkle-Hellman lengkap (kunci, enkripsi, dekripsi,
modinv) dan verifikasi174, 280, 333.- Coba serang Merkle-Hellman kecil dengan LLL (mis. pustaka
fpylll) untuk dan tunjukkan ia memulihkan plainteks tanpa kunci privat.Bacaan Lanjutan
- R. Merkle & M. Hellman, “Hiding Information and Signatures in Trapdoor Knapsacks”, IEEE TIT, 1978.
- A. Shamir, “A polynomial time algorithm for breaking the basic Merkle-Hellman cryptosystem”, FOCS 1982.
- Demo:
asecuritysite.com/encryption/knapcode.