tools / rsa
rsa/
Enkripsi dengan kunci publik RSA dan dekripsi dengan kunci privat, atau enkripsi dengan kunci privat dan dekripsi dengan kunci publik. Padding, format kunci, format input / output, dan set karakter bisa diatur, dan kunci Anda tidak pernah keluar dari browser.
Plaintext
Kunci
Ciphertext
Riwayat
Setiap enkripsi atau dekripsi yang berhasil otomatis dicatat. Hanya 20 catatan terbaru yang disimpan, dan hanya di browser perangkat ini. Kunci tidak pernah disimpan, tetapi plaintext hasil dekripsi disimpan, jadi hapus riwayat setelah selesai jika Anda memakai komputer umum.
Apa itu AES, DES, dan RSA, dan apa bedanya
AES dan DES adalah enkripsi simetris: kunci yang sama dipakai untuk mengenkripsi dan mendekripsi, seperti satu kunci yang bisa mengunci sekaligus membuka pintu. Keduanya cepat dan cocok untuk data berukuran besar; kesulitannya ada pada cara mengirim kunci itu ke pihak lain dengan aman.
DES adalah standar lama dari tahun 1970-an dengan panjang kunci efektif hanya 56 bit. Kini perangkat keras khusus atau klaster komputer bisa membobolnya dengan brute force, jadi DES hanya cocok untuk terhubung ke sistem lama yang masih memakainya. AES menggantikan DES sebagai standar. Kuncinya 128, 192, atau 256 bit, saat ini belum ada serangan praktis terhadapnya, dan AES menjadi pilihan utama untuk mengenkripsi data.
RSA adalah enkripsi asimetris: ada sepasang kunci. Kunci publik boleh diberikan kepada siapa saja dan dipakai untuk mengenkripsi; kunci privat Anda simpan sendiri dan dipakai untuk mendekripsi, seperti kotak surat yang bisa dimasuki surat oleh siapa saja tetapi hanya Anda yang punya kuncinya. Keuntungannya, tidak perlu menyepakati kunci terlebih dahulu. Kekurangannya, RSA lambat dan sekali proses hanya bisa mengenkripsi beberapa ratus byte. Sistem sungguhan sering menggabungkan keduanya: RSA mengenkripsi kunci AES acak untuk pihak lain, lalu AES mengenkripsi data yang sebenarnya.
Berapa banyak data yang bisa dienkripsi RSA sekaligus?
RSA hanya bisa mengenkripsi blok data kecil sekali proses, dengan batas ditentukan oleh panjang kunci dan padding. Dengan PKCS1Padding batasnya adalah panjang kunci dalam byte dikurangi 11, yaitu 245 byte untuk kunci 2048 bit. Dengan OAEP batasnya adalah panjang kunci dalam byte dikurangi dua kali panjang hash dikurangi 2, yaitu 190 byte untuk kunci 2048 bit dengan SHA-256. Data yang lebih panjang biasanya dienkripsi dengan AES, lalu RSA dipakai untuk mengenkripsi kunci AES-nya.
Padanan dengan nama Cipher di Java
Nama padding sama dengan Cipher di Java: untuk RSA/ECB/PKCS1Padding pilih PKCS1Padding; untuk RSA/ECB/OAEPWithSHA-256AndMGF1Padding pilih opsi ketiga, karena Java memakai SHA-1 untuk MGF1 secara default; jika Anda menetapkan hash kustom dengan OAEPParameterSpec, pilih OAEPPadding lalu pilih hash OAEP dan hash MGF1 secara terpisah. Set karakter juga mengikuti aturan Java, misalnya UTF-16 dienkode big-endian dengan FE FF di awal.
Mengapa ciphertext berbeda setiap kali?
Saat mengenkripsi dengan kunci publik, PKCS1Padding maupun OAEP menambahkan byte acak ke padding, sehingga teks yang sama menghasilkan ciphertext berbeda setiap kali, dan semuanya bisa didekripsi dengan kunci privat. Ini normal. Enkripsi dengan kunci privat memakai padding tetap, jadi hasilnya selalu sama. OAEP hanya bisa dipakai untuk enkripsi kunci publik dan dekripsi kunci privat.
Format kunci yang didukung
Kunci PEM bisa berupa BEGIN PUBLIC KEY, BEGIN RSA PUBLIC KEY, BEGIN PRIVATE KEY, atau BEGIN RSA PRIVATE KEY, dan Anda juga bisa menempelkan hanya isi Base64-nya. Kunci hex adalah isi yang sama dalam bentuk heksadesimal. Kunci privat yang dilindungi kata sandi harus didekripsi dulu. Jika jenis kunci diatur ke kunci publik, Anda juga bisa menempelkan kunci privat, dan bagian publiknya yang akan dipakai.
Pertanyaan umum
Apa yang harus dilakukan jika dekripsi gagal dengan pesan "kunci tidak cocok, jenis kunci atau padding salah"?
Periksa tiga hal secara berurutan. Pertama, apakah kunci tersebut pasangan dari kunci publik yang dipakai untuk enkripsi, karena isi yang dienkripsi dengan kunci publik hanya bisa dibuka oleh kunci privat pasangannya. Kedua, jenis kunci harus diatur ke kunci privat. Ketiga, padding harus sama dengan sisi yang mengenkripsi; pada OAEPPadding, hash OAEP dan hash MGF1 juga harus sama. Terakhir, pastikan format input tidak tertukar, karena hex dan base64 yang tertukar juga membuat dekripsi gagal.
Apa yang harus dilakukan jika format kunci ditolak, atau muncul pesan "CERTIFICATE" tidak didukung?
Pertama pastikan "Format kunci" sesuai dengan yang Anda tempel: pilih pem untuk teks yang diawali -----BEGIN dan hex untuk deretan panjang heksadesimal; jika salah, biasanya muncul pesan yang memberi tahu harus diganti ke yang mana. PEM harus berisi kunci publik atau privat RSA, dan sertifikat (BEGIN CERTIFICATE) tidak bisa dipakai langsung; Anda bisa mengambil kunci publiknya dulu dengan openssl x509 -in cert.pem -pubkey -noout. Jika sertifikat dan kunci ditempel bersamaan, blok kuncinya akan diambil secara otomatis.
Kunci privat saya memakai kata sandi dan muncul pesan untuk mendekripsinya dulu. Apa yang harus dilakukan?
Kunci privat yang dilindungi kata sandi tidak didukung (BEGIN ENCRYPTED PRIVATE KEY, atau baris Proc-Type: 4,ENCRYPTED di header PEM). Hapus dulu kata sandinya di komputer Anda sendiri, lalu tempel kuncinya, misalnya dengan openssl rsa -in file-asli -out file-baru, dan masukkan kata sandi saat diminta. File hasilnya adalah kunci privat tanpa perlindungan, jadi tangani dengan hati-hati setelah selesai.
Muncul pesan bahwa isi melebihi batas. Berapa banyak karakter Mandarin yang bisa saya enkripsi?
Batasnya dihitung dalam byte, bukan jumlah karakter. Kunci 2048 bit dengan PKCS1Padding mengizinkan paling banyak 245 byte, dan satu karakter Mandarin memakai 3 byte dalam UTF-8, jadi sekitar 81 karakter; dengan set karakter GBK satu karakter memakai 2 byte, jadi sekitar 122. Saat mengenkripsi, setelah Anda menempelkan kunci, panel Kunci menampilkan "maks. N byte per enkripsi" untuk kunci dan padding saat ini. Jika melebihi batas akan muncul error, dan alat ini tidak membagi isi menjadi beberapa potongan secara otomatis.
Bagaimana cara mendekripsi data yang dienkripsi dengan JSEncrypt atau Web Crypto di browser?
JSEncrypt memakai PKCS1Padding dan menghasilkan Base64, jadi pilih PKCS1Padding di sini dan atur format input ke base64. RSA-OAEP pada Web Crypto browser memakai satu hash untuk OAEP sekaligus MGF1, jadi pilih OAEPPadding di sini dan atur hash OAEP dan hash MGF1 ke nilai yang sama, misalnya SHA256 untuk keduanya. Dalam kedua kasus, atur jenis kunci ke kunci privat.
Apa arti pesan "Ciphertext berukuran N byte, lebih panjang dari kunci" atau "Ciphertext di luar rentang untuk kunci ini"?
Panjang ciphertext RSA sama dengan panjang kunci dalam byte: 256 byte untuk kunci 2048 bit, yaitu 512 karakter dalam hex, dan tidak pernah lebih panjang. Saat mendekripsi, panel Kunci menampilkan "Ciphertext N byte" di samping judulnya, jadi bandingkan dengan jumlah byte di samping kolom input. Ciphertext yang lebih panjang dari kunci biasanya berarti format input salah atau ada isi tambahan yang ikut tersalin; nilai di luar rentang berarti ciphertext tidak dienkripsi dengan kunci publik pasangan kunci ini, jadi ganti ke kunci yang benar.
Apakah enkripsi kunci privat dan dekripsi kunci publik bisa dipakai untuk menandatangani dan memverifikasi?
Tidak secara langsung. Enkripsi kunci privat di sini hanya menerapkan kunci privat ke input Anda dengan PKCS1Padding dan tidak melakukan hashing, sedangkan tanda tangan seperti SHA256withRSA melakukan hash lebih dulu lalu membungkus hash itu dalam struktur tetap (DigestInfo). Jadi mendekripsi tanda tangan standar di sini dengan kunci publik menghasilkan struktur itu, bukan teks aslinya. Untuk menandatangani atau memverifikasi, gunakan library atau alat yang mendukung algoritma seperti SHA256withRSA.
Apa yang disimpan di riwayat, dan apakah diunggah?
Hanya tersimpan di localStorage browser perangkat ini dan tidak pernah diunggah; kode halaman tidak membuat permintaan jaringan apa pun. Satu entri ditambahkan setelah setiap enkripsi atau dekripsi yang berhasil, maksimal 20 entri disimpan, dan yang input atau hasilnya lebih dari 20.000 karakter tidak dicatat. Setiap entri berisi parameter, input, dan hasil, ditambah sidik jari 8 karakter yang diturunkan dari kunci (8 karakter hex pertama dari SHA-256 modulus, ditampilkan setelah tanda # di setiap entri, untuk membedakan apakah kuncinya sama), tetapi tidak pernah menyimpan kuncinya sendiri, jadi setelah mengklik "Muat" Anda perlu menempelkan kuncinya lagi. Plaintext hasil dekripsi disimpan, jadi di komputer umum klik "Hapus riwayat" setelah selesai.