Bahasa: Bahasa Indonesia

tools / des

des/

Enkripsi dan dekripsi simetris DES, untuk terhubung ke sistem lama yang masih memakai DES. Mode, padding, format kunci dan IV, serta set karakter bisa dipilih. Hasilnya sama dengan Java dan CryptoJS, dan kunci Anda tidak pernah keluar dari browser.

Plaintext

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 IV dan 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.

Apa itu mode enkripsi, dan mana yang sebaiknya dipilih?

DES mengenkripsi 8 byte sekali proses; mode menentukan bagaimana data yang lebih panjang dipecah menjadi blok dan bagaimana blok-blok itu dihubungkan. ECB mengenkripsi tiap blok sendiri-sendiri, sehingga isi yang sama menghasilkan ciphertext yang sama dan membocorkan pola data; sebaiknya dihindari. CBC mencampur tiap blok dengan blok ciphertext sebelumnya sebelum dienkripsi, dan blok pertama dicampur dengan IV; ini pilihan yang paling umum. CFB, OFB, dan CTR mengubah DES menjadi aliran kunci (keystream) yang di-XOR dengan data byte demi byte, sehingga tidak perlu padding.

Kunci, IV, dan padding

Kunci DES berukuran 8 byte, tetapi bit terendah di setiap byte adalah bit paritas yang tidak ikut dihitung, sehingga kunci efektifnya hanya 56 bit. Jika kunci lebih dari 8 byte, hanya 8 byte pertama yang dipakai, seperti pada DESKeySpec di Java dan CryptoJS; kunci yang lebih pendek ditolak. Semua mode kecuali ECB memerlukan IV 8 byte. IV tidak perlu dirahasiakan, tetapi jangan pernah dipakai ulang dengan kunci yang sama.

ECB dan CBC mengharuskan panjang data kelipatan 8 byte, jadi data yang kurang akan diisi sesuai padding yang dipilih. PKCS5Padding dan PKCS7Padding identik untuk DES dan paling umum dipakai. ZeroPadding mengisi dengan nol dan membuang semua byte nol di akhir saat dekripsi, sehingga plaintext yang memang berakhir dengan byte nol ikut terpotong. NoPadding tidak menambah apa pun, jadi Anda harus memastikan panjangnya sendiri.

Padanan dengan penulisan di Java dan CryptoJS

Cipher.getInstance("DES/CBC/PKCS5Padding") di Java berarti CBC dengan PKCS5Padding; jika hanya menulis "DES", defaultnya ECB dengan PKCS5Padding. Di Java, CTR hanya bisa memakai NoPadding. Mode dan padding di CryptoJS.DES.encrypt namanya sama, dan CryptoJS.pad.Pkcs7 adalah PKCS7Padding. Untuk sistem baru, pakailah AES.

Pertanyaan umum

Bisakah 3DES (DESede, TripleDES) dienkripsi dan didekripsi di sini?

Tidak, di sini hanya ada DES tunggal. Kunci 3DES berukuran 16 atau 24 byte; jika ditempel di sini, hanya 8 byte pertama yang dipakai, sehingga hasilnya berbeda dari 3DES, dan kolom Kunci juga menampilkan "hanya 8 byte pertama yang dipakai". Untuk 3DES, gunakan alat yang mendukung DESede.

Apa yang harus dilakukan jika muncul pesan "Panjang kunci N byte; kunci DES minimal 8 byte"?

Kurang dari 8 byte akan menimbulkan error, dan tidak ada pengisian nol otomatis, jadi lengkapi sendiri sampai 8 byte. Kesalahan yang lebih sering terjadi adalah salah format: jika kunci hex 16 karakter dimasukkan dengan format kunci diatur ke string, kunci itu dianggap teks 16 byte dan hanya 8 karakter pertama yang dipakai. Tidak ada error, hanya catatan "hanya 8 byte pertama yang dipakai" di samping kolom Kunci dan di bawah hasil, dan hasilnya tentu tidak cocok. Pada format string, jumlah byte mengikuti set karakter yang dipilih, jadi satu karakter Mandarin memakai 3 byte di UTF-8.

Apa yang harus dilakukan jika muncul pesan "IV untuk mode ini harus tepat 8 byte"?

IV DES harus tepat 8 byte, bukan 16 byte seperti AES, di semua mode kecuali ECB. Kunci yang lebih dari 8 byte dipotong menjadi 8 byte pertama, tetapi IV tidak; terlalu panjang atau terlalu pendek langsung menimbulkan error, jadi IV 16 byte dari pengaturan AES harus diubah menjadi 8 byte. Periksa juga formatnya: 16 karakter hex menghasilkan 8 byte, sedangkan 16 karakter yang sama dalam format string adalah 16 byte. ECB tidak memerlukan IV, jadi baris IV disembunyikan.

Apa yang harus dilakukan jika dekripsi menampilkan "padding tidak valid" atau "bukan kelipatan 8"?

Panjang ciphertext yang bukan kelipatan 8 biasanya berarti salinan tidak lengkap, atau hex dan base64 tertukar. Padding tidak valid biasanya berarti salah satu dari kunci, IV, mode, atau padding berbeda dengan yang dipakai saat enkripsi. ZeroPadding dan NoPadding tidak memeriksa padding, jadi tidak akan memunculkan error ini, tetapi hasilnya berupa karakter acak jika parameternya salah.

Awal hasil dekripsi berantakan, atau muncul pesan bahwa hasilnya bukan teks UTF-8 yang valid

Periksa IV lebih dulu. Jika ciphertext lebih panjang dari satu blok, IV yang salah pada mode CBC dan CFB hanya merusak blok 8 byte pertama, sisanya tetap benar dan tidak muncul error padding, sehingga bagian awal berantakan sementara teks sesudahnya benar. Jika pesan menyebutkan hasilnya bukan teks yang valid, set karakter mungkin berbeda dengan yang dipakai saat enkripsi, misalnya pihak lain memakai GBK. Mengubah format output ke hex memungkinkan Anda memeriksa dulu apakah byte hasil dekripsinya sendiri sudah benar.

Hasil enkripsi tidak cocok dengan Java atau CryptoJS. Bagaimana cara memeriksanya?

Periksa berurutan: mode dan padding, format dan jumlah byte kunci serta IV, set karakter, lalu format input dan output. Plaintext berformat string tidak dipangkas spasinya, jadi satu baris baru ekstra di akhir sudah membuatnya menjadi data yang berbeda. CTR, CFB, dan OFB di sini juga diberi padding sesuai padding yang dipilih, jadi dengan PKCS5Padding ciphertext lebih panjang daripada plaintext; jika backend memakai NoPadding, pilih NoPadding juga di sini. CFB di sini adalah varian blok penuh 64 bit, jadi tidak akan cocok dengan backend yang memakai CFB8.

Hasil CryptoJS.DES.encrypt diawali U2FsdGVkX1. Bisakah didekripsi di sini?

Tidak. Jika Anda memberikan string biasa sebagai kunci ke CryptoJS.DES.encrypt(message, string), CryptoJS menganggapnya sebagai passphrase: salt acak ditambahkan, lalu kunci dan IV diturunkan seperti yang dilakukan OpenSSL, dan hasilnya diawali U2FsdGVkX1. Format itu tidak didukung di sini. Agar cocok dengan alat ini, ubah kunci menjadi byte di CryptoJS dengan CryptoJS.enc.Utf8.parse lalu masukkan, dan tentukan iv, mode, dan padding secara eksplisit.

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 input atau hasil yang melebihi 20.000 karakter tidak dicatat. Satu entri berisi parameter, IV, input, dan hasil, ditambah sidik jari 8 karakter yang diturunkan dari 8 byte pertama kunci (karakter setelah tanda # di setiap entri, untuk membedakan apakah kuncinya sama), tetapi tidak pernah menyimpan kuncinya, sehingga setelah mengklik "Muat" Anda perlu mengisi kunci lagi. Setiap entri bisa dihapus sendiri-sendiri, dan di komputer umum, klik "Hapus riwayat" setelah selesai.