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:
head -n 4 secret.txt.age
Output dari contoh awal adalah:
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.
| Baris | Nama | Arti |
|---|---|---|
| 1 | Baris versi | File ini pakai format age versi 1 |
| 2 | Tipe recipient dan parameter | age pakai scrypt dengan salt dan work factor yang ditampilkan |
| 3 | Stanza body | Sebuah file key terenkripsi dan authentication tag-nya |
| 4 | Kode autentikasi header | Nilai 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:
| Nilai | Ukuran | Tugas |
|---|---|---|
| Passphrase | Bervariasi | Rahasia yang diberikan user |
| Wrapping key | 32 byte | Mengenkripsi dan mendekripsi file key |
| File key | 16 byte | Rahasia acak yang dipakai age untuk menurunkan key lain |
| Payload key | 32 byte | Mengenkripsi 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:
age -p -a -o secret.txt.age.txt secret.txt
Masukkan passphrase contoh kamu di prompt. Baris pertama file output-nya adalah:
-----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
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.

Memuat komentar...