Buat pasangan kunci RSA di browser, enkripsi dan dekripsi dengan RSA-OAEP, tanda tangani dengan RSA-PSS atau PKCS#1 v1.5, dan konversi kunci di antara format PEM SPKI, PKCS#8, dan PKCS#1. Semuanya berjalan secara lokal dengan mesin WebCrypto — tidak ada kunci atau pesan yang meninggalkan halaman ini.
Untuk apa RSA: pesan dan tanda tangan kecil, bukan data besar. RSA mengenkripsi paling banyak k−2·hashLen−2 byte per panggilan (190 byte untuk kunci 2048-bit dengan SHA-256) dan sekitar 1000× lebih lambat dari AES. Sistem nyata menggunakan enkripsi hibrida: RSA membungkus kunci AES acak, AES mengenkripsi data (lihat alat AES). Halaman ini ada untuk pembelajaran, pengujian, dan pemeriksaan interop.
1. Buat pasangan kunci(WebCrypto, lokal; keempat format PEM dihasilkan bersamaan)
Ukuran modulus:
Kunci publik — SPKI(-----BEGIN PUBLIC KEY-----, format "kunci publik RSA" yang biasa)
Kunci privat — PKCS#8(-----BEGIN PRIVATE KEY-----, tidak dienkripsi; perlakukan seperti kata sandi)
Kunci privat — PKCS#1(-----BEGIN RSA PRIVATE KEY-----, format OpenSSL klasik)
Membuat kunci di browser tidak mengenkripsinya. Untuk penyimpanan, pindahkan ke brankas kunci sungguhan atau enkripsi secara offline.
2. Atau impor kunci yang sudah ada(tempel salah satu dari keempat format PEM)
3. Enkripsi / dekripsi (RSA-OAEP)- arah mengikuti kunci saat ini: publik = enkripsi, privat = dekripsi
Hash:Label:
Enkripsi PKCS#1 v1.5 sengaja tidak diimplementasikan: ia tidak memiliki integritas ciphertext dan jatuh ke serangan padding-oracle (Bleichenbacher). OAEP adalah satu-satunya mode enkripsi yang harus digunakan desain baru.
4. Tanda tangani (memerlukan kunci privat)- PSS (acak, modern) atau PKCS#1 v1.5 (deterministik, kompatibel dengan versi lama)
Skema:Hash:
5. Verifikasi (memerlukan kunci publik)- tempel pesan dan tanda tangannya
Skema:Hash:
Berapa banyak yang dapat dibawa satu panggilan RSA?Batas pesan OAEP = byte kunci − 2×byte hash − 2:
Modulus
SHA-256
SHA-384
SHA-512
1024-bit
62 byte
30 byte
0 byte
2048-bit
190 byte
126 byte
62 byte
3072-bit
318 byte
254 byte
190 byte
4096-bit
446 byte
382 byte
318 byte
Tanda tangan tidak memiliki batas pesan — pesan di-hash terlebih dahulu; tanda tangan itu sendiri selalu tepat sebesar ukuran kunci (256 byte untuk 2048-bit).
Kekuatan dan masa berlaku kunci(NIST SP 800-57 Bagian 1 Rev. 5): 1024-bit tidak diizinkan untuk penggunaan baru sejak 2013; 2048-bit adalah minimum saat ini dan tetap dapat diterima hingga 2030; 3072-bit ke atas adalah pilihan yang nyaman untuk 2031+. 8192-bit berfungsi di sini tetapi pembuatannya dapat memakan waktu satu menit atau lebih di browser dan memberikan keamanan yang saat ini tidak dibutuhkan siapa pun — lebih baik pilih 3072/4096.
Interop OpenSSL — PEM yang dihasilkan halaman ini dapat di-roundtrip di baris perintah: openssl pkeyutl -encrypt -pubin -inkey pub.pem -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256 openssl pkeyutl -decrypt -inkey priv.pem -pkeyopt rsa_padding_mode:oaep ... openssl dgst -sha256 -sign priv.pem -out msg.sig msg.txt (PKCS#1 v1.5) / openssl dgst -sha256 -verify pub.pem -signature msg.sig msg.txt
PSS: tambahkan -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 ke kedua panggilan dgst. Konversi format kunci: openssl rsa -in key.pem -RSAPublicKey -out pubkey.pem melakukan SPKI ↔ PKCS#1 di disk; halaman ini melakukannya di browser.
Uji mandiri Menjalankan mesin halaman terhadap jangkar independen: pembuatan kunci pada tiga ukuran modulus, roundtrip enkripsi/dekripsi OAEP, tanda tangan/verifikasi PSS dan PKCS#1 v1.5 di berbagai hash, sebuah vektor tanda tangan v1.5 deterministik byte demi byte (dibuat oleh implementasi native independen), ciphertext OAEP tetap dan tanda tangan PSS yang dibuat oleh OpenSSL yang harus didekripsi/diverifikasi halaman ini (interop lintas-implementasi), roundtrip konversi format PEM, dan uji negatif (tanda tangan yang dimanipulasi, kunci yang salah harus gagal). Tidak ada yang dikirim ke mana pun.
Enkripsi dan tanda tangan RSA dijelaskan dari awal
Dalam satu kalimat: RSA adalah kriptografi kunci publik — siapa pun dapat mengenkripsi untuk Anda dengan kunci publik atau memverifikasi tanda tangan Anda, tetapi hanya kunci privat yang dapat mendekripsi atau menandatangani — dan keamanannya bertumpu pada fakta bahwa memfaktorkan bilangan 2048-bit menjadi dua bilangan prima berada di luar jangkauan komputer mana pun yang ada.
Apa yang sebenarnya dihitung RSA
Dua bilangan prima dan pintu jebak. Kunci RSA dimulai sebagai dua bilangan prima acak besar p dan q; hasil kalinya n (modulus, karena itu disebut "kunci 2048-bit") dipublikasikan dalam kunci publik bersama eksponen e (hampir selalu 65537). Kunci privat adalah pasangan d, invers modular dari e − dihitung dari p dan q — ditambah jalan pintas yang diturunkan dari bilangan prima yang mempercepat operasi kunci privat hingga 4×.
Enkripsi dan penandatanganan adalah eksponensiasi yang sama. Mengenkripsi blok pesan m berarti menghitung me mod n; mendekripsi adalah cd mod n. Menandatangani blok yang sudah diformat dengan eksponen privat dan memverifikasinya dengan yang publik adalah operasi yang sama dalam arah sebaliknya. Semua yang lain di halaman ini — OAEP, PSS, PKCS#1 — adalah tentang memformat blok itu dengan aman agar eksponensiasi mentah tidak pernah terbuka.
Mengapa lambat. Satu operasi RSA pada kunci 2048-bit memakan CPU sekitar sejuta kali lebih banyak daripada mengenkripsi satu blok dengan AES. Itulah sebabnya TLS menggunakan RSA (atau ECC) hanya untuk menyepakati kunci AES acak, lalu beralih. Aturan yang sama berlaku untuk apa pun yang Anda bangun: RSA untuk kunci, AES untuk data.
Ukuran kunci. Panjang modulus adalah tuas keamanan: 1024-bit sudah dianggap tidak aman menurut kebijakan (pemfaktoran berada dalam jangkauan negara-negara besar), 2048-bit ≈ kekuatan simetris 112-bit, 3072-bit ≈ 128-bit, 15360-bit akan setara dengan kunci simetris 256-bit. Catatan pasca-kuantum: algoritma Shor memecahkan RSA sepenuhnya pada komputer kuantum besar — satu alasan lagi untuk menjaga masa berlaku kunci tetap terbatas.
OAEP: satu-satunya padding enkripsi yang harus Anda gunakan
Masalah RSA mentah. RSA buku teks (me mod n pada pesan mentah) bersifat deterministik dan dapat dimanipulasi: pesan yang sama dienkripsi dengan cara yang sama, seorang penyerang dapat mengalikan ciphertext dengan enkripsi dari 2 agar plaintext menjadi dua kali lipat, dan pesan pendek jatuh ke serangan meet-in-the-middle. Ini tidak boleh pernah digunakan secara langsung.
Apa yang dilakukan OAEP. OAEP (PKCS#1 v2, RFC 8017) mencampur pesan dengan benih acak melalui jaringan Feistel berbasis hash sebelum eksponensiasi. Hasilnya: enkripsi bersifat acak (plaintext yang sama menghasilkan ciphertext yang berbeda setiap kali — jalankan Sampel OAEP dua kali dan bandingkan), manipulasi terdeteksi saat dekripsi, dan pesan harus muat di dalam modulus dengan ruang untuk hash — batas k−2·hashLen−2 yang ditabulasikan di atas.
Label. String publik opsional yang diikat ke dalam padding. Kedua sisi harus memberikan label yang sama persis atau dekripsi gagal — seperti AAD di AES-GCM, ia memungkinkan Anda mengikat ciphertext ke konteks (nama berkas, id algoritma). Kosong adalah hal yang normal.
Enkripsi PKCS#1 v1.5 sengaja tidak ada. Padding dari era 1993 itu tidak memiliki integritas dan membocorkan informasi melalui perilaku kesalahan dekripsi (serangan Bleichenbacher 1998 mengubah padding oracle menjadi dekripsi penuh dengan beberapa juta ciphertext buatan; ia masih memecahkan sistem nyata sebagai ROBOT, 2017). WebCrypto menolak untuk mengimplementasikannya; halaman ini juga.
Tanda tangan PSS vs PKCS#1 v1.5
Tanda tangan = hash, lalu padding, lalu eksponensiasi. Kedua skema menghash pesan (SHA-256/384/512 di sini), memformat digest menjadi sebuah blok, dan menerapkan eksponen privat. Verifikasi memformat ulang blok dengan kunci publik dan membandingkannya. Perbedaannya ada pada pemformatannya:
Skema
Isi blok
Properti
RSASSA-PKCS1-v1_5
digest + header digest-info, deterministik
Setiap tanda tangan dari pesan yang sama identik byte demi byte (periksa self-test: vektor v1.5-nya tetap). Dukungan lama yang universal: sertifikat X.509, JWT RS*, TLS sebelum 1.3. Tidak ada pemalsuan yang diketahui jika verifikasi diimplementasikan dengan benar.
RSA-PSS
digest + salt acak sepanjang hash, masking MGF1
Acak — setiap tanda tangan berbeda. Aman secara terbukti dalam model random-oracle; diwajibkan dalam sertifikat TLS 1.3 dan protokol yang lebih baru. Pemverifikasi harus mengetahui panjang salt (halaman ini menggunakan panjang hash, default yang umum).
Mana yang dipilih. Desain baru: PSS. Interop dengan sertifikat yang ada, JWT (RS256), atau peer lama: v1.5. Keduanya aman sebagai skema tanda tangan — kisah bencana v1.5 menyangkut padding *enkripsi*, konstruksi yang berbeda meskipun namanya mirip.
PKCS#1 vs PKCS#8 vs SPKI: mengapa kunci yang sama memiliki empat PEM
PEM hanyalah DER yang dibungkus base64. Berkas PEM adalah label ditambah base64 dari struktur DER (ASN.1 biner). Label memberi tahu struktur yang mana — dan itulah seluruh perbedaan antara keempat format yang dihasilkan halaman ini:
Label PEM
Struktur DER
Berisi
-----BEGIN PUBLIC KEY-----
SubjectPublicKeyInfo (SPKI)
OID algoritma + kunci publik (n, e). "Kunci publik" bawaan di mana-mana.
-----BEGIN RSA PUBLIC KEY-----
PKCS#1 RSAPublicKey
Hanya (n, e). OpenSSL lama dan beberapa tumpukan tertanam.
-----BEGIN PRIVATE KEY-----
PKCS#8 PrivateKeyInfo
OID algoritma + kunci privat. Wadah yang tidak bergantung algoritma, bawaan modern.
-----BEGIN RSA PRIVATE KEY-----
PKCS#1 RSAPrivateKey
n, e, d, p, q, …. Keluaran genrsa OpenSSL klasik.
Kunci sama, pembungkus berbeda. Keempat kotak di atas setelah Buat berisi pasangan kunci yang sama — SPKI dan PKCS#1 publik berisi n, e yang identik; PKCS#8 dan PKCS#1 privat berisi nilai privat yang identik. Halaman ini mengonversi di antara keduanya tanpa kehilangan di peramban (self-test-nya melakukan roundtrip konversi). Mencampuradukkan format adalah penyebab paling umum dari kesalahan "kunci tidak valid" saat menempelkan kunci di antara alat.
PEM terenkripsi (-----BEGIN ENCRYPTED PRIVATE KEY-----) adalah PKCS#8 dengan lapisan enkripsi berbasis kata sandi. Halaman ini tidak menerimanya — dekripsi secara offline (openssl pkcs8 -in enc.pem -out plain.pem) terlebih dahulu.
Kesalahan umum
Mengenkripsi data besar dengan RSA. Di luar batas ukuran OAEP yang ketat, ini sangat lambat. Polanya: buat kunci AES acak, enkripsi kunci AES dengan RSA-OAEP, enkripsi data dengan AES-GCM, kirim kedua bagian.
Mengirim kunci privat karena "ini hanya tes". Kunci contoh yang tertanam dalam vektor halaman ini dipublikasikan dengan sengaja — mereka hanya dapat menandatangani data uji. Kunci Anda tidak seperti itu.
Memverifikasi dengan kunci privat. Biasanya "berfungsi" secara matematis dan beberapa alat mengizinkannya, tetapi mendistribusikan kunci privat kepada pemverifikasi menggagalkan seluruh model. Verifikasi dengan kunci publik (halaman ini menegakkannya).
Membandingkan tanda tangan byte demi byte untuk memeriksa kode. PSS (dan OAEP) bersifat acak: dua eksekusi yang benar menghasilkan keluaran yang berbeda. Bandingkan dengan memverifikasi, bukan dengan kesamaan — hanya tanda tangan v1.5 yang deterministik.
Kunci 1024-bit "karena lebih cepat". Mereka juga berada dalam jangkauan pemfaktoran yang didanai dengan baik. Argumen kecepatan mati bersama enkripsi hibrida: RSA berjalan sekali per sesi, bukan per byte.
Mengodekan panjang salt selain panjang hash untuk PSS. Pemverifikasi harus sepakat; panjang hash (pilihan halaman ini dan -sigopt rsa_pss_saltlen:32 OpenSSL) adalah default yang dapat diinteroperasikan.
FAQ
Mengapa dekripsi gagal dengan "kunci salah, hash salah, atau ciphertext rusak"? Dekripsi OAEP gagal ketika salah satu dari: itu bukan kunci privat yang cocok, hash berbeda dari sisi enkripsi, label berbeda, atau satu byte ciphertext berubah. Pesan kesalahannya sengaja sama untuk semua kasus — mengungkap pemeriksaan mana yang gagal adalah kebocoran padding-oracle itu sendiri.
Bisakah kunci publik diperoleh dari kunci privat? Bisa — format privat juga berisi n dan e. Halaman ini menampilkan keduanya setelah Buat; OpenSSL melakukannya dengan openssl pkey -in priv.pem -pubout.
Mengapa 65537 sebagai eksponen? Ia bilangan prima, hanya memiliki dua bit 1 (eksponensiasi cepat), dan cukup besar untuk menghindari serangan eksponen rendah yang menyerang e=3. Ia telah menjadi pilihan standar sejak 1990-an; eksponen "aneh" biasanya berarti kunci yang lemah atau tidak standar.
Apakah RSA sudah mati karena komputer kuantum? Belum — tidak ada mesin yang dapat menjalankan algoritma Shor pada modulus 2048-bit. Tetapi data yang harus tetap rahasia hingga 2030-an sudah mulai dimigrasikan; skema hibrida PQC adalah jawaban rekayasanya.
Bagaimana dengan openssl rsautl? Ia adalah pendahulu yang sudah usang dari pkeyutl. Secara bawaan ia menggunakan padding enkripsi v1.5 — satu alasan lagi mengapa ia dipensiunkan.