Dalam menerapkan Shamir’s Threshold Scheme, pada contoh koding di artikel ini ada dua operasi yang disediakan. Operasi pertama adalah operasi membuat share dan operasi kedua adalah operasi merekonstruksi bilangan rahasia.
Operasi membuat share diwakili oleh method membuatShare() dan operasi rekonstruksi bilangan rahasia diwakili oleh method rekonstruksiShamir(). Kedua method ini berada dalam kelas ShamirThresholdScheme.
Dalam artikel ini, koding pembentukan polinom untuk membagi share disimpan dalam method membuatShare(). Polinom yang dibentuk ini harus dapat memenuhi f(0) = bilangan rahasia. Nilai kembalian dari method ini merupakan array dua dimensi yang berisi semua share yang akan diberikan kepada setiap partisipan. Array ini bertipe data BigDecimal. Setiap share tersebut merupakan pasangan nilai x dan y untuk polinom yang dibentuk dalam method membuatShare().
Rekonstruksi bilangan rahasia dilakukan dengan menghitung polinom pada x=0. Pada saat membuat share, polinom yang digunakan memenuhi f(0) = bilangan rahasia, oleh karena itu, pada saat merekonstruksi bilangan rahasia cukup menghitung polinom pada x=0 saja dengan kata lain, cukup menghitung f(0) saja. Untuk menghitung nilai f(0) ini dilakukan interpolasi dengan menggunakan nilai-nilai shares yang dibagikan kepada partisipan sebelumnya. Metode interpolasi yang dipakai dalam artikel ini adalah polinom Lagrange. Polinom Lagrange yang dibuat di sini telah dimodifikasi hanya untuk menghitung nilai fungsi pada x=0 saja.
Berikut adalah kelas yang menerapkan Shamir Threshold Scheme:
import java.math.BigDecimal; import java.math.RoundingMode; /* * @Author Firman Hidayat */ public class ShamirThresholdScheme { public static BigDecimal[][] membuatShare(BigDecimal bilRahasia, int jmlPartisipan, int jmlKuorum) { BigDecimal shares[][] = new BigDecimal[jmlPartisipan][2]; if (jmlKuorum < jmlPartisipan) { BigDecimal xPerPartisipan = BigDecimal.valueOf(354D); for (int a = 0; a < jmlPartisipan; a++) { xPerPartisipan = xPerPartisipan.add(BigDecimal.valueOf(a * 23)); BigDecimal konstanta = BigDecimal.valueOf(11D); BigDecimal share = bilRahasia; for (int i = 1; i < jmlKuorum; i++) { konstanta = konstanta.multiply(BigDecimal.valueOf(i)); share = share .add(konstanta.multiply(xPerPartisipan.pow(i))); } shares[a][0] = xPerPartisipan; shares[a][1] = share; } } return shares; } public static BigDecimal rekonstruksiShamir(int jmlKuorum, BigDecimal[][] shares) { BigDecimal lagrange = new BigDecimal("0"); if (shares.length >= jmlKuorum) { int tingkatKetelitian = 500; BigDecimal titikX = BigDecimal.ZERO; for (int i = 0; i < jmlKuorum; i++) { BigDecimal pi = new BigDecimal("1"); for (int j = 0; j < jmlKuorum; j++) { if (i != j) { pi = pi.multiply(titikX.subtract(shares[j][0]).divide( shares[i][0].subtract(shares[j][0]), tingkatKetelitian, RoundingMode.HALF_EVEN)); } } lagrange = lagrange.add(pi.multiply(shares[i][1])); } } return lagrange.setScale(50, RoundingMode.HALF_EVEN); } }
Sebagai contoh, di sini kita akan membagi sebuah bilangan rahasia kepada 123 partisipan. Jumlah kuorum yang diinginkan adalah 45. Setelah dibuat share, kemudian dilakukan kembali rekonstruksi bilangan rahasia ini menggunkan shares sejumlah banyaknya kuorum. Nilai hasil rekonstruksi ini kemudian dibandingkan dengan bilangan rahasia sebelumnya apakah sama atau tidak.
Jumlah partisipan = 123.
Jumlah Kuorum = 45.
Bilangan Rahasia = 243091287598123425042517851467293928424.894775647423563584.
Berikut adalah kelas yang digunakan:
import java.math.BigDecimal; import java.math.RoundingMode; /* * @Author Firman Hidayat */ public class PenggunaShamirs { public static void main(String[] args) { int jmlPartisipan = 123; int jmlKuorum = 45; BigDecimal bilRahasia = new BigDecimal( "243091287598123425042517851467293928424.894775647423563584"); BigDecimal[][] shares = new BigDecimal[jmlPartisipan][2]; // Membuat shares shares = ShamirThresholdScheme.membuatShare(bilRahasia, jmlPartisipan, jmlKuorum); // Ambil beberapa shares (jumlahnya minimal jmlkuorum) BigDecimal[][] sebagianShares = new BigDecimal[jmlKuorum + 1][2]; for (int i = 0; i < jmlKuorum; i++) { sebagianShares[i][0] = shares[i][0]; sebagianShares[i][1] = shares[i][1]; } // Rekonstruksi bilangan rahasia dari sebagian shares yang diambil BigDecimal hasilRekonstruksi = ShamirThresholdScheme .rekonstruksiShamir(jmlKuorum, sebagianShares); System.out.println("Jumlah Partisipan = " + jmlPartisipan); System.out.println("Jumlah Kuorum = " + jmlKuorum); System.out.println("Bil rahasia \t = " + bilRahasia); System.out.println("Hasil rekonstruksi\t = " + hasilRekonstruksi); if (hasilRekonstruksi.compareTo(bilRahasia) == 0) { System.out.println("Bil rahasia dan hasil rekonstruksi SAMA"); } else { System.out.println("Bil rahasia dan hasil rekonstruksi BEDA"); } } }
Output dari kelas di atas adalah sebagai berikut:
Jumlah Partisipan = 123 Jumlah Kuorum = 45 Bil rahasia = 243091287598123425042517851467293928424.894775647423563584 Hasil rekonstruksi = 243091287598123425042517851467293928424.89477564742356358400000000000000000000000000000000 Bil rahasia dan hasil rekonstruksi SAMA
Leave a comment