McEliece dan Rust: Merayap Perlahan Menuju Standar NIST untuk PQC

May 08 2023
Kita hidup di dunia yang didominasi oleh perusahaan besar (dan tak berwajah), tetapi individulah yang sering membangun dunia informasi kita. Salah satunya adalah Robert J.
Foto oleh Nerene Grobler di Unsplash

Kita hidup di dunia yang didominasi oleh perusahaan besar (dan tak berwajah), tetapi individulah yang sering membangun dunia informasi kita. Salah satunya adalah Robert J. McEliece, dan meninggal dunia pada Mei 2019 pada usia 76 tahun. Saat mengerjakan berbagai proyek terkait luar angkasa, dia berkontribusi di banyak bidang termasuk transmisi dan penyimpanan informasi. Robert akhirnya dianugerahi Penghargaan Claude E. Shannon untuk karyanya, dan memberikan banyak ceramah yang mengesankan:

Dan:

Pekerjaannya yang paling terkenal adalah seputar kode koreksi kesalahan, termasuk di dalam kode konvolusi, dan sekarang karyanya menimbulkan perhatian besar dalam menciptakan sistem enkripsi yang kuat terhadap komputer kuantum.

Dia bekerja

Banyak metode kunci publik kami didasarkan pada logaritma diskrit dan dibangun di atas teori yang dibuat oleh John Napier. Bitcoin, Tor, smart card, Wif-fi, dan banyak aplikasi lainnya menggunakan logaritma diskrit. Tetapi metode ini, dan metode kunci publik lainnya, berisiko dari komputer kuantum. Salah satu pesaingnya adalah metode Kriptografi McEliece.

Dalam sebuah pelajaran untuk peneliti modern mana pun, hanya dalam dua halaman, Robert McEliece, pada tahun 1978, menguraikan metode enkripsi kunci publik berdasarkan Pengodean Aljabar — sekarang dikenal sebagai metode Kriptografi McEliece [ paper ][1 ] . Ini adalah metode enkripsi asimetris (dengan kunci publik dan kunci pribadi), dan, pada saat itu, tampaknya menjadi pesaing serius untuk metode pintu jebakan. Sayangnya, RSA menjadi King of the Hill, dan metode McEliece didorong ke ujung antrean untuk para desainer.

Itu pada dasarnya telah melayang selama hampir 40 tahun. Namun, seiring dimulainya era komputer kuantum, hal itu sekarang sedang dipertimbangkan kembali, karena dianggap kebal terhadap serangan menggunakan algoritme Shor [ di sini ].

NIST sekarang telah mulai beralih ke metode kuat kuantum dengan makalah yang menguraikan persyaratan untuk metode kriptografi baru, karena komputer kuantum skala besar akan merusak sebagian besar sistem kunci publik yang tersedia saat ini, termasuk RSA dan metode logaritma diskrit. Enkripsi kunci publik secara keseluruhan paling sering digunakan untuk melindungi kunci rahasia yang digunakan dalam enkripsi simetris dan untuk membuktikan identitas. Pelanggaran kunci publik skala besar akan menyebabkan kurangnya kepercayaan di Internet untuk entitas yang diretas.

Pesaing utama untuk metode kuat kuantum adalah:

  • Kriptografi berbasis kisi — Klasifikasi ini menunjukkan potensi besar dan mengarah ke kriptografi baru, seperti untuk enkripsi homomorfik penuh [ di sini ] dan penyamaran kode. Sebuah contoh diberikan pada bagian berikut.
  • Kriptografi berbasis kode — Metode ini dibuat pada tahun 1978 dengan sistem kriptografi McEliece tetapi hampir tidak pernah digunakan dalam aplikasi nyata. Metode McEliece menggunakan kode linier yang digunakan dalam kode koreksi kesalahan, dan melibatkan perkalian matriks-vektor. Contoh kode linear adalah kode Hamming [ disini ]
  • Kriptografi polinomial multivariat — Ini berfokus pada kesulitan penyelesaian sistem polinomial multivariat pada bidang terbatas. Sayangnya, banyak metode yang telah diusulkan telah rusak.
  • Tanda tangan berbasis hash — Ini melibatkan pembuatan tanda tangan digital menggunakan metode hashing. Kelemahannya adalah bahwa penanda tangan perlu melacak semua pesan yang telah ditandatangani dan ada batasan jumlah tanda tangan yang dapat dihasilkan.

Metode McEliece menggunakan kriptografi berbasis kode. Landasannya didasarkan pada kesulitan dalam mendekode kode linier umum dan umumnya lebih cepat daripada RSA untuk enkripsi dan dekripsi. Di dalamnya, kami memiliki metode pembangkitan kunci probabilistik, yang kemudian digunakan untuk menghasilkan kunci publik dan privat. Kunci dihasilkan dengan parameter n, k dan T.

Kunci dihasilkan dengan parameter n, k dan t. Dengan ini, kami membuat matriks kode [n,k], dan yang dapat memperbaiki kesalahan t. Dalam makalahnya, McEliece mendefinisikan n=1024, k=524, t=50, dan yang memberikan ukuran kunci publik 524x(1024–524) = 262.000 bit. Dalam contoh di atas, kami menggunakan k=1608, N=2048 dan T=40, yang memberikan ukuran kunci publik 1608x(2048–40) — 3.228.864 bit. Untuk ketangguhan kuantum, disarankan bahwa N adalah 6960, k adalah 5.412, dan t adalah 119 (memberikan ukuran kunci besar 8.373.911 bit.

Berikut ini adalah ukuran kunci turunan dan ciphertext (dalam byte) dari masing-masing metode inti [1]:

m    n      t   level | public key   secret key  ciphertext
--------------------------------------------------------------------------
mceliece348864  12  3,488    64	 1    |  261,120       6,492       128
mceliece460896  13  4,608    94	 3    |  524,160      13,608       188
mceliece6688128 13  6,688   128	 5    | 1,044,992     13,932       240
mceliece6960119 13  6,960   119  5    | 1,047,319     13,948       226
mceliece8192128 13  8,192   128  5    | 1,357,824     14,120       240

Type      Public key size (B)   Secret key size (B)  Ciphertext size (B)
------------------------------------------------------------------------
Kyber512              800              1,632                  768  Learning with errors (Lattice)
Kyber738            1,184              2,400                1,088  Learning with errors (Lattice)
Kyber1024           1,568              3,168                1,568  Learning with errors (Lattice)
LightSABER            672              1,568                  736  Learning with rounding (Lattice)
SABER                 992              2,304                1,088  Learning with rounding (Lattice)
FireSABER           1,312              3,040                1,472  Learning with rounding (Lattice)
McEliece348864    261,120              6,452                  128  Code based
McEliece460896    524,160             13,568                  188  Code based
McEliece6688128 1,044,992             13,892                  240  Code based
McEliece6960119 1,047,319             13,948                  226  Code based
McEliece8192128 1,357,824             14,120                  240  Code based
NTRUhps2048509        699                935                  699  Lattice
NTRUhps2048677        930              1,234                  930  Lattice
NTRUhps4096821      1,230              1,590                1,230  Lattice
SIKEp434              330                 44                  346  Isogeny
SIKEp503              378                 56                  402  Isogeny
SIKEp751              564                 80                  596  Isogeny
SIDH                  564                 48                  596  Isogeny

Pertama, kami membuat proyek dengan:

cargo new mce

[package]
name = "mce"
version = "0.1.0"
edition = "2021"
[dependencies]
classic-mceliece-rust = "3.0"
rand = "^0.8.5"
hex="^0.4"

use classic_mceliece_rust::{keypair, encapsulate, decapsulate};
use classic_mceliece_rust::{CRYPTO_BYTES, CRYPTO_PUBLICKEYBYTES, CRYPTO_SECRETKEYBYTES};
use hex;
fn main() {
  let mut rng = rand::thread_rng();
  let mut public_key_buf = [0u8; CRYPTO_PUBLICKEYBYTES];
  let mut secret_key_buf = [0u8; CRYPTO_SECRETKEYBYTES];
  let (public_key, secret_key) = keypair(&mut public_key_buf, &mut secret_key_buf, &mut rng);
  println!("\nBob public key (showing first 32 out of {} bytes): {:.32}", CRYPTO_PUBLICKEYBYTES,hex::encode(public_key.as_array()));
  println!("\nBob secret key (showing first 32 out of {} bytes): {:.32}",CRYPTO_SECRETKEYBYTES,hex::encode(secret_key.as_array()));
 
  let mut shared_secret_bob_buf = [0u8; CRYPTO_BYTES];
  let (ciphertext, shared_secret_bob) = encapsulate(&public_key, &mut shared_secret_bob_buf, &mut rng);
  let mut shared_secret_alice_buf = [0u8; CRYPTO_BYTES];
  let shared_secret_alice = decapsulate(&ciphertext, &secret_key, &mut shared_secret_alice_buf);
  println!("\nCiphertext (Bob to Alice) (showing {} bytes): {}",ciphertext.as_array().len(),hex::encode(ciphertext.as_array()));
  println!("\nBob key:  (showing {} bytes) {}",shared_secret_bob.as_array().len(),hex::encode(shared_secret_bob.as_array()));
  println!("\nAlice key: (showing {} bytes) {}",shared_secret_alice.as_array().len(),hex::encode(shared_secret_alice.as_array()));

}

cargo build

Bob public key (showing first 32 out of 261120 bytes): 4b44ae97d30a04f2ade8334a4817b5cc
Bob secret key (showing first 32 out of 6492 bytes): 76ac75d052f030692d334d843bc29ee7

Ciphertext (Bob to Alice) (showing 96 bytes): f40bff3d7928cd70cd1cf8a04daaacbf67168585a79fc57a28fef71203771a2d572229f29079bf6fe1713e7b3444c9badaebd7a7277ef6c88db9f02a27b3ba98b6f82743b2ba4b47d781b5fc5b7657ee10ef5d30971c2f2d2a8395898e8c2fe0

Bob key:  (showing 32 bytes) bb2853e129206f1d9e2802a5e6bd93265545b0369eb91750d799b876d870ff30

Alice key: (showing 32 bytes) bb2853e129206f1d9e2802a5e6bd93265545b0369eb91750d799b876d870ff30

kinerja McEliece

Anda akan menemukan kodenya cukup lambat, dan dapat memakan waktu beberapa detik untuk membuat kunci bersama. Ini karena McEliece jauh lebih lambat daripada Kyber untuk pembuatan kunci [ di sini ]:

Seperti yang kita lihat, McEliece 11.490 kali lebih lambat untuk pembuatan kunci dibandingkan dengan Kyber. Namun proses enkapsulasi dan dekapsulasi bekerja lebih baik, dengan kinerja 1,9 kali lebih lambat untuk enkapsulasi, dan 9,7 kali lebih lambat untuk dekapsulasi.

Kesimpulan

Kyber telah didefinisikan sebagai metode pertama yang didefinisikan sebagai metode PQC Key Exchange dan Public Key Encryption. Secara keseluruhan, ini didasarkan pada metode kisi. Ini relatif cepat untuk pembuatan kunci, enkripsi dan dekripsi, dan dengan ukuran kunci yang relatif kecil. NIST, bagaimanapun, memiliki kekhawatiran bahwa kita akan menjadi terlalu tergantung pada metode kisi, dan mencari metode lain. Ini termasuk McEliece, SEPEDA, dan HQC.

Anda dapat mengetahui lebih lanjut di sini:

https://asecuritysite.com/pqc/kem

Dan beberapa retak:

Pertukaran Kunci McEliece: Cangkang Kura-kura Sedikit Pecah, Tapi Masih Aman

Referensi

[1] McEliece, RJ (1978). Kriptosistem kunci publik berdasarkan aljabar. Pengodean Thv , 4244 , 114–116.