Kembali ke jurnalCATATAN FAJAR
Cryptography5 menit baca

[Crypto: age] Membaca Header

Membaca header file age satu per satu field-nya, dengan definisi sederhana untuk salt, file key terenkripsi, dan kode autentikasi.

BAGIAN 2 DARI 6Crypto: age
  1. 01[Crypto: age] Dari Password ke Ciphertext
  2. 02[Crypto: age] Membaca HeaderKamu di sini
  3. 03[Crypto: age] scrypt, Dari Password ke Key
  4. 04[Crypto: age] ChaCha20-Poly1305, Menyegel Isi File
  5. 05[Crypto: age] Passphrase atau Key Pair
  6. 06[Crypto: age] Berapa Lama Serangan Passphrase Berlangsung?
Di artikel ini 7 bagian

Post pertama membuat sebuah file terenkripsi bernama secret.txt.age. Header-nya berupa teks yang bisa dibaca. Header memberi age informasi yang dibutuhkan untuk memulai dekripsi.

Payload dimulai setelah header. Payload berisi sebuah nilai acak dan isi file terenkripsi. Header dan payload punya tugas yang berbeda.

Membaca header

Di direktori contoh, tampilkan empat baris pertama:

bash
head -n 4 secret.txt.age

Output dari contoh awal adalah:

text
age-encryption.org/v1
-> scrypt pzJgb0zs5vH+TDRw2LwY6w 18
uGTID9B5wTysoKAj16JdCCNB82QMOVTCS7e0OFjgN5s
--- q0qn6iAS9XKtkTt94HV6beIv5DIVMOqDCUYKuBtY7bA

Nilai acak kamu bakal berbeda. Layout empat baris ini berlaku untuk contoh passphrase ini. Tipe recipient lain bisa membuat header yang lebih panjang.

BarisNamaArti
1Baris versiFile ini pakai format age versi 1
2Tipe recipient dan parameterage pakai scrypt dengan salt dan work factor yang ditampilkan
3Stanza bodySebuah file key terenkripsi dan authentication tag-nya
4Kode autentikasi headerNilai yang dipakai age untuk mendeteksi perubahan pada header

Recipient adalah tujuan enkripsi. Recipient stanza adalah sekelompok baris header yang menunjukkan satu metode untuk mendekripsi file key. Baris 2 dan 3 membentuk scrypt stanza di contoh ini.

Salt dan work factor

Baris stanza pertama berisi nama scrypt, sebuah salt, dan angka 18.

Salt adalah nilai acak yang dipakai age bersama passphrase untuk menurunkan key. Salt nggak harus rahasia. age menyimpan salt supaya dekripsi bisa mengulang kalkulasi yang sama.

Salt-nya berisi 16 byte. Header menampilkan byte-byte itu sebagai teks base64. Base64 adalah cara merepresentasikan byte dengan karakter yang bisa dibaca. Base64 nggak mengenkripsi byte-byte itu.

Angka 18 adalah work factor yang disimpan di header. Angka ini mengatur cost parameter scrypt jadi 2 pangkat 18, atau 262.144. Post scrypt menunjukkan gimana nilai ini mengubah waktu dan pemakaian memory.

Key-key ini punya tugas yang berbeda

Passphrase nggak langsung mengenkripsi isi file. age pakai beberapa key dalam proses ini:

NilaiUkuranTugas
PassphraseBervariasiRahasia yang diberikan user
Wrapping key32 byteMengenkripsi dan mendekripsi file key
File key16 byteRahasia acak yang dipakai age untuk menurunkan key lain
Payload key32 byteMengenkripsi dan mendekripsi isi file

Di mode passphrase, scrypt menurunkan wrapping key dari passphrase dan salt. age juga meng-generate file key acak yang baru untuk setiap file. age mengenkripsi file key itu dengan wrapping key.

Stanza body berisi 16 byte file key terenkripsi dan authentication tag 16 byte. Jadi, stanza body yang udah di-decode berukuran 32 byte. Itu bukan key acak terpisah berukuran 32 byte.

Authentication tag memungkinkan age mendeteksi key yang salah atau perubahan pada nilai terenkripsi. Dengan passphrase yang salah, pengecekan tag gagal waktu age mencoba mendekripsi file key.

Setelah age mendapatkan file key, age menurunkan payload key yang terpisah. Post payload menunjukkan langkah itu.

Kenapa age mengenkripsi file key secara terpisah

Key yang terpisah memungkinkan age mengenkripsi file key yang sama untuk beberapa recipient berbasis public key. Setiap recipient mendapat sebuah stanza. Recipient mana pun yang punya secret key yang cocok bisa mendekripsi file key.

Payload tetap cuma berisi satu salinan terenkripsi dari data awal. Post key pair memberikan contoh dengan dua recipient.

Mode passphrase punya batasan yang berbeda. File age dengan scrypt stanza harus cuma berisi stanza itu. File itu nggak bisa sekaligus berisi recipient berbasis public key.

Kode autentikasi header

Baris header terakhir dimulai dengan ---. Sisa teksnya merepresentasikan message authentication code, atau MAC. MAC ini memungkinkan age mendeteksi perubahan header oleh orang yang nggak tahu file key-nya.

age menurunkan key autentikasi header dari file key. age pakai key itu dengan algoritma HMAC-SHA-256. Kalkulasinya mencakup header sampai marker ---, tanpa spasi setelah marker itu.

Selama dekripsi, age menghitung MAC lagi dan membandingkan hasilnya dengan nilai yang tersimpan. Kalau nilainya berbeda, age menolak file itu. Beberapa perubahan, misalnya salt yang nggak valid, bisa menyebabkan error lebih awal.

Orang yang tahu file key bisa menghitung MAC yang baru. Jadi, MAC nggak membuktikan siapa yang mengirim file itu. Spesifikasi format age mendefinisikan header dan kalkulasi autentikasinya.

Text armor dan nilai acak

Opsi -a membuat file armored. Armor adalah representasi teks base64 dari seluruh file terenkripsi. Armor membantu kalau sebuah sistem menerima teks tapi nggak bisa menerima data biner.

Untuk membuat contoh armored, jalankan:

bash
age -p -a -o secret.txt.age.txt secret.txt

Masukkan passphrase contoh kamu di prompt. Baris pertama file output-nya adalah:

text
-----BEGIN AGE ENCRYPTED FILE-----

Armor nggak menambahkan enkripsi. Setelah di-decode dari base64, file-nya punya format age yang sama dengan file age biner.

Command ini melakukan enkripsi baru. age meng-generate salt, file key, dan payload nonce yang baru. Nonce adalah nilai yang dipakai sekali dalam sebuah konteks enkripsi.

Bahkan dengan input dan passphrase yang sama, enkripsi baru menghasilkan byte yang berbeda dengan probabilitas yang sangat tinggi. Salt mencegah pemakaian ulang yang berguna dari tabel passphrase yang udah dihitung sebelumnya di antara file-file dengan salt yang berbeda.

Layout lengkapnya

mermaid
graph TD
    A["Version line"] --> B["scrypt, salt, and work factor"]
    B --> C["Encrypted file key and its tag"]
    C --> D["Header MAC"]
    D --> E["Payload nonce: 16 bytes"]
    E --> F["Encrypted content and chunk tags"]

Empat kotak pertama termasuk bagian header. Dua kotak terakhir termasuk bagian payload. Post berikutnya menunjukkan gimana scrypt memakai parameter dari header.

TOPIK

SELANJUTNYA DI SERI INI[Crypto: age] scrypt, Dari Password ke Key

MAKASIH UDAH BACA

Gimana menurutmu?

Reaksi atau obrolan, dua-duanya selalu ditunggu.

Memuat reaksi…

Bagikan

Memuat komentar...

LANJUT JELAJAH

Satu pikiran bawa ke pikiran lain.

Semua tulisan
Kembali ke semua tulisanSatu catatan, pelan-pelan.