<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kriptografi on kenji.blog</title><link>http://kenji.blog/id/categories/kriptografi/</link><description>Recent content in Kriptografi on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>id</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 13:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/id/categories/kriptografi/index.xml" rel="self" type="application/rss+xml"/><item><title>【Penjelasan Matematika】Menjelaskan Cara Kerja Enkripsi RSA Agar Dapat Dipahami Bahkan oleh Siswa SMA</title><link>http://kenji.blog/id/p/rsa-encryption-math-explained-for-beginners/</link><pubDate>Fri, 11 Sep 2026 13:00:00 +0900</pubDate><guid>http://kenji.blog/id/p/rsa-encryption-math-explained-for-beginners/</guid><description>&lt;img src="http://kenji.blog/p/rsa-encryption-math-explained-for-beginners/img/eyecatch.jpg" alt="Featured image of post 【Penjelasan Matematika】Menjelaskan Cara Kerja Enkripsi RSA Agar Dapat Dipahami Bahkan oleh Siswa SMA" />&lt;p>Salah satu teknologi yang mendasari keamanan masyarakat internet adalah &amp;ldquo;Enkripsi RSA&amp;rdquo;. Sebagian besar komunikasi yang kita gunakan tanpa disadari setiap hari, seperti pembayaran kartu kredit dalam belanja online, interaksi di media sosial dengan teman, dan transmisi serta penerimaan informasi rahasia perusahaan, dilindungi oleh enkripsi RSA ini atau teknologi penerusnya.&lt;/p>
&lt;p>Namun, ketika mendengar kata &amp;ldquo;kriptografi&amp;rdquo;, Anda mungkin membayangkan mesin sandi yang rumit seperti yang ada di film mata-mata, atau matematika tingkat sangat tinggi yang hanya dapat dipahami oleh sebagian kecil orang jenius. Memang benar bahwa teori kriptografi modern didasarkan pada matematika tingkat tinggi, tetapi &lt;strong>mekanisme dasar dari enkripsi RSA dapat dipahami dengan baik jika Anda memiliki pengetahuan matematika yang dipelajari di sekolah menengah atas (sifat bilangan bulat, bilangan prima, aritmetika modular (kongruensi), dll.)&lt;/strong>.&lt;/p>
&lt;p>Dalam artikel ini, dengan pengetahuan matematika sekolah menengah atas sebagai titik awal, kami akan menjelaskan secara menyeluruh selangkah demi selangkah prinsip matematika apa yang membuat enkripsi RSA bekerja dan mengapa sulit untuk dipecahkan. Kami akan menjelaskannya dengan hati-hati disertai contoh-contoh konkret sehingga bahkan mereka yang kurang ahli dalam matematika dapat memahaminya.&lt;/p>
&lt;hr>
&lt;h2 id="1-kriptografi-kunci-simetris-dan-kriptografi-kunci-publik">1. Kriptografi Kunci Simetris dan Kriptografi Kunci Publik
&lt;/h2>&lt;p>Sebelum masuk ke mekanisme matematis dari enkripsi RSA, mari kita perjelas konsep dasar dari kriptografi terlebih dahulu. Sistem kriptografi secara garis besar dibagi menjadi dua jenis: &amp;ldquo;kriptografi kunci simetris&amp;rdquo; dan &amp;ldquo;kriptografi kunci publik&amp;rdquo;.&lt;/p>
&lt;h3 id="11-keterbatasan-sistem-kriptografi-kunci-simetris">1.1 Keterbatasan Sistem Kriptografi Kunci Simetris
&lt;/h3>&lt;p>Banyak kriptografi yang telah digunakan sejak zaman dahulu disebut &amp;ldquo;sistem kriptografi kunci simetris&amp;rdquo;. Ini adalah sistem yang &lt;strong>menggunakan kunci yang sama untuk &amp;ldquo;enkripsi (mengubah pesan menjadi teks sandi rahasia)&amp;rdquo; dan &amp;ldquo;dekripsi (mengembalikan teks sandi ke pesan aslinya)&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>Sebagai contoh, misalkan Alice mengirim surat rahasia kepada Bob. Alice memasukkan surat itu ke dalam kotak dan menguncinya menggunakan gembok (kunci simetris). Agar Bob bisa membuka kotak tersebut, ia harus memiliki kunci yang sama dengan yang digunakan Alice.&lt;/p>
&lt;p>Ada masalah besar dengan sistem ini. Yakni &amp;ldquo;masalah distribusi kunci&amp;rdquo;. Ketika Alice dan Bob, yang berjauhan, berkomunikasi untuk pertama kalinya, bagaimana mereka bisa berbagi kunci tanpa disadap? Jika kunci tersebut dicuri oleh pihak ketiga saat dikirim melalui pos, semua komunikasi terenkripsi setelahnya akan sepenuhnya bocor.&lt;/p>
&lt;h3 id="12-penemuan-revolusioner-sistem-kriptografi-kunci-publik">1.2 Penemuan Revolusioner &amp;ldquo;Sistem Kriptografi Kunci Publik&amp;rdquo;
&lt;/h3>&lt;p>Untuk menyelesaikan masalah distribusi kunci ini, &amp;ldquo;sistem kriptografi kunci publik&amp;rdquo; diciptakan. Enkripsi RSA adalah salah satu jenisnya.&lt;/p>
&lt;p>Dalam sistem kriptografi kunci publik, &lt;strong>dua kunci yang berbeda digunakan: &amp;ldquo;kunci untuk enkripsi (kunci publik)&amp;rdquo; dan &amp;ldquo;kunci untuk dekripsi (kunci privat/rahasia)&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;ol>
&lt;li>Penerima, Bob, membuat sepasang &amp;ldquo;kunci publik&amp;rdquo; dan &amp;ldquo;kunci privat&amp;rdquo;.&lt;/li>
&lt;li>Bob mempublikasikan &amp;ldquo;kunci publik&amp;rdquo;-nya ke seluruh dunia (tidak masalah siapa pun yang mendapatkannya).&lt;/li>
&lt;li>Pengirim, Alice, menggunakan &amp;ldquo;kunci publik&amp;rdquo; Bob untuk mengenkripsi pesan dan mengirimkannya.&lt;/li>
&lt;li>Pesan yang terenkripsi hanya bisa didekripsi dengan &amp;ldquo;kunci privat&amp;rdquo; yang hanya dimiliki oleh Bob.&lt;/li>
&lt;/ol>
&lt;p>Jika diibaratkan dengan gembok, Bob membuat banyak &amp;ldquo;gembok yang terbuka (kunci publik)&amp;rdquo; dan menyebarkannya ke seluruh dunia. Alice memasukkan pesan yang ditujukan kepada Bob ke dalam kotak, dan menguncinya dengan klik menggunakan gembok Bob yang ia temukan. Begitu gembok ditutup, ia hanya dapat dibuka dengan &amp;ldquo;kunci master (kunci privat)&amp;rdquo; yang dimiliki oleh Bob. Bahkan jika seseorang mencuri kotak itu di tengah jalan, mereka tidak bisa membukanya karena tidak memiliki kunci master.&lt;/p>
&lt;div class="mermaid">graph TD
A["Alice (Pengirim)"] --> B["Teks Terang (Pesan)"]
B --> C["Proses Enkripsi"]
D["Kunci Publik Bob (Tersedia untuk siapa saja)"] --> C
C --> E["Dikirim via Internet: Teks Sandi"]
E --> F["Proses Dekripsi"]
G["Kunci Privat Bob (Hanya dimiliki Bob)"] --> F
F --> H["Teks Terang Dipulihkan (Pesan)"]
H --> I["Bob (Penerima)"]&lt;/div>
&lt;p>Untuk mewujudkan sistem revolusioner ini, diperlukan semacam &lt;strong>&amp;ldquo;fungsi satu arah (teka-teki matematika satu arah)&amp;rdquo;&lt;/strong> yang &amp;ldquo;mudah dienkripsi dengan kunci publik, tetapi sama sekali tidak dapat didekripsi tanpa kunci privat&amp;rdquo;. Yang menjadi perhatian sebagai bagian dari teka-teki itu adalah &amp;ldquo;bilangan prima&amp;rdquo; yang sering kita kenal.&lt;/p>
&lt;hr>
&lt;h2 id="2-dasar-matematika-yang-mendukung-enkripsi-rsa-1-bilangan-prima-dan-faktorisasi-prima">2. Dasar Matematika yang Mendukung Enkripsi RSA 1: Bilangan Prima dan Faktorisasi Prima
&lt;/h2>&lt;p>Keamanan enkripsi RSA didasarkan pada fakta matematis bahwa &lt;strong>&amp;ldquo;faktorisasi prima dari bilangan yang sangat besar adalah sangat sulit&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;h3 id="21-apa-itu-bilangan-prima">2.1 Apa itu Bilangan Prima?
&lt;/h3>&lt;p>Bilangan prima adalah &amp;ldquo;bilangan asli lebih besar dari 1 yang hanya bisa dibagi habis oleh 1 dan dirinya sendiri&amp;rdquo;.
Contoh: $2, 3, 5, 7, 11, 13, 17, 19, 23...$&lt;/p>
&lt;p>Bilangan prima itu seperti &amp;ldquo;atom&amp;rdquo; untuk semua bilangan bulat. Bilangan asli apa pun bisa diuraikan ke dalam bentuk perkalian bilangan-bilangan prima. Ini disebut &lt;strong>faktorisasi prima&lt;/strong>. Sebagai contoh, $60 = 2^2 \times 3 \times 5$, dapat difaktorisasi prima hanya dalam satu cara dengan mengabaikan urutan, hal ini dikenal sebagai &amp;ldquo;Teorema Dasar Aritmetika&amp;rdquo;.&lt;/p>
&lt;h3 id="22-kesulitan-faktorisasi-prima-fungsi-satu-arah">2.2 Kesulitan Faktorisasi Prima (Fungsi Satu Arah)
&lt;/h3>&lt;p>Yang penting di sini adalah asimetri di mana &lt;strong>&amp;ldquo;perkalian itu mudah, tetapi faktorisasi prima itu sulit&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>Sebagai contoh, coba hitung perkalian dua bilangan prima berikut di luar kepala.
$11 \times 13 = ?$
Ini mudah, bukan? Jawabannya adalah $143$.&lt;/p>
&lt;p>Lalu, bagaimana dengan bilangan berikut?
Faktorisasi prima dari $323$.
Bagaimana? Seharusnya butuh sedikit waktu. (Jawabannya adalah $17 \times 19$).&lt;/p>
&lt;p>Jika bilangannya kecil, manusia masih bisa menghitungnya entah bagaimana, tetapi ketika bilangannya menjadi besar, penghitungannya akan sangat sulit bahkan dengan menggunakan komputer. Enkripsi RSA mainstream saat ini menggunakan bilangan $N = p \times q$ yang mengalikan bilangan prima yang sangat besar $p$ dan $q$ sebesar 2048 bit (sekitar 600 digit dalam desimal).&lt;/p>
&lt;p>Diberikan dua bilangan prima raksasa $p$ dan $q$, menghitung $N$ membutuhkan waktu sekejap (kurang dari milidetik) bagi komputer. Namun sebaliknya, jika hanya diberikan $N$ untuk mencari tahu $p$ dan $q$ yang asli, akan memakan waktu yang sangat lama yang tidak dapat dipecahkan bahkan jika superkomputer tercepat saat ini dijalankan selama triliunan tahun.&lt;/p>
&lt;p>Inilah &lt;strong>&amp;ldquo;asimetri komputasi (mudah satu arah, sulit arah sebaliknya)&amp;rdquo;&lt;/strong> yang menjadi landasan untuk menciptakan hubungan antara kunci publik dan kunci privat.&lt;/p>
&lt;hr>
&lt;h2 id="3-dasar-matematika-yang-mendukung-enkripsi-rsa-2-kongruensi-aritmetika-modular">3. Dasar Matematika yang Mendukung Enkripsi RSA 2: Kongruensi (Aritmetika Modular)
&lt;/h2>&lt;p>Perhitungan enkripsi RSA tidak dilakukan dengan penjumlahan atau perkalian bilangan yang menjadi besar tanpa batas seperti yang biasa kita gunakan, melainkan dalam dunia &amp;ldquo;sisa&amp;rdquo; setelah dibagi dengan suatu bilangan tertentu. Ini disebut &lt;strong>kongruensi (aritmetika modular)&lt;/strong>.&lt;/p>
&lt;h3 id="31-matematika-jam">3.1 Matematika Jam
&lt;/h3>&lt;p>Aritmetika modular sering diibaratkan sebagai &amp;ldquo;matematika jam&amp;rdquo;. Misalkan sekarang jam 10, jam berapakah 5 jam dari sekarang? $10 + 5 = 15$, namun pada jam 12 jam biasa kita akan menjawab &amp;ldquo;jam 3&amp;rdquo;. Hal ini karena sisa dari 15 dibagi 12 adalah 3.&lt;/p>
&lt;p>Dalam dunia matematika, ini ditulis sebagai berikut.
&lt;/p>
$$ 15 \equiv 3 \pmod{12} $$
&lt;p>
Ini dibaca sebagai &amp;ldquo;15 dan 3 adalah kongruen modulo 12 (sisanya sama jika dibagi 12)&amp;rdquo;.&lt;/p>
&lt;h3 id="32-sifat-dasar-kongruensi">3.2 Sifat Dasar Kongruensi
&lt;/h3>&lt;p>Kongruensi memiliki sifat-sifat yang sangat berguna yang mirip dengan persamaan ($=$). Misalkan modulo (pembagi)-nya adalah $N$.
Jika $a \equiv b \pmod N$ dan $c \equiv d \pmod N$, maka hal-hal berikut ini berlaku:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Penjumlahan:&lt;/strong> $a + c \equiv b + d \pmod N$&lt;/li>
&lt;li>&lt;strong>Pengurangan:&lt;/strong> $a - c \equiv b - d \pmod N$&lt;/li>
&lt;li>&lt;strong>Perkalian:&lt;/strong> $a \times c \equiv b \times d \pmod N$&lt;/li>
&lt;li>&lt;strong>Perpangkatan:&lt;/strong> $a^k \equiv b^k \pmod N$ (di mana $k$ adalah bilangan asli)&lt;/li>
&lt;/ol>
&lt;p>Yang paling penting adalah sifat &amp;ldquo;perpangkatan&amp;rdquo;. Ini berarti &lt;strong>&amp;ldquo;sisa pembagian suatu perpangkatan sama dengan perpangkatan dari sisa pembagian&amp;rdquo;&lt;/strong>.
Misalnya, misalkan kita ingin mencari sisa dari $7^{100}$ dibagi $5$. Jika kita serius mengalikan $7$ seratus kali dan kemudian membaginya dengan $5$, itu akan sangat sulit, tetapi menggunakan sifat kongruensi, karena $7 \equiv 2 \pmod 5$, maka akan menjadi $7^{100} \equiv 2^{100} \pmod 5$, yang menyederhanakan perhitungan secara drastis. Sifat ini sangat penting dalam dunia kriptografi karena berkaitan dengan perpangkatan angka yang sangat besar.&lt;/p>
&lt;hr>
&lt;h2 id="4-dasar-matematika-yang-mendukung-enkripsi-rsa-3-fungsi-euler-dan-teorema-euler">4. Dasar Matematika yang Mendukung Enkripsi RSA 3: Fungsi Euler dan Teorema Euler
&lt;/h2>&lt;p>Mulai dari sini, kita masuk ke inti keajaiban matematika dari enkripsi RSA. Muncullah &amp;ldquo;Teorema Euler&amp;rdquo; yang merupakan generalisasi dari &amp;ldquo;Teorema Kecil Fermat&amp;rdquo;.&lt;/p>
&lt;h3 id="41-fungsi-totient-euler-phin">4.1 Fungsi Totient Euler $\phi(N)$
&lt;/h3>&lt;p>Fungsi Totient Euler (Fungsi $\phi$) adalah fungsi yang untuk suatu bilangan asli $N$, menghasilkan &lt;strong>&amp;ldquo;jumlah bilangan dari bilangan asli antara 1 hingga $N$ yang saling prima (faktor persekutuan terbesarnya adalah 1) dengan $N$&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>Mari kita lihat beberapa contoh.&lt;/p>
&lt;ul>
&lt;li>$\phi(5)$: Di antara 1, 2, 3, 4, 5, bilangan yang saling prima dengan 5 ada 4 bilangan yaitu 1, 2, 3, 4. Sehingga, $\phi(5) = 4$.&lt;/li>
&lt;li>$\phi(6)$: Di antara 1, 2, 3, 4, 5, 6, bilangan yang saling prima dengan 6 ada 2 bilangan yaitu 1, 5. Sehingga, $\phi(6) = 2$.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【Sifat Khusus dalam Kasus Bilangan Prima】&lt;/strong>
Jika $p$ adalah bilangan prima, semua angka dari 1 hingga $p-1$ akan saling prima dengan $p$. Oleh karena itu,
&lt;/p>
$$ \phi(p) = p - 1 $$
&lt;p>&lt;strong>【Sifat Khusus dalam Kasus Hasil Kali Bilangan Prima】&lt;/strong>
Untuk dua bilangan prima berbeda $p$ dan $q$, jika $N = p \times q$, $\phi(N)$ dapat dengan mudah dicari melalui perhitungan berikut.
&lt;/p>
$$ \phi(N) = \phi(p) \times \phi(q) = (p - 1)(q - 1) $$
&lt;p>
Sifat ini berfungsi sebagai &amp;ldquo;pintu belakang rahasia (trapdoor)&amp;rdquo; dari enkripsi RSA. Seseorang yang mengetahui $p$ dan $q$ (pembuat kunci) dapat menghitung $\phi(N)$ dalam sekejap, tetapi pihak ketiga yang hanya tahu $N$ tidak akan bisa mencari $\phi(N)$ kecuali mereka memfaktorkan prima $N$.&lt;/p>
&lt;h3 id="42-teorema-euler">4.2 Teorema Euler
&lt;/h3>&lt;p>Leonhard Euler menggunakan $\phi(N)$ ini untuk membuktikan teorema yang indah sebagai berikut.&lt;/p>
&lt;p>&lt;strong>Teorema Euler:&lt;/strong>
Ketika bilangan bulat $a$ dan $N$ saling prima, persamaan kongruensi berikut berlaku.
&lt;/p>
$$ a^{\phi(N)} \equiv 1 \pmod N $$
&lt;p>Ini adalah sifat yang luar biasa, yang menyatakan bahwa &amp;ldquo;jika suatu bilangan $a$ dikalikan $\phi(N)$ kali lalu dibagi $N$, sisanya pasti akan menjadi $1$&amp;rdquo;. (Jika $N$ adalah bilangan prima $p$, ia menjadi $a^{p-1} \equiv 1 \pmod p$ dan disebut Teorema Kecil Fermat).&lt;/p>
&lt;p>Mari kita ubah bentuk Teorema Euler ini. Kita kalikan kedua sisi dengan $a$ sekali lagi.
&lt;/p>
$$ a^{\phi(N) + 1} \equiv a \pmod N $$
&lt;p>Lebih lanjut, untuk sembarang bilangan bulat $k$, $a^{k \cdot \phi(N)}$ juga menjadi $1^k = 1$, sehingga persamaan berikut berlaku.
&lt;/p>
$$ a^{k \cdot \phi(N) + 1} \equiv a \pmod N $$
&lt;p>Persamaan inilah prinsip fundamental yang mewujudkan keajaiban enkripsi RSA yaitu &lt;strong>&amp;ldquo;setelah dienkripsi dan kemudian didekripsi akan kembali ke asalnya&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="5-algoritma-enkripsi-rsa-langkah-pembuatan-kunci-enkripsi-dan-dekripsi">5. Algoritma Enkripsi RSA: Langkah Pembuatan Kunci, Enkripsi, dan Dekripsi
&lt;/h2>&lt;p>Sekarang setelah kita memiliki pengetahuan dasarnya, mari kita lihat prosedur spesifik dari enkripsi RSA. Enkripsi RSA dibagi menjadi 3 fase utama: &amp;ldquo;1. Pembuatan Kunci&amp;rdquo;, &amp;ldquo;2. Enkripsi&amp;rdquo;, dan &amp;ldquo;3. Dekripsi&amp;rdquo;.&lt;/p>
&lt;div class="mermaid">flowchart TD
A1["1. Pilih bilangan prima p, q"] --> A2["Hitung N = p × q"]
A1 --> A3["Hitung φ(N) = (p-1)(q-1)"]
A3 --> A4["Pilih e yang saling prima dengan φ(N)"]
A3 --> A5["Hitung d sehingga e × d ≡ 1 (mod φ(N))"]
A2 --> A6["Kunci Publik (N, e)"]
A4 --> A6
A5 --> A7["Kunci Privat d"]
B1["2. Pesan Teks Terang M"] --> B2["Hitung C ≡ M^e (mod N)"]
A6 -.-> B2
B2 --> B3["Kirim Teks Sandi C"]
B3 --> C1["3. Teks Sandi C Diterima"]
C1 --> C2["Hitung M ≡ C^d (mod N)"]
A7 -.-> C2
C2 --> C3["Dapatkan pesan teks terang awal M"]&lt;/div>
&lt;h3 id="51-pembuatan-kunci-key-generation">5.1 Pembuatan Kunci (Key Generation)
&lt;/h3>&lt;p>Penerima, Bob, membuat &amp;ldquo;kunci publik&amp;rdquo; dan &amp;ldquo;kunci privat&amp;rdquo; untuk dirinya sendiri.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Pemilihan Bilangan Prima:&lt;/strong> Pilih dua bilangan prima besar $p$ dan $q$ secara acak.&lt;/li>
&lt;li>&lt;strong>Perhitungan Modulo $N$:&lt;/strong> Hitung $N = p \times q$. Nilai $N$ ini akan dipublikasikan.&lt;/li>
&lt;li>&lt;strong>Perhitungan $\phi(N)$:&lt;/strong> Hitung fungsi Euler $\phi(N) = (p - 1)(q - 1)$. Ini adalah angka rahasia milik Bob.&lt;/li>
&lt;li>&lt;strong>Pemilihan Kunci Publik $e$:&lt;/strong> Pilih bilangan bulat $e$ dengan syarat $1 &lt; e &lt; \phi(N)$ dan saling prima dengan $\phi(N)$.&lt;/li>
&lt;li>&lt;strong>Perhitungan Kunci Privat $d$:&lt;/strong> Temukan bilangan bulat $d$ yang memenuhi syarat berikut:
$$ e \times d \equiv 1 \pmod{\phi(N)} $$
Artinya, &amp;ldquo;suatu bilangan $d$ sedemikian rupa sehingga jika $e \times d$ dibagi $\phi(N)$, sisanya adalah $1$&amp;rdquo;.&lt;/li>
&lt;/ol>
&lt;p>Kini kunci sudah siap.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Kunci Publik:&lt;/strong> Pasangan $(N, e)$. Dipublikasikan ke seluruh dunia.&lt;/li>
&lt;li>&lt;strong>Kunci Privat:&lt;/strong> $d$. Sama sekali tidak diberitahukan kepada siapa pun.&lt;/li>
&lt;/ul>
&lt;h3 id="52-enkripsi-encryption">5.2 Enkripsi (Encryption)
&lt;/h3>&lt;p>Misalkan Alice ingin mengirim pesan rahasia $M$ kepada Bob. (Misalkan $M$ adalah nilai numerik dari teks, dengan $0 \le M &lt; N$). Alice menggunakan kunci publik Bob $(N, e)$ untuk menghitung hal berikut.&lt;/p>
$$ C \equiv M^e \pmod N $$
&lt;p>Menghitung &amp;ldquo;pesan $M$ dipangkatkan dengan $e$, dan sisanya setelah dibagi dengan $N$ adalah $C$&amp;rdquo;. $C$ ini adalah teks sandinya.&lt;/p>
&lt;h3 id="53-dekripsi-decryption">5.3 Dekripsi (Decryption)
&lt;/h3>&lt;p>Bob menerima teks sandi $C$. Bob menggunakan kunci privatnya $d$ untuk menghitung hal berikut.&lt;/p>
$$ M \equiv C^d \pmod N $$
&lt;p>Jika &amp;ldquo;teks sandi $C$ dipangkatkan dengan $d$, dan dihitung sisanya setelah dibagi dengan $N$&amp;rdquo;, menakjubkan sekali, pesan asli $M$ berhasil dipulihkan!&lt;/p>
&lt;hr>
&lt;h2 id="6-mengapa-bisa-kembali-asal-melalui-dekripsi-pembuktian-matematis">6. Mengapa Bisa Kembali Asal Melalui Dekripsi? (Pembuktian Matematis)
&lt;/h2>&lt;p>Anda mungkin bertanya-tanya, &amp;ldquo;Bagaimana mungkin hanya dengan memangkatkan $C$ dengan $d$ bisa mengembalikannya ke $M$ yang asli?&amp;rdquo;. Di sinilah &amp;ldquo;Teorema Euler&amp;rdquo; yang sudah dibahas sebelumnya menunjukkan kekuatannya.&lt;/p>
&lt;p>Mari kita substitusikan rumus enkripsi $C = M^e$ ke dalam rumus dekripsi $C^d \pmod N$.
&lt;/p>
$$ C^d \equiv (M^e)^d \equiv M^{ed} \pmod N $$
&lt;p>Sekarang, ingatlah langkah 5 pada pembuatan kunci. Saat Bob membuat $d$, ia memilihnya sedemikian rupa sehingga $e \times d \equiv 1 \pmod{\phi(N)}$. Ini berarti bahwa &amp;ldquo;$ed$ adalah kelipatan $\phi(N)$ ditambah $1$&amp;rdquo;. Kita bisa menuliskannya menggunakan bilangan bulat $k$ seperti ini:
&lt;/p>
$$ ed = k \cdot \phi(N) + 1 $$
&lt;p>Kita substitusikan ini ke eksponen, dan menjabarkannya menggunakan hukum eksponen.
&lt;/p>
$$ M^{ed} = M^{k \cdot \phi(N) + 1} = M^{k \cdot \phi(N)} \times M^1 = (M^{\phi(N)})^k \times M $$
&lt;p>Di sini, jika kita mengasumsikan bahwa pesan $M$ dan $N$ saling prima, menurut &lt;strong>Teorema Euler&lt;/strong> maka $M^{\phi(N)} \equiv 1 \pmod N$.
&lt;/p>
$$ (M^{\phi(N)})^k \times M \equiv 1^k \times M \equiv M \pmod N $$
&lt;p>Sehingga, terbukti bahwa persamaan berikut ini benar.
&lt;/p>
$$ C^d \equiv M \pmod N $$
&lt;p>Alice tidak tahu $d$, dan penyadap juga tidak tahu $d$, jadi hanya Bob yang memiliki $d$ lah yang bisa mengekstrak $M$ dari $C$.&lt;/p>
&lt;hr>
&lt;h2 id="7-contoh-konkret-mari-mencoba-rsa-dengan-perhitungan-manual-menggunakan-bilangan-prima-kecil">7. Contoh Konkret: Mari Mencoba RSA dengan Perhitungan Manual Menggunakan Bilangan Prima Kecil
&lt;/h2>&lt;p>Mari kita gunakan angka-angka (bilangan prima) kecil untuk mempraktekkan komunikasi terenkripsi dari Alice ke Bob.&lt;/p>
&lt;p>&lt;strong>【Fase Pembuatan Kunci oleh Bob】&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>Pilih dua bilangan prima $p=11$, $q=13$.&lt;/li>
&lt;li>Hitung $N = 11 \times 13 = 143$.&lt;/li>
&lt;li>Hitung $\phi(N) = (11 - 1) \times (13 - 1) = 10 \times 12 = 120$.&lt;/li>
&lt;li>Pilih kunci publik $e$ yang saling prima dengan $\phi(N)=120$. Di sini, kita buat $e=7$.&lt;/li>
&lt;li>Cari kunci privat $d$. Kita cari $d$ yang mana $7 \times d \equiv 1 \pmod{120}$.
Dalam persamaan $7d = 120k + 1$, saat $k=6$, hasilnya menjadi $721$, dan $721 \div 7 = 103$.
Maka, $d = 103$.&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>Kunci Publik: $(N=143, e=7)$&lt;/li>
&lt;li>Kunci Privat: $d=103$&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【Fase Enkripsi oleh Alice】&lt;/strong>
Misalkan Alice ingin mengirim pesan $M = 9$.
Rumus: $C \equiv 9^7 \pmod{143}$
$9^7 = 4.782.969$. Jika dibagi 143, hasil baginya 33.447 dengan sisa $48$.
Teks sandinya menjadi $C = 48$.&lt;/p>
&lt;p>&lt;strong>【Fase Dekripsi oleh Bob】&lt;/strong>
Bob menerima teks sandi $C = 48$ dan menggunakan kunci privat $d = 103$ untuk mendekripsinya.
Rumus: $M \equiv 48^{103} \pmod{143}$
Jika Anda mengeksekusi &lt;code>(48 ** 103) % 143&lt;/code> di kalkulator (atau komputer), hasilnya secara menakjubkan adalah &amp;ldquo;&lt;strong>9&lt;/strong>&amp;rdquo;! Pesan asli berhasil diterima dengan aman.&lt;/p>
&lt;hr>
&lt;h2 id="8-cara-mencari-kunci-privat-d-algoritma-euclidean-diperluas-extended-euclidean-algorithm">8. Cara Mencari Kunci Privat $d$: Algoritma Euclidean Diperluas (Extended Euclidean Algorithm)
&lt;/h2>&lt;p>Pada contoh hitung manual, kita menebak nilai $k$ untuk mencari $d=103$, namun saat bilangannya menjadi ratusan digit, cara ini tidak mungkin dilakukan. Dalam program komputer yang nyata, digunakan algoritma yang disebut &lt;strong>&amp;ldquo;Algoritma Euclidean Diperluas&amp;rdquo;&lt;/strong> (Extended Euclidean Algorithm).&lt;/p>
&lt;p>Menyelesaikan $7d \equiv 1 \pmod{120}$ sama artinya dengan mencari bilangan bulat $d, y$ yang memenuhi $7d + 120y = 1$. Dengan menghitung balik Algoritma Euclidean, hal ini bisa didapatkan secara mekanis.&lt;/p>
&lt;ol>
&lt;li>$120 \div 7 = 17$ sisa $1$&lt;/li>
&lt;li>Jika kita ubah persamaannya, $1 = 120 - 17 \times 7$&lt;/li>
&lt;li>Artinya, $-17 \times 7 \equiv 1 \pmod{120}$&lt;/li>
&lt;/ol>
&lt;p>$-17$ memiliki makna yang sama dengan $120 - 17 = 103$ dalam dunia modulo $120$. Oleh karena itu, $d = 103$ dapat ditemukan dalam sekejap. Cara ini dapat menghitung bilangan sebesar apa pun dengan sangat cepat.&lt;/p>
&lt;hr>
&lt;h2 id="9-wajah-lain-dari-enkripsi-rsa-tanda-tangan-digital">9. Wajah Lain dari Enkripsi RSA: Tanda Tangan Digital
&lt;/h2>&lt;p>Hal hebat dari enkripsi RSA adalah, ia juga bisa digunakan sebagai &lt;strong>&amp;ldquo;tanda tangan digital&amp;rdquo;&lt;/strong> dengan menukar peran kunci publik dan kunci privat.&lt;/p>
&lt;p>Pada enkripsi: &amp;ldquo;Enkripsi dengan kunci publik $\Rightarrow$ Dekripsi dengan kunci privat&amp;rdquo;.
Pada tanda tangan digital, prosedurnya menjadi: &amp;ldquo;Enkripsi dengan kunci privat $\Rightarrow$ Dekripsi dengan kunci publik&amp;rdquo;.&lt;/p>
&lt;div class="mermaid">flowchart TD
A1["1. Alice membuat tanda tangan dengan kunci privatnya"] --> A2["S ≡ M^d (mod N)"]
A2 --> A3["Mengirim pesan M dan tanda tangan S"]
A3 --> B1["2. Bob memverifikasi tanda tangan dengan kunci publik"]
B1 --> B2["Menghitung M' ≡ S^e (mod N)"]
B2 --> B3["Memeriksa apakah M' cocok dengan M"]&lt;/div>
&lt;p>Alice menggunakan kunci privatnya sendiri $d$ untuk mengubah pesan (ini adalah tanda tangan $S$) dan mengirimkannya ke Bob. Bob menggunakan kunci publik Alice $e$ untuk melakukan perhitungan verifikasi. Jika hasil perhitungannya cocok dengan pesan asli, ini sekaligus membuktikan &amp;ldquo;bahwa data itu hanya bisa dibuat dengan kunci privat Alice&amp;rdquo; dan &amp;ldquo;pesan itu tidak dimanipulasi di tengah jalan&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="10-merasakan-enkripsi-rsa-melalui-program">10. Merasakan Enkripsi RSA Melalui Program
&lt;/h2>&lt;p>Perhitungan perpangkatan yang berat jika dihitung manual dapat diimplementasikan dengan sangat mudah menggunakan Python. Berikut adalah kode Python untuk mengalami logika inti dari enkripsi RSA.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;Mencari faktor persekutuan terbesar (FPB)&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">mod_inverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;Mencari kunci privat d (Menggunakan fungsi bawaan dari Python 3.8 ke atas)&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. Pembuatan Kunci&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">q&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">11&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">13&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">N&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">phi&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">e&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">d&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod_inverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Kunci Publik: (N=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, e=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">), Kunci Privat: d=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. Enkripsi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">9&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ciphertext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">message&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Teks Sandi: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. Dekripsi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">decrypted_message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Pesan yang Didekripsi: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">decrypted_message&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Fungsi &lt;code>pow(base, exp, mod)&lt;/code> pada Python secara internal menggunakan algoritma cepat yang disebut &amp;ldquo;Exponensiasi Pengkuadratan Berulang&amp;rdquo; (Repeated Squaring), sehingga perhitungan selesai dalam sekejap bahkan jika angkanya ratusan digit.&lt;/p>
&lt;hr>
&lt;h2 id="11-kesimpulan-dan-teknologi-kriptografi-masa-depan">11. Kesimpulan dan Teknologi Kriptografi Masa Depan
&lt;/h2>&lt;p>Berdasarkan pengetahuan matematika tingkat sekolah menengah atas, kita telah mengungkap cara kerja dari enkripsi RSA.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Kesulitan Faktorisasi Prima:&lt;/strong> Mudah untuk menghitung $p \times q = N$, tetapi sangat sulit untuk menemukan $p, q$ dari $N$.&lt;/li>
&lt;li>&lt;strong>Kongruensi dan Teorema Euler:&lt;/strong> Berkat aturan $a^{\phi(N)} \equiv 1 \pmod N$, sebuah trapdoor ajaib &amp;ldquo;memangkatkan dengan suatu bilangan mengembalikan ke bentuk asli&amp;rdquo; telah tercipta.&lt;/li>
&lt;li>&lt;strong>Kunci Publik dan Kunci Privat:&lt;/strong> Siapa pun dapat mengenkripsi, tetapi hanya penerima sah yang dapat mendekripsi.&lt;/li>
&lt;/ol>
&lt;p>Nilai $N$ pada enkripsi RSA yang digunakan saat ini lebih dari 600 digit, dan butuh waktu lebih lama dari usia alam semesta untuk memfaktorkan primanya meskipun dengan menggerakkan seluruh superkomputer di dunia. Namun, jika &amp;ldquo;komputer kuantum&amp;rdquo;, yang penelitiannya sedang berkembang dalam beberapa tahun terakhir, berhasil dikomersialkan di masa depan, ada kemungkinan bahwa faktorisasi prima ini akan dipecahkan dalam sekejap oleh algoritma Shor. Oleh karena itu, pengembangan &amp;ldquo;Kriptografi Pasca Kuantum&amp;rdquo; (Post-Quantum Cryptography) yang tidak dapat dipecahkan bahkan oleh komputer kuantum saat ini sedang dikembangkan dengan sangat cepat di seluruh dunia.&lt;/p>
&lt;p>Matematika tingkat tinggi yang sering dianggap &amp;ldquo;tidak berguna&amp;rdquo;, nyatanya melindungi kehidupan sehari-hari kita dari fondasinya. Enkripsi RSA merupakan materi pembelajaran terbaik yang mengajarkan kita kedalaman dan keindahan matematika tersebut. Kami harap melalui artikel ini, Anda sedikit banyak dapat merasakan betapa menariknya kriptografi dan matematika.&lt;/p></description></item><item><title>Dasar Matematika Kriptografi Kurva Eliptik (ECC) dan Implementasinya dalam C++</title><link>http://kenji.blog/id/p/elliptic-curve-cryptography-math-cpp/</link><pubDate>Fri, 11 Sep 2026 10:00:00 +0900</pubDate><guid>http://kenji.blog/id/p/elliptic-curve-cryptography-math-cpp/</guid><description>&lt;img src="http://kenji.blog/p/elliptic-curve-cryptography-math-cpp/img/eyecatch.jpg" alt="Featured image of post Dasar Matematika Kriptografi Kurva Eliptik (ECC) dan Implementasinya dalam C++" />&lt;h1 id="dasar-matematika-kriptografi-kurva-eliptik-ecc-dan-implementasinya-dalam-c">Dasar Matematika Kriptografi Kurva Eliptik (ECC) dan Implementasinya dalam C++
&lt;/h1>&lt;p>Dalam teknologi kriptografi modern, &lt;strong>Kriptografi Kurva Eliptik (Elliptic Curve Cryptography: ECC)&lt;/strong> memainkan peran yang sangat penting. Dari komunikasi internet harian kita (HTTPS/TLS), secure enclave di smartphone, autentikasi server melalui SSH, autentikasi tanpa kata sandi seperti FIDO, hingga aset kripto seperti Bitcoin dan Ethereum, tidak berlebihan untuk mengatakan bahwa fondasi kepercayaan masyarakat digital saat ini didukung oleh ECC.&lt;/p>
&lt;p>Dalam artikel ini, kami akan menjelaskan secara menyeluruh dengan detail yang luar biasa tentang bagaimana kriptografi kurva eliptik ini berfungsi, mulai dari teori matematika yang indah namun rumit di baliknya (geometri aljabar di atas lapangan berhingga), metode implementasi aktual menggunakan C++, hingga teknik pengkodean yang aman untuk mencegah serangan saluran samping (serangan waktu).&lt;/p>
&lt;hr>
&lt;h2 id="1-mengapa-kriptografi-kurva-eliptik-perbandingan-dengan-rsa">1. Mengapa Kriptografi Kurva Eliptik? (Perbandingan dengan RSA)
&lt;/h2>&lt;p>Sinonim dari kriptografi kunci publik telah lama adalah &lt;strong>kriptografi RSA&lt;/strong>. RSA mendasarkan keamanannya pada &amp;ldquo;kesulitan faktorisasi prima dari bilangan komposit yang sangat besar&amp;rdquo;. Namun, seiring dengan peningkatan kemampuan komputasi komputer, ada kebutuhan untuk terus memperpanjang panjang kunci (jumlah bit modulus) RSA untuk mempertahankan keamanannya. Saat ini, direkomendasikan setidaknya panjang kunci 2048 bit, atau 3072 bit hingga 4096 bit untuk keamanan yang lebih baik.&lt;/p>
&lt;p>Sebaliknya, kriptografi kurva eliptik (ECC) mendasarkan keamanannya pada kesulitan matematika yang berbeda, yaitu &lt;strong>&amp;ldquo;Masalah Logaritma Diskret Kurva Eliptik (ECDLP)&amp;rdquo;&lt;/strong>. Algoritma yang efisien untuk memecahkan ECDLP (seperti algoritma waktu sub-eksponensial) belum ditemukan hingga saat ini, dan bahkan metode serangan paling efisien yang diketahui memerlukan waktu eksponensial.&lt;/p>
&lt;p>Karena sifat ini, ECC memiliki keuntungan krusial yaitu &lt;strong>dapat mencapai tingkat keamanan yang setara dengan RSA namun dengan panjang kunci yang jauh lebih pendek&lt;/strong>.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:center">Kekuatan Keamanan (bit)&lt;/th>
&lt;th style="text-align:center">Panjang Kunci RSA (bit)&lt;/th>
&lt;th style="text-align:center">Panjang Kunci Kriptografi Kurva Eliptik (bit)&lt;/th>
&lt;th style="text-align:center">Rasio Panjang Kunci&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:center">80&lt;/td>
&lt;td style="text-align:center">1024&lt;/td>
&lt;td style="text-align:center">160&lt;/td>
&lt;td style="text-align:center">1:6&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">112&lt;/td>
&lt;td style="text-align:center">2048&lt;/td>
&lt;td style="text-align:center">224&lt;/td>
&lt;td style="text-align:center">1:9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">128&lt;/td>
&lt;td style="text-align:center">3072&lt;/td>
&lt;td style="text-align:center">256&lt;/td>
&lt;td style="text-align:center">1:12&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">192&lt;/td>
&lt;td style="text-align:center">7680&lt;/td>
&lt;td style="text-align:center">384&lt;/td>
&lt;td style="text-align:center">1:20&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">256&lt;/td>
&lt;td style="text-align:center">15360&lt;/td>
&lt;td style="text-align:center">512&lt;/td>
&lt;td style="text-align:center">1:30&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Seperti yang ditunjukkan pada tabel di atas, untuk mendapatkan kekuatan keamanan 128 bit (kekuatan standar saat ini), RSA memerlukan kunci 3072 bit, sedangkan ECC hanya membutuhkan 256 bit. Hal ini memungkinkan pengurangan komputasi, penggunaan memori yang lebih rendah, dan penghematan bandwidth jaringan, yang memberikan keunggulan luar biasa terutama pada perangkat IoT dan lingkungan smart card dengan sumber daya terbatas.&lt;/p>
&lt;hr>
&lt;h2 id="2-persiapan-matematika-teori-grup-dan-dunia-lapangan-berhingga">2. Persiapan Matematika: Teori Grup dan Dunia Lapangan Berhingga
&lt;/h2>&lt;p>Untuk benar-benar memahami kriptografi kurva eliptik, penting untuk memahami konsep dasar aljabar abstrak (teori grup dan teori lapangan). Di sini, kami merangkum pengetahuan prasyarat untuk mengonstruksi ECC secara ringkas.&lt;/p>
&lt;h3 id="21-grup-group-dan-grup-abelian">2.1. Grup (Group) dan Grup Abelian
&lt;/h3>&lt;p>&lt;strong>Grup (Group)&lt;/strong> adalah himpunan $G$ yang dilengkapi dengan operasi biner (di sini kita gunakan penjumlahan $+$), disimbolkan dengan $(G, +)$, yang memenuhi 4 aksioma berikut:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Sifat Tertutup (Closure)&lt;/strong>: Untuk setiap $a, b \in G$, maka $a + b \in G$.&lt;/li>
&lt;li>&lt;strong>Sifat Asosiatif (Associativity)&lt;/strong>: Untuk setiap $a, b, c \in G$, berlaku $(a + b) + c = a + (b + c)$.&lt;/li>
&lt;li>&lt;strong>Eksistensi Elemen Identitas (Identity element)&lt;/strong>: Terdapat elemen $e \in G$ sehingga untuk setiap $a \in G$, berlaku $a + e = e + a = a$. Dalam kasus grup aditif, elemen identitas ini biasanya dilambangkan dengan $0$ atau $\mathcal{O}$.&lt;/li>
&lt;li>&lt;strong>Eksistensi Elemen Invers (Inverse element)&lt;/strong>: Untuk setiap $a \in G$, terdapat elemen $b \in G$ sehingga $a + b = b + a = e$. $b$ ini dilambangkan sebagai $-a$.&lt;/li>
&lt;/ol>
&lt;p>Lebih lanjut, jika urutan operasi diubah dan hasilnya tetap sama, yaitu memenuhi kondisi di bawah ini, grup tersebut disebut &lt;strong>Grup Abelian (Grup Komutatif)&lt;/strong>.&lt;/p>
&lt;ol start="5">
&lt;li>&lt;strong>Sifat Komutatif (Commutativity)&lt;/strong>: Untuk setiap $a, b \in G$, berlaku $a + b = b + a$.&lt;/li>
&lt;/ol>
&lt;p>Himpunan titik-titik pada kurva eliptik membentuk &lt;strong>grup Abelian&lt;/strong> ini dengan mendefinisikan aturan penjumlahan tertentu.&lt;/p>
&lt;h3 id="22-lapangan-berhingga-finite-field">2.2. Lapangan Berhingga (Finite Field)
&lt;/h3>&lt;p>Dalam teori kriptografi, kita tidak menggunakan lapangan dengan elemen yang kontinu dan tak terhingga seperti bilangan real atau bilangan kompleks, melainkan menggunakan &lt;strong>Lapangan Berhingga (Finite Field)&lt;/strong> atau Lapangan Galois (Galois Field) yang jumlah elemennya terbatas.&lt;/p>
&lt;p>Lapangan berhingga yang paling dasar adalah &lt;strong>lapangan prima $\mathbb{F}_p$&lt;/strong> menggunakan bilangan prima $p$. Ini adalah himpunan bilangan bulat $\{0, 1, 2, \dots, p-1\}$ yang dilengkapi dengan empat operasi aritmetika (penjumlahan, pengurangan, perkalian, pembagian) dengan modulo $p$ (sisa pembagian dengan $p$).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Penjumlahan&lt;/strong>: $(a + b) \pmod p$&lt;/li>
&lt;li>&lt;strong>Pengurangan&lt;/strong>: $(a - b) \pmod p$&lt;/li>
&lt;li>&lt;strong>Perkalian&lt;/strong>: $(a \times b) \pmod p$&lt;/li>
&lt;li>&lt;strong>Pembagian&lt;/strong>: $a \times b^{-1} \pmod p$ (di mana $b^{-1}$ adalah invers perkalian modulo $p$ dari $b$)&lt;/li>
&lt;/ul>
&lt;p>Penghitungan &lt;strong>Invers Perkalian Modulo (Modular Multiplicative Inverse)&lt;/strong> sangat penting dalam implementasi kriptografi. Untuk menemukan $b^{-1}$ yang memenuhi $b \times b^{-1} \equiv 1 \pmod p$, dua algoritma berikut ini terutama digunakan:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Algoritma Euclidean Diperluas (Extended Euclidean Algorithm)&lt;/strong>: Cepat, tetapi tergantung pada implementasinya, waktu pemrosesan dapat bergantung pada nilai input sehingga memiliki risiko serangan waktu.&lt;/li>
&lt;li>&lt;strong>Teorema Kecil Fermat (Fermat&amp;rsquo;s Little Theorem)&lt;/strong>: Ketika $p$ adalah bilangan prima dan $b \neq 0$, berlaku $b^{p-1} \equiv 1 \pmod p$. Jika kedua sisi dibagi dengan $b$, maka diperoleh $b^{p-2} \equiv b^{-1} \pmod p$. Artinya, invers dapat dicari dengan menghitung pangkat $p-2$ dari $b$. Karena operasi pemangkatan mudah diimplementasikan dalam waktu konstan (constant time), metode ini lebih disukai dalam implementasi kriptografi.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="3-persamaan-kurva-eliptik-dan-geometri">3. Persamaan Kurva Eliptik dan Geometri
&lt;/h2>&lt;h3 id="31-bentuk-normal-weierstrass">3.1. Bentuk Normal Weierstrass
&lt;/h3>&lt;p>&lt;strong>Kurva Eliptik (Elliptic Curve)&lt;/strong> pada umumnya adalah kurva pada bidang datar yang didefinisikan oleh persamaan berikut, yang disebut &lt;strong>bentuk normal Weierstrass (Weierstrass normal form)&lt;/strong>.&lt;/p>
$$ y^2 = x^3 + ax + b $$
&lt;p>Di sini, $a$ dan $b$ adalah konstanta, dan agar kurva tidak memiliki titik singular (seperti persimpangan mandiri atau titik puncak) (yakni, kurvanya mulus), nilai &lt;strong>Diskriminan (Discriminant) $\Delta$&lt;/strong> berikut disyaratkan tidak boleh nol.&lt;/p>
$$ \Delta = -16(4a^3 + 27b^2) \neq 0 $$
&lt;p>Karena kurva yang memiliki titik singular dapat merusak keamanan kriptografi, koefisien $a, b$ yang memenuhi kondisi ini selalu dipilih.&lt;/p>
&lt;h3 id="32-titik-di-tak-terhingga-point-at-infinity">3.2. Titik di Tak Terhingga (Point at Infinity)
&lt;/h3>&lt;p>Untuk menjadikan kurva eliptik sebagai grup yang sempurna secara matematis, titik virtual yang disebut &lt;strong>&amp;ldquo;Titik di Tak Terhingga (Point at Infinity)&amp;rdquo;&lt;/strong> diperkenalkan selain titik-titik pada bidang datar. Titik ini dilambangkan sebagai $\mathcal{O}$ (O besar).&lt;/p>
&lt;p>Titik di tak terhingga $\mathcal{O}$ didefinisikan sebagai titik tempat semua garis vertikal bertemu di tempat yang tak terhingga. Dalam teori grup, titik di tak terhingga $\mathcal{O}$ ini berfungsi sebagai &lt;strong>elemen identitas (nol) dalam operasi penjumlahan&lt;/strong>.&lt;/p>
&lt;p>Artinya, untuk setiap titik $P$ pada kurva, berlaku:
&lt;/p>
$$ P + \mathcal{O} = \mathcal{O} + P = P $$
&lt;p>Selain itu, invers $-P$ dari titik $P = (x, y)$ didefinisikan sebagai titik $(x, -y)$ yang simetris terhadap sumbu x. Oleh karena itu:
&lt;/p>
$$ P + (-P) = \mathcal{O} $$
&lt;p>
berlaku.&lt;/p>
&lt;hr>
&lt;h2 id="4-operasi-grup-pada-kurva-eliptik-penambahan-titik-dan-penggandaan-titik">4. Operasi Grup pada Kurva Eliptik (Penambahan Titik dan Penggandaan Titik)
&lt;/h2>&lt;p>Inti dari kriptografi kurva eliptik adalah operasi &lt;strong>&amp;ldquo;Penambahan (Addition)&amp;rdquo;&lt;/strong> antara titik-titik pada kurva. Berbeda dengan penambahan bilangan bulat biasa, ini didefinisikan berdasarkan operasi geometris.&lt;/p>
&lt;h3 id="41-penambahan-geometris-metode-garis-singgung-dan-tali-busur--tangent-and-chord-method">4.1. Penambahan Geometris (Metode Garis Singgung dan Tali Busur / Tangent and Chord Method)
&lt;/h3>&lt;p>Prosedur untuk menambahkan dua titik berbeda $P$ dan $Q$ pada kurva untuk mendapatkan titik baru $R$ ($R = P + Q$) adalah sebagai berikut:&lt;/p>
&lt;ol>
&lt;li>Tarik garis lurus (tali busur) yang melewati titik $P$ dan titik $Q$.&lt;/li>
&lt;li>Garis lurus ini pasti akan memotong kurva eliptik di satu titik lain (mari sebut ini $-R$). (※ Berdasarkan teorema geometri aljabar)&lt;/li>
&lt;li>Titik $R$ yang dicari adalah hasil pencerminan titik potong $-R$ secara simetris terhadap sumbu x (titik dengan tanda koordinat y dibalik).&lt;/li>
&lt;/ol>
&lt;div class="mermaid">graph TD
Step1["Tarik garis lurus yang menghubungkan P(x1, y1) dan Q(x2, y2)"] --> Step2["Temukan persimpangan ketiga -R dengan kurva"]
Step2 --> Step3["Cerminkan -R pada sumbu x, untuk mendapatkan R(x3, y3)"]
Step3 -.-> Result["Ini adalah R = P + Q"]&lt;/div>
&lt;h3 id="42-penggandaan-titik-point-doubling">4.2. Penggandaan Titik (Point Doubling)
&lt;/h3>&lt;p>Ketika menambahkan titik $P$ dengan titik $P$ yang sama ($P + P = 2P$), kita tidak dapat menarik garis yang melewati dua titik. Dalam kasus ini, kita menarik &lt;strong>garis singgung (Tangent) pada kurva di titik $P$&lt;/strong>.&lt;/p>
&lt;ol>
&lt;li>Tarik garis singgung pada kurva di titik $P$.&lt;/li>
&lt;li>Garis singgung ini memotong kurva di satu titik lain yaitu $-R$.&lt;/li>
&lt;li>Titik $R = 2P$ yang dicari adalah hasil pencerminan titik potong tersebut secara simetris terhadap sumbu x.&lt;/li>
&lt;/ol>
&lt;h3 id="43-rumus-komputasi-aljabar">4.3. Rumus Komputasi Aljabar
&lt;/h3>&lt;p>Operasi geometris diubah ke dalam rumus aljabar sehingga dapat dihitung oleh komputer.
Semua operasi dilakukan &lt;strong>di atas lapangan berhingga $\mathbb{F}_p$ (modulo $p$)&lt;/strong>.&lt;/p>
&lt;p>Misalkan Titik $P = (x_1, y_1)$ dan Titik $Q = (x_2, y_2)$.
Dan biarkan titik hasil perhitungannya adalah $R = P + Q = (x_3, y_3)$.&lt;/p>
&lt;p>Biarkan kemiringan garis menjadi $\lambda$ (lambda).&lt;/p>
&lt;p>&lt;strong>【Kasus 1: Ketika $P \neq Q$ (Penambahan Titik)】&lt;/strong>
Kemiringan $\lambda$ adalah rasio perubahan antara dua titik.
&lt;/p>
$$ \lambda \equiv \frac{y_2 - y_1}{x_2 - x_1} \pmod p $$
$$ \lambda \equiv (y_2 - y_1) \cdot (x_2 - x_1)^{-1} \pmod p $$
&lt;p>Menggunakan $\lambda$ ini, $x_3, y_3$ dihitung sebagai berikut.
&lt;/p>
$$ x_3 \equiv \lambda^2 - x_1 - x_2 \pmod p $$
$$ y_3 \equiv \lambda(x_1 - x_3) - y_1 \pmod p $$
&lt;p>&lt;strong>【Kasus 2: Ketika $P = Q$ (Penggandaan Titik)】&lt;/strong>
Kemiringan $\lambda$ adalah kemiringan garis singgung yang diperoleh melalui diferensiasi. ($y^2 = x^3 + ax + b$ didiferensiasikan secara implisit)
&lt;/p>
$$ 2y \cdot y' = 3x^2 + a \implies y' = \frac{3x^2 + a}{2y} $$
&lt;p>
Oleh karena itu,
&lt;/p>
$$ \lambda \equiv (3x_1^2 + a) \cdot (2y_1)^{-1} \pmod p $$
&lt;p>Rumus untuk $x_3, y_3$ memiliki bentuk yang sama dengan penambahan, tetapi karena $x_2 = x_1$, menjadi seperti berikut:
&lt;/p>
$$ x_3 \equiv \lambda^2 - 2x_1 \pmod p $$
$$ y_3 \equiv \lambda(x_1 - x_3) - y_1 \pmod p $$
&lt;blockquote>
&lt;p>[!IMPORTANT]
Rumus-rumus ini melibatkan &lt;strong>pembagian (perhitungan invers modulo)&lt;/strong> seperti $(x_2 - x_1)^{-1}$ dan $(2y_1)^{-1}$. Karena perhitungan invers modulo memiliki biaya komputasi yang sangat tinggi, dalam implementasi praktis, sistem koordinat proyektif seperti &lt;strong>&amp;ldquo;Sistem Koordinat Jacobian (Jacobian Coordinates)&amp;rdquo;&lt;/strong> umumnya digunakan untuk menunda pembagian.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="5-perkalian-skalar-dan-masalah-logaritma-diskret-kurva-eliptik-ecdlp">5. Perkalian Skalar dan Masalah Logaritma Diskret Kurva Eliptik (ECDLP)
&lt;/h2>&lt;p>Dalam kriptografi kurva eliptik, operasi yang paling padat komputasi dan membentuk inti keamanan adalah &lt;strong>Perkalian Skalar (Scalar Multiplication)&lt;/strong>.&lt;/p>
&lt;h3 id="51-apa-itu-perkalian-skalar">5.1. Apa itu Perkalian Skalar?
&lt;/h3>&lt;p>Menambahkan titik $P$ sebanyak $k$ kali disebut perkalian skalar, dan dilambangkan sebagai $kP$.
&lt;/p>
$$ kP = \underbrace{P + P + \dots + P}_{k \text{ kali}} $$
&lt;p>Di sini, $k$ adalah bilangan bulat yang sangat besar (misalnya bilangan bulat 256-bit).&lt;/p>
&lt;h3 id="52-masalah-logaritma-diskret-kurva-eliptik-ecdlp">5.2. Masalah Logaritma Diskret Kurva Eliptik (ECDLP)
&lt;/h3>&lt;p>Keamanan kriptografi kurva eliptik bergantung pada kesulitan masalah berikut.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Masalah Logaritma Diskret Kurva Eliptik (Elliptic Curve Discrete Logarithm Problem: ECDLP)&lt;/strong>
Diberikan sebuah titik $P$ (base point) yang diketahui, dan sebuah titik hasil $Q$, temukan skalar $k$ sedemikian rupa sehingga memenuhi $Q = kP$.&lt;/p>
&lt;/blockquote>
&lt;p>Menghitung $Q$ dari $k$ dan $P$ (arah maju) adalah mudah (waktu polinomial) menggunakan algoritma yang dijelaskan di bawah ini, tetapi menghitung balik $k$ dari $P$ dan $Q$ (arah mundur) hampir tidak mungkin tanpa pencarian brute-force (fungsi satu arah).
Dalam protokol kriptografi, &lt;strong>$k$ berkorespondensi dengan &amp;ldquo;kunci privat&amp;rdquo; dan $Q$ dengan &amp;ldquo;kunci publik&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;h3 id="53-algoritma-double-and-add">5.3. Algoritma Double-and-Add
&lt;/h3>&lt;p>Ketika $k$ adalah angka yang sangat besar (misalnya: $2^{256}$), menjumlahkan $P$ secara naif sebanyak $k$ kali tidak akan selesai bahkan jika umur alam semesta telah habis. Oleh karena itu, metode &lt;strong>Double-and-Add (Metode Biner)&lt;/strong> digunakan untuk melakukan perkalian skalar dengan kecepatan tinggi.&lt;/p>
&lt;p>Ini adalah versi kurva eliptik dari &amp;ldquo;exponentiation by squaring&amp;rdquo; yang dengan cepat menghitung pangkat bilangan bulat. Skalar $k$ direpresentasikan dalam biner, dan diproses secara berurutan mulai dari bit paling signifikan.&lt;/p>
&lt;ol>
&lt;li>Inisialisasi titik $R$ yang menyimpan hasil dengan $\mathcal{O}$.&lt;/li>
&lt;li>Ulangi yang berikut ini dari bit paling signifikan hingga bit paling tidak signifikan dari $k$:
&lt;ul>
&lt;li>Gandakan $R$ (Point Doubling: $R = 2R$)&lt;/li>
&lt;li>Jika bit saat ini adalah &lt;code>1&lt;/code>, tambahkan $P$ ke $R$ (Point Addition: $R = R + P$)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>Dengan algoritma ini, kompleksitas waktu berkurang secara drastis dari $O(k)$ menjadi $O(\log_2 k)$, dan memungkinkan perhitungan dalam waktu yang realistis (dalam hitungan milidetik).&lt;/p>
&lt;hr>
&lt;h2 id="6-pertukaran-kunci-elliptic-curve-diffie-hellman-ecdh">6. Pertukaran Kunci Elliptic Curve Diffie-Hellman (ECDH)
&lt;/h2>&lt;p>Di sini, kami akan menjelaskan cara kerja &lt;strong>protokol pertukaran kunci ECDH (Elliptic Curve Diffie-Hellman)&lt;/strong>, yang merupakan contoh aplikasi ECC paling representatif. ECDH adalah mekanisme bagi Alice dan Bob untuk dengan aman menghasilkan dan membagikan kunci rahasia bersama (kunci sesi) melalui saluran komunikasi yang rentan penyadapan (ini adalah inti dari TLS handshake).&lt;/p>
&lt;p>&lt;strong>【Parameter Prasyarat (Parameter Domain)】&lt;/strong>
Keduanya berbagi terlebih dahulu kurva eliptik $E$, bilangan prima $p$, dan titik basis $G$ yang akan digunakan. (Misalnya NIST P-256 atau secp256k1)&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant Alice as "Alice"
participant Bob as "Bob"
Note over Alice,Bob: "Parameter publik: Kurva E, Titik Basis G, Bilangan Prima p"
Alice->>Alice: "Hasilkan Kunci Privat d_A (bilangan bulat acak)"
Alice->>Alice: "Hitung Kunci Publik Q_A = d_A * G"
Bob->>Bob: "Hasilkan Kunci Privat d_B (bilangan bulat acak)"
Bob->>Bob: "Hitung Kunci Publik Q_B = d_B * G"
Alice->>Bob: "Kirim Kunci Publik Q_A (plaintext)"
Bob->>Alice: "Kirim Kunci Publik Q_B (plaintext)"
Alice->>Alice: "Hitung Rahasia Bersama S = d_A * Q_B"
Bob->>Bob: "Hitung Rahasia Bersama S = d_B * Q_A"
Note over Alice,Bob: "S = d_A * (d_B * G) = d_B * (d_A * G) = (d_A * d_B) * G"
Note over Alice,Bob: "Hasil perhitungan S dari keduanya benar-benar cocok!"&lt;/div>
&lt;p>Penyadap (Eve) dapat mencegat $G$, $Q_A$, dan $Q_B$ yang mengalir di jalur komunikasi, namun karena kesulitan ECDLP, tidak mungkin menemukan kunci privat $d_A$ milik Alice dari $Q_A = d_A \cdot G$. Selain itu, mengalikan $Q_A$ dan $Q_B$ tidak akan menghasilkan kunci bersama $S$, sehingga penyadap tidak dapat menghitung $S$.&lt;/p>
&lt;hr>
&lt;h2 id="7-jebakan-implementasi-serangan-saluran-samping-side-channel-attack-dan-penanggulangannya">7. Jebakan Implementasi: Serangan Saluran Samping (Side-Channel Attack) dan Penanggulangannya
&lt;/h2>&lt;p>Bahkan algoritma kriptografi yang sempurna secara teoritis dapat memiliki kerentanan yang muncul dalam proses implementasinya sebagai program. Itulah yang disebut &lt;strong>&amp;ldquo;Serangan Saluran Samping (Side-Channel Attack)&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;h3 id="71-serangan-waktu-timing-attack">7.1. Serangan Waktu (Timing Attack)
&lt;/h3>&lt;p>Mari kita lihat kembali algoritma Double-and-Add yang telah dijelaskan sebelumnya.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Pseudocode dari Double-and-Add yang rentan
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">Point&lt;/span> &lt;span class="n">R&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">Infinity&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">255&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">--&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">R&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">PointDoubling&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// Selalu dieksekusi
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">bit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">R&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">PointAddition&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// Hanya dieksekusi ketika bit adalah 1!
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Implementasi ini memiliki cacat yang fatal. Karena Point Addition dieksekusi saat bit adalah &lt;code>1&lt;/code>, &lt;strong>waktu komputasi menjadi sedikit lebih lama&lt;/strong> daripada saat bit adalah &lt;code>0&lt;/code>. Selain itu, prediski percabangan prosesor dan perilaku memori cache juga berubah.
Dengan mengamati perbedaan kecil dalam waktu komputasi (atau konsumsi daya) ribuan kali secara statistik, penyerang dapat &lt;strong>sepenuhnya memulihkan rangkaian bit kunci privat $k$ bit demi bit&lt;/strong>. Inilah yang disebut serangan waktu (timing attack).&lt;/p>
&lt;h3 id="72-implementasi-constant-time-montgomery-ladder">7.2. Implementasi Constant-Time: Montgomery Ladder
&lt;/h3>&lt;p>Untuk mencegah serangan waktu, perlu mengadopsi algoritma yang memiliki &lt;strong>urutan instruksi yang dieksekusi dan waktu komputasi yang selalu konstan (Constant-Time), terlepas dari nilai bit kunci privat&lt;/strong>.&lt;/p>
&lt;p>Contoh utamanya adalah &lt;strong>Montgomery Ladder&lt;/strong>.&lt;/p>
&lt;div class="mermaid">graph TD
Start["Inisialisasi: R0 = O, R1 = P"] --> LoopStart["Untuk setiap bit i (dari bit paling signifikan)"]
LoopStart --> Cond{"Berapa nilai k_i?"}
Cond -->|0| Branch0["R1 = R0 + R1&lt;br>R0 = 2 * R0"]
Cond -->|1| Branch1["R0 = R0 + R1&lt;br>R1 = 2 * R1"]
Branch0 --> LoopEnd["Pindah ke bit selanjutnya"]
Branch1 --> LoopEnd
LoopEnd --> LoopStart
LoopStart -.->|"Semua bit selesai"| End["Akhir: R0 adalah hasilnya (kP)"]&lt;/div>
&lt;p>Keindahan dari Montgomery Ladder adalah, terlepas dari bit yang bernilai &lt;code>0&lt;/code> atau &lt;code>1&lt;/code>, &lt;strong>&amp;ldquo;selalu 1 kali Point Addition dan 1 kali Point Doubling&amp;rdquo;&lt;/strong> yang dieksekusi. Hal ini sepenuhnya menghilangkan ketergantungan data dari waktu komputasi.&lt;/p>
&lt;p>Namun, jika percabangan (&lt;code>if (k_i == 0)&lt;/code>) itu sendiri ada, masih ada risiko bahwa waktu eksekusi berfluktuasi karena optimasi compiler dan prediksi percabangan CPU. Oleh karena itu, dalam implementasi Constant-Time yang sebenarnya, percabangan kondisional (pernyataan &lt;code>if&lt;/code>) dihilangkan, dan &lt;strong>pertukaran bersyarat (Conditional Swap) menggunakan operasi bit&lt;/strong> digunakan.&lt;/p>
&lt;hr>
&lt;h2 id="8-implementasi-kriptografi-kurva-eliptik-dalam-c">8. Implementasi Kriptografi Kurva Eliptik dalam C++
&lt;/h2>&lt;p>Mulai dari sini, kita akan mengubah teori menjadi kode C++. Pustaka kriptografi praktis (seperti OpenSSL dan libsodium) menggunakan optimasi assembly tingkat lanjut dan sistem koordinat Jacobian, tetapi di sini untuk memperdalam pemahaman matematika, kami menunjukkan kerangka dari &lt;strong>implementasi Constant-Time yang mudah dipahami menggunakan sistem koordinat afinitas&lt;/strong>.&lt;/p>
&lt;p>Kami asumsikan penggunaan &lt;code>boost::multiprecision::cpp_int&lt;/code> untuk perhitungan bilangan bulat raksasa.&lt;/p>
&lt;h3 id="81-operasi-modulo-dan-invers">8.1. Operasi Modulo dan Invers
&lt;/h3>&lt;p>Pertama, kita definisikan fungsi bantuan untuk operasi pada lapangan berhingga. Kita akan mengimplementasikan perhitungan invers menggunakan Teorema Kecil Fermat.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;vector&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdexcept&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;boost/multiprecision/cpp_int.hpp&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="k">namespace&lt;/span> &lt;span class="n">boost&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">multiprecision&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Sebagai contoh p dan parameter secp256k1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="nf">p&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Operasi modulo yang mengembalikan sisa positif
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="nf">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nl">m&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Perhitungan eksponensial modulo (x^y mod m)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="nf">powerMod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">exp&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">base&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">exp&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">exp&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">res&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">base&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exp&lt;/span> &lt;span class="o">/=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">res&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Invers modulo menggunakan Teorema Kecil Fermat
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="nf">modInverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Asumsikan bahwa m adalah bilangan prima: n^(m-2) ≡ n^(-1) mod m
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="n">powerMod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="82-representasi-titik-dan-operasi-grup-penambahan-dan-penggandaan">8.2. Representasi Titik dan Operasi Grup (Penambahan dan Penggandaan)
&lt;/h3>&lt;p>Kita definisikan struktur &lt;code>Point&lt;/code> yang mengelola titik di tak terhingga dengan sebuah flag, beserta implementasi rumus penambahan.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">Point&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">bool&lt;/span> &lt;span class="n">isInfinity&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Menghasilkan titik di tak terhingga
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">isInfinity&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">true&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Menghasilkan titik biasa
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">isInfinity&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">false&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Penambahan titik pada kurva eliptik (R = P + Q)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">Point&lt;/span> &lt;span class="nf">pointAdd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">isInfinity&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">isInfinity&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// P + (-P) = Titik di tak terhingga
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">lambda&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Point Doubling (Kasus P = Q)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// lambda = (3x^2 + a) / 2y
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">den&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">modInverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lambda&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">den&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Point Addition (Kasus P != Q)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// lambda = (y2 - y1) / (x2 - x1)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">den&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">modInverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lambda&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">den&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">x3&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lambda&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">lambda&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">y3&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lambda&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">x3&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y3&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="83-implementasi-conditional-swap-constant-time">8.3. Implementasi Conditional Swap Constant-Time
&lt;/h3>&lt;p>Saat menukar isi variabel berdasarkan nilai bit dari kunci privat, penukaran dilakukan hanya dengan operasi bit (masking) tanpa menggunakan pernyataan &lt;code>if&lt;/code>. Hal ini membuat alur eksekusi menjadi benar-benar konstan.&lt;/p>
&lt;blockquote>
&lt;p>[!TIP]
Pada implementasi aslinya, kelas integer multipresisi yang dialokasikan secara dinamis seperti &lt;code>cpp_int&lt;/code> tidak cocok untuk pemrosesan Constant-Time. Pasalnya, informasi waktu bocor karena fluktuasi alokasi memori dan ukuran array. Di perpustakaan praktis, algoritma direpresentasikan dalam panjang tetap (misal array uint64_t × 4 elemen), dan memproses masking pada level bit. Berikut adalah contoh konseptual.&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Konseptual Constant-Time Swap (Asumsikan panjang bilangan bulat tetap)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Jika bit adalah 1 maka P1 dan P2 akan ditukar, dan jika 0 maka tidak ditukar
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">void&lt;/span> &lt;span class="nf">cswap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Point&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">P1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">P2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">uint8_t&lt;/span> &lt;span class="n">bit&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// bit adalah 0 atau 1. Masker bit=1 adalah semua bit 1(0xFF..), bit 0 adalah semua bit 0.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// (Di sini untuk penjelasan, mari kita asumsikan setiap kata dari kelas BigInt panjang tetap sebagai w)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="cm">/*
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> uint64_t mask = 0 - (uint64_t)bit;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> for (int i = 0; i &amp;lt; NUM_WORDS; i++) {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> uint64_t dummy = mask &amp;amp; (P1.x.words[i] ^ P2.x.words[i]);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> P1.x.words[i] ^= dummy;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> P2.x.words[i] ^= dummy;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> // Koordinat y dan flag isInfinity juga diproses dengan cara yang sama
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ※ Swap constant-time yang sempurna dengan boost::multiprecision sulit dilakukan,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Di sini kita batasi pada simulasi dengan percabangan demi memahami logikanya.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">bit&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">P1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">P2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="84-perkalian-skalar-dengan-montgomery-ladder">8.4. Perkalian Skalar dengan Montgomery Ladder
&lt;/h3>&lt;p>Menggabungkan &lt;code>pointAdd&lt;/code> dan &lt;code>cswap&lt;/code> di atas, kita mengimplementasikan perkalian skalar yang aman.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Perkalian skalar k * P (Metode Montgomery Ladder)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">Point&lt;/span> &lt;span class="nf">scalarMultiply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">k&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Point&lt;/span> &lt;span class="n">R0&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// Titik di tak terhingga
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">Point&lt;/span> &lt;span class="n">R1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Dapatkan panjang bit k (untuk secp256k1 adalah 256 bit)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">numBits&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">256&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">numBits&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">--&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Dapatkan nilai bit ke-i (0 atau 1)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint8_t&lt;/span> &lt;span class="n">bit&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">static_cast&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint8_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bit_test&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Jika bit == 1, tukar R0 dan R1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cswap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">R1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">bit&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Selalu eksekusi operasi yang sama (Point Addition dan Point Doubling)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">R1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pointAdd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">R1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">R0&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pointAdd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">R0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Jika bit == 1, tukar lagi untuk mengembalikan keadaan seperti semula
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cswap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">R1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">bit&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">R0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Dengan logika implementasi ini, terlepas dari apakah masing-masing bit skalar $k$ adalah &lt;code>0&lt;/code> atau &lt;code>1&lt;/code>, operasi yang dieksekusi dalam setiap iterasi perulangan (&lt;code>cswap&lt;/code> $\to$ &lt;code>pointAdd&lt;/code> $\to$ &lt;code>pointAdd&lt;/code> $\to$ &lt;code>cswap&lt;/code>) akan memiliki alur yang persis sama, dengan kuat mencegah kebocoran informasi rahasia melalui waktu atau perbedaan dalam pola akses cache.&lt;/p>
&lt;hr>
&lt;h2 id="9-kesimpulan">9. Kesimpulan
&lt;/h2>&lt;p>Kriptografi kurva eliptik (ECC) mungkin tampak aneh pada pandangan pertama dengan bertanya-tanya, &amp;ldquo;Mengapa operasi geometris seperti menggambar garis lurus dan memantulkan titik persimpangan dapat menjadi kriptografi?&amp;rdquo;. Namun, dengan memetakannya ke dunia diskrit dari lapangan berhingga, ini adalah produk perpaduan yang ajaib antara matematika dan kriptografi, yang memungkinkan kita membangun fungsi satu arah yang mengesankan (masalah logaritma diskret).&lt;/p>
&lt;p>Dalam artikel ini, kami menjelaskan poin-poin penting berikut:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Keunggulan terhadap RSA&lt;/strong>: Memberikan keamanan kuat dengan panjang kunci yang jauh lebih pendek, sangat cocok untuk era perangkat seluler dan IoT modern.&lt;/li>
&lt;li>&lt;strong>Dasar-dasar Teori Grup dan Lapangan Berhingga&lt;/strong>: Struktur matematika yang mendasari ECC.&lt;/li>
&lt;li>&lt;strong>Rumus Penambahan dan Penggandaan&lt;/strong>: Metode untuk mengimplementasikan operasi grup aljabar menggunakan persamaan Weierstrass.&lt;/li>
&lt;li>&lt;strong>Ancaman Serangan Saluran Samping (Side-Channel Attack)&lt;/strong>: Bagaimana percabangan kondisional yang bergantung pada bit kunci privat menghasilkan kerentanan yang fatal.&lt;/li>
&lt;li>&lt;strong>Implementasi Constant-Time&lt;/strong>: Teknik pengkodean C++ yang menggunakan Montgomery Ladder dan Conditional Swap untuk menyeragamkan perilaku tingkat perangkat keras dan mencegah serangan.&lt;/li>
&lt;/ol>
&lt;p>Membuat perpustakaan kriptografi Anda sendiri yang sebenarnya berjalan di lingkungan produksi sangat tidak disarankan (&amp;ldquo;Don&amp;rsquo;t roll your own crypto&amp;rdquo;) karena risiko keamanannya sangat tinggi. Namun, pemahaman mendalam tentang algoritma dan latar belakang matematika yang beroperasi di dalamnya harus menjadi senjata yang sangat berharga bagi insinyur yang merancang dan mengoperasikan sistem yang lebih aman dan berkinerja tinggi.&lt;/p>
&lt;p>Pada artikel berikutnya, kami ingin menggali lebih dalam tentang mekanisme &lt;strong>ECDSA (Elliptic Curve Digital Signature Algorithm)&lt;/strong>, yaitu algoritma tanda tangan digital menggunakan kurva eliptik ini, serta &lt;strong>Tanda Tangan Schnorr&lt;/strong> yang diadopsi pada Bitcoin.&lt;/p></description></item></channel></rss>