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):

BlokKriptogram
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
5252 7018
2727 > 1818
1313 185
66 > 55
33 52
22 20

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 --> DEC

Enkripsi

Pecah plainteks menjadi blok sepanjang kardinalitas kunci publik; kalikan tiap bit dengan elemen kunci publik yang berkoresponden lalu jumlahkan. Plainteks 011000 110101 101110:

BlokPerhitunganKriptogram
011000174
110101280
101110333

Cipherteks: 174, 280, 333.

Dekripsi

Hitung dengan (). Kalikan tiap kriptogram dengan , lalu selesaikan superincreasing knapsack dengan kunci privat:

  • 011000
  • 110101
  • 101110

Plainteks 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).

Summary

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 101110 174, 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.