Panduan teknis
Panduan teknis lengkap: arsitektur dan format .nik, mesin kompresi dan codec media, desain enkripsi dan ketahanan kuantum, pengerasan, semua benchmark, serta catatan build, pengujian, dan peta jalan.
1 Pendahuluan
.nik. Ia dirancang berdasarkan empat gagasan: mengompres lebih baik daripada alat yang sudah mapan, melakukannya lebih cepat, melindungi data dengan kriptografi modern, dan berjalan tanpa perubahan di Windows, macOS dan Linux sebagai satu berkas eksekusi kecil.1.1 Tujuan desain
Kecil. Mengalahkan RAR 7 pada data yang benar-benar diarsipkan orang dalam jumlah besar. Audio, gambar dan musik tracker dideteksi dari isinya dan dikompresi dengan codec tanpa rugi khusus; yang lainnya menggunakan aliran Zstandard multi-utas yang telah disetel. Cepat. Kompresi dan ekstraksi seharusnya dibatasi oleh disk, bukan CPU. Pada level cepat -m2 nikpak mengarsipkan sekitar 200 MB berkas sumber dalam waktu kurang dari satu detik pada satu inti. Aman. Enkripsi terautentikasi dengan fungsi penurunan kunci yang memakan memori, nama berkas selalu disembunyikan, perusakan selalu terdeteksi, dan pengekstrak yang tidak dapat ditipu untuk menulis di luar folder tujuannya. Tahan kuantum. Hanya kriptografi simetris 256-bit yang digunakan. Tidak ada RSA, tidak ada elliptic-curve dan tidak ada kode Diffie-Hellman di mana pun dalam nikpak, sehingga tidak ada yang dapat dipecahkan oleh algoritma Shor. Portabel dan dapat diskrip. Satu berkas eksekusi tertaut statis, baris perintah yang kompatibel dengan RAR, kode keluar yang dapat diprediksi, dan -helpyang mendokumentasikan setiap opsi.
1.2 Hasil sekilas
| 0.9 s | ||
Semua pengukuran berasal dari satu mesin (mesin virtual Linux x86-64, satu inti CPU) dengan RAR 7.00 dan nikpak 1.1.0. Setiap arsip diekstrak ulang dan dibandingkan dengan aslinya byte demi byte. Metode lengkap, korpora, dan kasus-kasus saat RAR lebih cepat dijelaskan di bab 11. |
1.3 Untuk siapa program ini?
1.4 Cara membaca panduan ini
1.5 Komunitas dan kontak
Telegramhttps://t.me/cryptonikko Xhttps://x.com/cryptonikkoid Discordhttps://discord.com/users/1537826350759415811
2 Ikhtisar fitur
2.1 Kemampuan
2.2 nikpak dan RAR berdampingan
|
| ||
|---|---|---|
| 9.7 - 16.7 s (-m3) | ||
3 Referensi baris perintah
nikpak [options] [files...]. Opsi dapat muncul di mana saja sebelum atau sesudah nama arsip; -- mengakhiri penguraian opsi.3.1 Perintah
a | .nik ditambahkan bila nama tidak memiliki ekstensi. Folder selalu ditelusuri secara rekursif. |
x | -d dir) menentukan tujuan. |
e | |
l | |
v | |
lb | |
t | |
p | |
d | |
mt | |
(none) |
3.2 Opsi
-p |
-e | |
-p |
-P | |
-hp[password] |
| |
-m0
.. -m5 |
-0
.. -9 | |
-mt |
| |
-mc- / -mc+ |
| |
-r |
| |
-ep |
-j | |
-ep1 |
| |
-o+ |
-o | |
-o- |
-n | |
-or |
| name (1).ext. |
-y |
| |
-x |
-x | |
-d |
-d | x dan e. |
-inul -idq |
-q | |
@listfile |
| |
-h -help -? |
| -V mencetak versi. |
-s, -ma5, -md64m, -ibck, -idp, -rr, -ts*, -w, dan sejenisnya) diterima dan diabaikan, sehingga konfigurasi alat yang ada tetap berfungsi. Hal lain apa pun menghasilkan pesan kesalahan yang jelas dan kode keluar 7.nikpak --add dan --add-here mengompres item yang diberikan menjadi arsip baru, nikpak --install-menu dan --uninstall-menu menambah atau menghapus menu klik kanan (--all-users untuk pemasangan semua pengguna), dan unNik --extract, --extract-here serta --extract-to menggerakkan ekstraksi dari menu.3.3 Kata sandi secara rinci
-p, nikpak menentukan kata sandi dalam urutan ini, dan tidak pernah gagal hanya karena tidak ada yang diberikan:-patau-Pdi baris perintah: dipakai apa adanya (minimal 8 karakter).Variabel lingkungan NIKPAK_PASSWORD, yang menjaga kata sandi keluar dari daftar proses.Permintaan interaktif, ditanyakan dua kali untuk konfirmasi. Entri kosong menghasilkan kata sandi acak. Tanpa terminal (misalnya di dalam GUI), kata sandi disalurkan lewat stdin; jika tidak ada, kata sandi acak dibuat.
3.4 Kode keluar
| 0 |
| |
| 1 | ||
| 2 | ||
| 3 | ||
| 7 | ||
| 10 | ||
| 11 |
3.5 Contoh
nikpak a backup.nik C:\Docs\*.txt Photos\ # create an archive
nikpak a -m5 -mt8 big.nik Projects\ # maximum, 8 threads
nikpak a -p secret.nik Taxes2026\ # encrypted, prompts
nikpak a -pMyLongPassw0rd s.nik f.pdf # password given
nikpak x backup.nik C:\Restore\ # extract with paths
nikpak e backup.nik *.jpg C:\Pics\ # only *.jpg, flat
nikpak x backup.nik Docs/report.pdf # extract ONE file
nikpak e backup.nik Docs/report.pdf -d C:\Out # one file, no path
nikpak x backup.nik Photos -d C:\Restore # one folder
nikpak l backup.nik *.pdf # list only PDFs
nikpak p backup.nik notes.txt # show a file
nikpak d backup.nik Temp *.bak # delete entries
nikpak l backup.nik # list
nikpak t secret.nik # test (asks password)
nikpak mt song.wav tracker.mod photo.bmp # which filter wins?
3.6 Integrasi dengan Total Commander dan front-end lain
a, x, e, l, t, @listfile, -p, -ep1, -o+, -y, -m), program yang dapat mengendalikan rar.exe eksternal dapat mengendalikan nikpak.exe. Di Total Commander, daftarkan ekstensi nik di bawah Configuration, Packer, Additional packer programs dan arahkan perintah packer serta unpacker ke nikpak.exe. Gunakan -o+ atau -y untuk ekstraksi tanpa pengawasan, karena tanpa konsol nikpak tidak dapat bertanya apakah akan menimpa dan justru akan melewati berkas yang sudah ada. Nama menu berbeda antar versi Total Commander; lihat bantuan bawaannya untuk field yang tepat.Jalur berpetik yang berakhir dengan garis miring terbalik, seperti "C:\My Folder\", salah diuraikan oleh Windows (petik terakhir dianggap sebagai escape). Untuk tujuan dengan spasi gunakan -d "C:\My Folder" sebagai gantinya. |
3.7 Antarmuka grafis

Lepaskan satu berkas atau folder, atau beberapa sekaligus, di atas jendela, atau klik lingkaran (atau tautan choose files / choose a folder) untuk memilihnya lewat dialog; mengeklik lingkaran menampilkan dua tombol Choose files dan Choose a folder di dalam cincin. Mereka dikompresi dengan kompresi terbaik (-m5) menjadi satu arsip yang dinamai menurut berkas (tanpa ekstensinya), folder, atau untuk beberapa item, folder asalnya. Arsip yang sudah ada tidak pernah ditimpa: report.nik menjadi report (2).nik. Progres ditampilkan sebagai persentase besar di dalam meteran melingkar, beserta fase (menganalisis, mengompres, menyelesaikan), jumlah yang telah diproses, dan waktu. Tombol Cancel di bawahnya (atau tombol Esc) menghentikan kompresi panjang seketika dan menghapus arsip yang belum selesai; jendela tetap terbuka untuk kompresi berikutnya. Menutup jendela saat kompresi berlangsung juga melakukan hal yang sama. Selesai: cincin berubah hijau dan menampilkan nama arsip, ukurannya dibanding aslinya, serta waktu. Show in folder membukanya di Explorer, Finder, atau pengelola berkas; Compress more (atau klik pada lingkaran) memulai kompresi berikutnya. Save to: folder tujuan di bagian bawah dapat diketik atau dipilih dengan Browse. Folder ini diingat untuk waktu berikutnya (Windows: %APPDATA%\nikpak\settings.txt; macOS: ~/Library/Application Support/nikpak; Linux: ~/.config/nikpak). Pertama kali, folder ini adalah Desktop. Komunitas: tiga tombol bulat di kanan bawah membuka halaman Telegram, X, dan Discord nikpak (bagian 1.5). Beralih ke unNik: tombol bulat dengan panah ke atas, di kiri tombol i, menutup NikPak dan menjalankan unNik (bagian 3.9). Setelah kompresi, tombol itu dan tautan Open in unNik di layar selesai langsung membuka arsip baru. Tombol dinonaktifkan saat sedang mengompres. Buka folder tujuan: tombol folder di antara field Save to dan Browse membuka folder itu di Explorer atau Finder; setelah kompresi, ia membukanya dengan arsip baru yang sudah terpilih. Suara: klik lembut untuk tombol, tautan, dan opsi, serta suara singkat untuk setiap tindakan (pekerjaan dimulai, berhasil, kesalahan, batal, berpindah program, berkas melayang di atas jendela). Suara dibuat oleh program itu sendiri, tanpa berkas suara. Tombol speaker di bilah judul mematikan dan menyalakannya; suara aktif secara bawaan, dan pilihannya dibagikan dengan unNik. Bahasa: tombol di kiri bawah, dengan bendera dan nama bahasa itu sendiri, membuka menu sepuluh bahasa yang paling banyak dituturkan di dunia (Ethnologue 2025): English, 中文 (Mandarin Chinese), हिन्दी (Hindi), Español, العربية (Arabic), Français, বাংলা (Bengali), Português, Русский (Russian), dan Bahasa Indonesia. Memilih salah satu akan menyimpannya dan memulai ulang nikpak dalam bahasa itu. Pertama kali, nikpak mengikuti bahasa Windows (atau sistem), selain itu English. Baris perintah tetap berbahasa English. Berjalan sebagai administrator: Windows tidak mengizinkan menyeret berkas dari Explorer ke program yang berjalan sebagai administrator. Saat nikpak.exe dijalankan sebagai administrator (misalnya dari PowerShell administrator), ia memulai ulang dirinya sekali sebagai pengguna normal melalui Explorer agar drag and drop berfungsi. Jika itu tidak mungkin, jendela menampilkan pemberitahuan; pilih berkas lewat tombol sebagai gantinya. Status dan About: kiri atas menampilkan EVALUATION COPY · REGISTER (klik membuka kotak registrasi) atau REGISTERED TO beserta pemegang lisensi. Tombol kecil i di kanan atas, di samping minimize dan close, membuka kotak About: versi, © 2026 Nicolas Choukroun, didistribusikan oleh Nikkoid LLC, status lisensi, situs web, dan ketentuan lisensi (LICENSE.txt).
cargo build --release --no-default-features.
3.8 Lisensi dan registrasi (shareware)


Pengingat muncul saat salinan yang belum terdaftar membuka jendelanya. Ia memiliki dua tombol, Register dan Test for free, yang urutan kiri/kanannya berubah secara acak setiap kali mulai. Test for free (atau Esc) menutupnya; nikpak kemudian bekerja tanpa batasan. Kotak registrasi meminta nama, alamat e-mail, dan kunci lisensi. Ketiganya harus cocok: kunci adalah tanda tangan dari nama dan e-mail. Kapitalisasi, spasi ekstra, dan karakter serupa O/0 serta I/L/1 tidak masalah. Buy a licence membuka https://nikpak.nikkoid.com/buy.php. Setelah terdaftar nikpak tidak pernah bertanya lagi di komputer itu untuk pengguna itu. Lisensi disimpan di %APPDATA%\nikpak\license.txt (macOS: ~/Library/Application Support/nikpak; Linux: ~/.config/nikpak). Perusahaan dapat menaruh berkas nikpak.keydi samping nikpak.exe, yang mendaftarkan setiap pengguna PC itu.Baris perintah: nikpak register "Jane Doe" jane@example.com NPK1-…mendaftar;nikpak licensemenampilkan status;nikpak unregistermenghapus lisensi.nikpak -Vdannikpak -helpjuga menampilkan status. Salinan yang belum terdaftar mencetak pemberitahuan evaluasi satu baris pada keluaran kesalahan (stderr), tidak pernah pada keluaran standar; -q menyembunyikannya.
Cara kerja kunci
NPK1- diikuti 108 karakter dalam kelompok lima (Crockford base32). Kunci memuat jenis lisensi (personal atau company), jumlah seat, dan tanda tangan Ed25519 dari NIKPAK-LICENSE-1, jenis, seat, nama, dan alamat e-mail, masing-masing dinormalkan (spasi diciutkan, huruf kecil). nikpak hanya memuat kunci publik 32 byte, di src/license_pubkey.rs, sehingga mempelajari program tidak memungkinkan siapa pun membuat kunci.nikpak-keygen (cargo run --release --features keygen --bin nikpak-keygen -- make --name "Jane Doe" --email jane@example.com; --company --seats 25 untuk perusahaan; newkeys membuat pasangan kunci baru) maupun di server web dengan kit PHP di server/ (PHP 7.2+, MySQL 5.7), yang menerbitkan satu kunci per pembayaran dan menghasilkan kunci yang persis sama. server/README.md menjelaskan penyiapan dan alur pembayaran.3.9 unNik, peramban arsip gratis


Navigasi dengan pohon folder, breadcrumb, Back, Forward, dan Up (Alt+Left, Alt+Right, Backspace), serta klik dua kali. Search (Ctrl+F) mencari berkas berdasarkan nama di seluruh arsip; setiap hasil menunjukkan foldernya. Pilih dengan klik, Ctrl+klik, Shift+klik, kotak centang, Ctrl+A, atau tombol panah. Klik judul kolom untuk mengurutkan berdasarkan nama, ukuran, jenis, atau tanggal. Klik kanan membuka menu dengan semua tindakan. Extract all, atau pilihan (Ctrl+E): pilih tujuan (secara bawaan folder yang dinamai menurut arsip, di sampingnya), pertahankan folder atau tidak, dan apa yang harus dilakukan bila berkas sudah ada: replace it, keep both (name (1).ext), atau skip it. Berkas yang diambil dari dalam folder dibuat tanpa jalur folder itu, seperti di WinRAR. Pembacaan berhenti tepat setelah berkas terpilih terakhir. View (F3, atau klik dua kali pada berkas teks): teks dengan nomor baris, pencarian dengan penyorotan, pembungkusan baris, dan salin; berkas biner dalam heksadesimal. 16 MB pertama ditampilkan; Open in Notepad membuka seluruh berkas. Open menjalankan berkas dengan programnya sendiri (berkas diekstrak ke folder sementara lebih dulu). Delete (Del) menghapus berkas dan folder dari arsip setelah konfirmasi. Arsipnya padat, sehingga ditulis ulang tanpa berkas/folder itu, ke dalam berkas sementara yang menggantikan aslinya hanya bila semuanya berhasil. Arsip terenkripsi mempertahankan kata sandinya; entri lain mempertahankan filter media atau Deflate serta mesin -m5-nya. Test mendekompresi seluruh arsip dan memeriksa setiap berkas. Panel details menampilkan ukuran, tanggal, folder, CRC32, cara penyimpanan berkas, dan atributnya; untuk arsipnya sendiri: ukuran, metode, dan enkripsinya. Ringkasan di bawah pohon menampilkan ruang yang dihemat. Sepuluh bahasa yang sama, tombol bahasa, kotak About (i), dan tombol komunitas seperti NikPak. Nama berkas dalam aksara apa pun digambar dengan font sistem sebagai fallback. Beralih ke NikPak: tombol bulat dengan panah ke bawah, di kiri tombol i, menutup unNik dan menjalankan NikPak. Kedua program berada di folder yang sama. Mereka berbagi satu berkas pengaturan, sehingga bahasa yang dipilih di salah satu program dipakai program lainnya, dan jendela yang sudah terbuka mengikuti perubahan dalam dua detik. Buka folder tujuan: tombol di kiri tombol eject membuka folder ekstraksi terakhir di Explorer atau Finder (sebelum ada ekstraksi, folder arsipnya). unNik memainkan suara yang sama seperti NikPak, dengan suara untuk membuka arsip, mengekstrak, menghapus, dan menguji; tombol speaker miliknya dan milik NikPak berbagi satu pengaturan.

3.10 Skin
Tombol Skins (palet, di bilah judul kedua program): membuka menu skins, tempat setiap skin digambar dengan warnanya sendiri. Menunjuk ke sebuah skin menampilkannya di seluruh jendela; klik menyimpannya; Esc atau klik di luar kembali ke skin yang Anda miliki. Tombol sun / moon di sebelahnya mengganti antara Nikkoid Blue (gelap) dan Nikkoid Bright dalam satu klik. Kotak skins berdiri di luar program. Saat kotak terbuka, jendela melebar selebar kotak itu, di sisi kanan: program mempertahankan panel 500 × 560-nya dan kotak berada di ruang transparan ekstra di sampingnya, sehingga seluruh antarmuka tetap terlihat di belakang skin yang dicoba. Kotak dapat diseret lewat bilah judulnya kembali ke atas program atau ke mana pun di dalam jendela, dan memiliki tombol Apply Skin dan Cancel. Klik pada sebuah skin mencobanya di seluruh jendela; Apply menyimpannya untuk kedua program; Cancel (atau Esc atau ×) kembali ke skin yang Anda miliki. Klik pada program tidak lagi menutup kotak. Jendela unNik tidak dilebarkan. Skin yang dipilih disimpan ( skin=dalam berkas pengaturan) dan dibagikan: skin yang dipilih di satu program diambil program lainnya dalam dua detik.Skin milik Anda: “Import a skin…” di bagian bawah menu membaca berkas Nikkomander .skin.json(nama dan daftar warna) dan menyalinnya ke folderskinsdi samping berkas pengaturan; × pada ubin skin yang diimpor menghapusnya.Skin lukis melangkah ke belakang antarmuka. Latar lukis digambar oleh src/skin_scenes.rs, bukan oleh gradasi CSS, sehingga menyesuaikan dengan ukuran jendela apa pun. Sejak 1.6.2 masing-masing melewati passdiscreet()disrc/skin.rs: karya seni ditarik ke arah rata-rata lokalnya sendiri, sedikit diburamkan, dan dipudarkan ke arah warna latar skin — paling banyak di belakang cincin drop dan kolom teks, sedikit lebih banyak di atas logo — sehingga judul, cincin, dan teks status tetap tajam pada keempat belas skin.
3.11 Menu pengelola berkas
nikpak --install-menu; macOS: Finder Quick Actions).Pada berkas dan folder: Add to archive… (meminta nama dan folder, lalu mengompres di jendela NikPak) dan Add to archive here (arsip diletakkan di samping item, dinamai seperti pelepasan pada jendela). Pada arsip .nik: Open with unNik, Extract files…, Extract here, dan Extract to its own folder. Beberapa item menjadi satu arsip; beberapa arsip yang dipilih diekstrak satu per satu dalam satu jendela. Perintah berjalan melalui unNik.exe, sehingga tidak ada jendela konsol yang berkedip; label mengikuti bahasa NikPak. Windows 10 menampilkan submenu langsung, Windows 11 di bawah Show more options (Shift+F10); Linux menambahkan service menu KDE Dolphin, aksi Nemo, dan skrip Nautilus, dan macOS menambahkan Finder Quick Actions. Opsi baris perintah baru yang dipakai menu: nikpak --adddan--add-here(mengompres item yang diberikan),nikpak --install-menu,--uninstall-menu, dan--all-users;unNik --extract,--extract-here, serta--extract-to. Extract here / to its own folder menampilkan jendela kecil unNik dengan cincin progres (kotak kata sandi untuk arsip terenkripsi) dan menutupnya saat semuanya terekstrak; peringatan dan kesalahan tetap di layar.Setup kedua, unnik--setup.exe, memasang unNik saja (peramban gratis) bagi orang yang hanya menerima arsip .nik; saat NikPak sudah terpasang, ia hanya memasang programnya, sehingga menu tidak pernah ganda.
4 Arsitektur
4.1 Alur data saat membuat arsip

Write standar yang membungkus tahap berikutnya, sehingga jalur kode yang sama melayani arsip biasa, arsip terenkripsi, dan uji coba media.4.2 Peta kode sumber
main.rs | nikpak lb x | head). |
cli.rs | -help lengkap. Pustaka bergaya Clap tidak dapat menyatakan saklar seperti -pSECRET atau -m5 dengan bersih. |
archive.rs | |
media.rs | |
nac.rs | |
bits.rs | |
crypto.rs | |
format.rs | |
util.rs | |
error.rs | |
engine.rs | |
recomp.rs | |
gui.rs | |
unnik.rs | |
lib.rs, bin/unnik.rs | |
license.rs | |
i18n.rs | |
textshape.rs |
4.3 Membuat arsip, langkah demi langkah
Validasi lokasi keluaran. Arsip yang sudah ada hanya diganti dengan -o+(atau jawaban ya interaktif); selain itu nikpak menjelaskan bahwa penambahan tidak didukung.Kumpulkan masukan: wildcard diekspansi (PowerShell tidak melakukannya), @listfilesdibaca, pengecualian diterapkan, symlink dan berkas khusus dilewati dengan peringatan, dan arsip itu sendiri tidak pernah ditambahkan ke dirinya sendiri.Tentukan kata sandi jika enkripsi diminta (bagian 3.3) dan turunkan kuncinya dengan Argon2id. Tulis header, lalu bangun rantai writer: berkas, writer berbuffer, enkriptor potongan opsional, encoder Zstandard. Tulis setiap entri. Berkas media melewati deteksi dan uji coba (bab 7); yang lainnya disalin dalam potongan 256 KiB sementara CRC32 dihitung. Tulis penanda akhir dengan jumlah entri, selesaikan frame Zstandard, segel potongan terenkripsi terakhir, dan flush ke disk. Ganti nama name.nik.tmpmenjadiname.nik. Jika ada yang gagal lebih awal, objek guard menghapus berkas sementara, sehingga arsip setengah tertulis tidak pernah menggantikan arsip yang baik.
4.4 Mengekstrak arsip, langkah demi langkah
Baca dan validasi header: magic, versi, flag, metode, dan untuk arsip terenkripsi, parameter Argon2id, yang diperiksa rentangnya sebelum memori dialokasikan. Dapatkan kata sandi dan turunkan kuncinya. Potongan terautentikasi pertama kemudian membuktikan atau menyangkal kata sandi. Telusuri aliran entri. Setiap nama entri dibersihkan (bagian 10.1) sebelum akses sistem berkas apa pun. Tulis berkas dengan create_new, atur stempel waktu dan izin, serta verifikasi CRC32 dari byte hasil rekonstruksi. Berkas yang gagal CRC-nya dihapus, bukan dibiarkan.Verifikasi akhir arsip: setelah penanda akhir, aliran harus benar-benar berakhir dan, jika terenkripsi, potongan terautentikasi terakhir harus telah diproses. Ini menangkap pemotongan dan data yang ditambahkan.
4.5 Memori dan threading
-mt untuk membatasi). Dekompresi, codec audio, dan enkripsi berjalan di utas pemanggil. Argon2id memerlukan 64 MiB untuk penurunan kunci, dan dua level tertinggi menggunakan jendela pencocokan 128 MiB, sehingga mendekompresi arsip semacam itu memerlukan memori hingga sebesar itu.5 Format kontainer .nik
.nik adalah header tetap kecil yang diikuti badan. Badan adalah satu aliran padat: semua entri dirangkai, dikompresi bersama, dan secara opsional dienkripsi. Versi 2 format menambahkan record media; arsip versi 1 tetap dapat dibaca.5.1 Header
| 0 | 8 | 89 4E 49 4B 0D 0A 1A 0A (gagasan PNG: mendeteksi kerusakan transfer mode teks) | |
| 8 | 1 | ||
| 9 | 1 | ||
| 10 | 1 | ||
| 11 | 1 | 0 | |
| 12 | 4 | ||
| 16 | 4 | ||
| 20 | 4 | ||
| 24 | 16 | ||
| 40 | 19 |
5.2 Record entri
0 END | count:u64. Menandai akhir dan menyatakan berapa banyak entri yang mendahuluinya. |
1 FILE | name_len:u16 name mtime:i64 mode:u32 size:u64 data[size] crc32:u32 |
2 DIR | name_len:u16 name mtime:i64 mode:u32 |
3 MEDIA | name_len:u16 name mtime:i64 mode:u32 size:u64 filter:u8 method:u8 params_len:u8 params framed_stream crc32:u32 |
Nama berupa UTF-8 dengan pemisah /, maksimal 4096 byte.mtimeadalah detik Unix;modeadalah kata izin Unix (berkas Windows mendapat 0644 atau 0755, 0444 saat read-only).CRC32 selalu mencakup byte asli, yang membuat filter media dapat diverifikasi. Dalam record MEDIA, sizeadalah ukuran asli.framed_streamadalah rangkaian potongan[u32 length][bytes]yang diakhiri panjang nol, sehingga reader selalu dapat melewati entri media tanpa memahami filternya.
Parameter media
offset:u64 frames:u64 channels:u8 bits:u8 flags:u8 (bit flag 0 = big endian, bit 1 = signed) | ||
offset:u64 width:u32 rows:u32 bpp:u8 stride:u32 | ||
none: the framed stream holds raw segments and recompressed Deflate streams (section 7.9) |
offset (header, tag, palet, pola MOD) dan setelah wilayah sampel atau piksel (potongan akhir) disimpan tanpa perubahan di sekitar data yang difilter.5.3 Framing badan terenkripsi
5.4 Mengapa aliran padat?
5.5 Versioning
5.6 Badan multi-mesin (versi 3)
6 Mesin kompresi
6.1 Mengapa Zstandard
6.2 Pemetaan level
-m0 .. -m5) maupun level gaya zip (-0 .. -9) dan memetakannya ke level Zstandard:
-m0 | ||
-m1 | 1 | |
-m2 | 3 | |
-m3 | 9 | |
-m4 | 15 | |
-m5 (default) |
-0 menyimpan, -1 hingga -6 memakai Zstandard 1 hingga 6, -7 memakai 9, -8 memakai 12, dan -9 sama dengan -m5.6.3 Jendela besar dan pencocokan jarak jauh
-m5 dari 26.3 MB menjadi 24.4 MB dan pada -m4 dari 29.5 MB menjadi 26.8 MB, tanpa biaya kecepatan untuk -m4 dan sedikit untuk -m5. Jendela 2^27 berada dalam batas dekoder bawaan Zstandard, sehingga dekoder standar mana pun dapat membaca datanya.6.4 Multi-threading
6.5 Integritas di dalam aliran
6.6 Mode store
-m0 menulis entri tanpa kompresi. Ini berguna untuk data yang sudah terkompresi, dan juga satu-satunya mode di mana filter media sengaja dilewati: pengguna yang meminta store tidak mengharapkan datanya ditransformasi.6.7 Level maksimum: LZMA2 dan PPMd
Blok biner. Folder, berkas biner, entri media, dan entri hasil rekompresi Deflate dikompresi dengan LZMA2: preset 9, nice length 273, kedalaman match-finder 32, dan dictionary yang disesuaikan dengan datanya (1 hingga 128 MiB). Blok teks. Berkas yang 64 KiB pertamanya tidak mengandung byte nol dan hampir tidak ada karakter kontrol (kode sumber, teks, CSV, HTML, XML ...) masuk ke blok kedua. Empat jalur 1 MiB yang berurutan dari berkas-berkas ini dikompresi uji coba dengan PPMd varian I (order 8, model 192 MiB) dan dengan LZMA2 yang disetel untuk teks (lc 4, pb 0), dan hasil yang lebih kecil menang. Prosa menyukai PPMd; pohon sumber besar dengan banyak berkas yang hampir identik menyukai LZMA2, karena ia dapat menyalin pengulangan panjang melintasi berkas. Urutan. Di dalam setiap blok, berkas diurutkan menurut ekstensi, lalu nama berkas, seperti yang dilakukan 7-Zip, sehingga berkas yang identik atau mirip menjadi bertetangga. Bersama sampel uji coba yang berurutan, ini membuat set data umum 7.5 % lebih kecil.
7 Kecerdasan media
7.1 Deteksi berdasarkan isi
.dat tetap ditemukan dan berkas teks bernama .wav tidak.RIFF..WAVE, potongan fmt dengan PCM bilangan bulat (format 1, atau WAVE_FORMAT_EXTENSIBLE dengan sub-format PCM), 8/16/24/32 bit, 1 hingga 8 kanal, block alignment konsisten; lalu potongan data | ||
FORM..AIFF atau AIFC (compression NONE atau twos), potongan COMM dan SSND, sampel signed big-endian | ||
BM, header DIB 40 byte atau lebih, tanpa kompresi, 8, 24, atau 32 bit per piksel, baris piksel yang muat di berkas, wilayah antara 4 KiB dan 256 MiB |
7.2 Uji coba: memilih filter terbaik per berkas
Ambil sampel: seluruh wilayah sampel bila hingga 3 MiB, selain itu tiga jendela 768 KiB pada 5 %, 45 %, dan 85 % audio. Untuk gambar, baris pertama hingga sekitar 4 MiB. Kompres sampel dengan Zstandard polos level 3 (baseline) dan dengan setiap filter yang berlaku: NAC, Shuffle, dan Shuffle+Delta untuk audio 16/24/32-bit; NAC dan Shuffle+Delta untuk audio 8-bit; MED untuk gambar. Pertahankan filter dengan estimasi terkecil, tetapi hanya jika mengalahkan baseline setidaknya 2 %. Jika tidak, berkas disimpan dengan kompresi biasa. Tulis berkas dengan pemenangnya. Semua ini terjadi per berkas, sehingga satu arsip dapat memuat WAV yang dikodekan dengan metode berbeda di samping berkas biasa.
nikpak mt menjalankan pengukuran yang sama pada seluruh berkas dan mencetak tabel, yang merupakan cara benchmark bab 11 dieksplorasi. Pada opsi, -mc- menonaktifkan filter dan -mc+ memaksa filter bawaan tanpa uji coba.Setiap filter tepat dapat dibalik. CRC32 yang disimpan bersama setiap entri dihitung atas byte asli dan diperiksa saat ekstraksi, encoder NAC memverifikasi setiap blok saat menulis (bagian 7.4), dan -mc- mematikan seluruh lapisan. |
7.3 Codec audio NAC

Blok dan dekorelasi stereo
| 0 | ||
| 1 | R = L - S | |
| 2 | L = R + S | |
| 3 | sum = (M << 1) | (S & 1), L = (sum + S) >> 1, R = (sum - S) >> 1 |
Side = L - R dan Mid = (L + R) >> 1. Kanal side memerlukan satu bit lebih banyak daripada kanal normal dan dikodekan dengan bits + 1. Mode dipilih dengan murah: encoder menjumlahkan nilai absolut residu prediktor tetap order-2 dari L, R, M, dan S, lalu mengambil pasangan dengan total terkecil. Untuk rekaman yang kanalnya berkorelasi kuat, Mid/Side biasanya menghemat beberapa persen.Jenis sub-frame
Prediktor tetap
order 0: e[i] = x[i]
order 1: e[i] = x[i] - x[i-1]
order 2: e[i] = x[i] - 2*x[i-1] + x[i-2]
order 3: e[i] = x[i] - 3*x[i-1] + 3*x[i-2] - x[i-3]
order 4: e[i] = x[i] - 4*x[i-1] + 6*x[i-2] - 4*x[i-3] + x[i-4]
order pertama dari blok disimpan verbatim sebagai nilai warm-up.Pengodean prediktif linear (LPC)
Terapkan jendela Tukey (menirus pada seperempat pertama dan terakhir) ke blok, sehingga tepinya tidak mendistorsi statistik. Hitung autokorelasi r[0..32]dari sinyal yang dijendelakan.Jalankan rekursi Levinson-Durbin, yang menghasilkan set koefisien optimal untuk setiap order dari 1 hingga 32 dalam satu pass: k = (r[i] - sum a[j] r[i-j]) / err,a[i] = k,a[j] = a[j] - k a[i-j],err = err (1 - k^2).Kuantisasi koefisien riil menjadi bilangan bulat dengan presisi 12, 14, atau 15 bit (tergantung lebar sampel), memilih skala pangkat dua ( shift, 0 hingga 20) sehingga koefisien terbesar pas. Pembulatan memakai error feedback, sehingga kesalahan kuantisasi tidak menumpuk di antara koefisien.Evaluasi beberapa order (setnya tergantung level upaya, di bawah), hitung residu masing-masing, dan pertahankan yang estimasi ukuran totalnya terkecil, termasuk biaya pengiriman koefisiennya.
pred[i] = (q[0]*x[i-1] + q[1]*x[i-2] + ... + q[n-1]*x[i-n]) >> shift
e[i] = x[i] - pred[i] (n = order; the sum uses 64 bits)
Pengodean residu
u = (e << 1) XOR (e >> 63), sehingga nilai positif dan negatif kecil menjadi bilangan kecil) dan dikodekan dengan kode Rice terpartisi. Residu blok dibagi menjadi 2^p partisi (p dari 0 hingga 8, dipilih encoder); setiap partisi mendapat parameter Rice k-nya sendiri (5 bit). Sebuah nilai ditulis sebagai u >> k dalam unary (sekian nol dan satu satu) diikuti k bit rendah. k terbaik suatu partisi diturunkan dari jumlah nilai-nilainya, sehingga biaya setiap kandidat prediktor dapat diestimasi dengan murah dari jumlah berjalan alih-alih dengan mengodekannya.Level upaya
-m) menentukan berapa banyak order LPC yang dicoba per blok. Lebih banyak order berarti hasil sedikit lebih kecil dan encoder lebih lambat; kecepatan dekoder sama.| -m1 | 0 | 8, 16 |
| -m2, -m3 | 1 | 4, 8, 12, 16, 24, 32 |
| -m4, -m5 | 2 | 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 24, 28, 32 |
Tata letak bit sebuah blok
block := [stereo mode: 2 bits] sub-frame [sub-frame] (byte-padded)
sub-frame := type:2 ...
CONSTANT : value:width
VERBATIM : wasted:5 samples:(n x (width - wasted))
FIXED : wasted:5 order:3 warm-up residual
LPC : wasted:5 order-1:5 precision-1:4 shift:5
coefficients warm-up residual
residual := partition-order:4 per partition: k:5 Rice-coded values
7.4 Verifikasi diri
-mc-. Jalur fallback dilatih oleh pengujian unit, yang memaksa pengodean verbatim untuk setiap kombinasi kedalaman bit dan jumlah kanal, dan mekanisme ini mengubah kemungkinan bug kehilangan data senyap menjadi kondisi yang terdeteksi dan dapat dipulihkan.7.5 Shuffle dan Shuffle+Delta
Shuffle memisahkan byte sampel menjadi bidang: semua byte least-significant kanal 0, lalu semua byte most-significant kanal 0, lalu kanal 1, dan seterusnya, dalam blok 32768 frame. Bidang byte tinggi mulus dan bidang byte rendah memiliki alfabet yang sangat terbatas; coder entropi Zstandard memodelkan masing-masing jauh lebih baik daripada campuran yang saling terjalin. Shuffle+Delta lebih dulu mengganti setiap sampel dengan selisihnya terhadap sampel sebelumnya dari kanal yang sama (modulo lebar sampel, sehingga tepat dapat dibalik, dengan state yang dibawa melintasi blok) lalu melakukan shuffle. Ini membantu saat sinyalnya mulus tetapi tidak cukup dapat diprediksi untuk membuat NAC menang.
-m2 dan 47 % pada -m5, dibandingkan 63 % untuk Zstandard polos.7.6 Berkas ProTracker MOD
patterns = max(order table) + 1
sample_start = 1084 + patterns * 256 * channels (4 ch: 1024 B per pattern)
sample_bytes = sum of (length in words * 2) over the 31 descriptors,
clamped to the end of the file
7.7 Gambar BMP
Pisahkan wilayah piksel menjadi satu bidang per kanal (B, G, R, dan A untuk 32-bit), dengan mengingat byte padding per baris secara terpisah. Dekorelasi warna. Kurangi bidang hijau dari bidang biru dan merah (modulo 256). Pada foto, ketiga kanal berkorelasi kuat, sehingga selisihnya kecil. Prediksi setiap piksel dari tetangganya dengan prediktor MED (median edge detector), yang dipakai coder gambar LOCO-I: untuk kiri a, atasb, dan kiri-atasc, prediksinya adalahmin(a,b)jikac >= max(a,b),max(a,b)jikac <= min(a,b), dana + b - cselain itu. Kesalahan prediksi menggantikan piksel (modulo 256). Pada tepi, prediktor mengikuti tepinya; pada gradasi mulus, ia mengekstrapolasi gradasinya.Rangkai bidang residu dan byte padding lalu biarkan Zstandard mengompresnya. Wilayah mulus menjadi rentetan byte mendekati nol.
7.8 Mengapa ini mengalahkan RAR
7.9 Dokumen Office, PDF, dan gzip: rekompresi Deflate
Deteksi berdasarkan isi. Header lokal ZIP (PK\x03\x04) di awal berkas, %PDF-, atau header gzip; ekstensi tidak pernah dipakai. Dekode. Setiap aliran Deflate ditemukan (entri ZIP dengan metode 8, aliran PDF dengan header zlib, setiap anggota gzip) dan dianalisis dengan preflate (preflate-rs milik Microsoft). preflate mengembalikan data polos plus record koreksi kecil yang menjelaskan persis bagaimana encoder asli membuat pilihannya, apa pun encodernya. Penyimpanan. Berkas disimpan sebagai rangkaian segmen mentah dan pasangan (plain, corrections). XML polos atau deskripsi halaman kemudian masuk ke aliran padat, tempat LZMA2 mengompresnya menjadi sebagian kecil dari ukuran Deflate-nya. Verifikasi. Sebelum hasil dipakai, nikpak membangun ulang setiap aliran Deflate dan membandingkan panjang serta CRC32 seluruh berkas dengan aslinya. Jika ada yang berbeda, atau preflate gagal atau panik pada berkas yang cacat, berkas itu disimpan secara normal. Ekstraksi. Aliran Deflate dibuat ulang bit demi bit, sehingga .docx atau .pdf hasil ekstraksi identik byte-per-byte, dan CRC32-nya diperiksa seperti setiap entri.
8 Enkripsi
8.1 Model ancaman
Kerahasiaan isi berkas dan segala sesuatu tentangnya: nama, ukuran, stempel waktu, izin, dan jumlah berkas. Integritas dan keaslian: perubahan apa pun pada arsip, baik pada data, header, urutan data, maupun panjangnya, terdeteksi sebelum data yang salah diterima. Ketahanan terhadap tebakan: setiap tebakan kata sandi dibuat semahal yang praktis.
8.2 Dari kata sandi ke kunci: Argon2id
| 3 | ||
| 4 | ||
8.3 XChaCha20-Poly1305 dalam konstruksi STREAM
nonce (24 bytes) = random prefix (19 bytes)
| chunk counter (4 bytes, big endian)
| last-chunk flag (1 byte)
u32 length + ciphertext + tag 16-byte | |
8.4 Yang dapat dan tidak dapat dilihat pengamat
8.5 Penanganan kata sandi
Panjang minimum. 8 karakter saat membuat arsip; kata sandi yang lebih pendek ditolak dengan penjelasan. Konfirmasi. Permintaan interaktif bertanya dua kali, tidak menampilkan karakter yang diketik, dan menolak ketidakcocokan. Pembuatan. Tanpa kata sandi, nikpak menarik 24 karakter dari alfabet 56 simbol yang menghilangkan karakter serupa (0/O, 1/l/I), memakai rejection sampling pada generator acak aman kriptografis sistem operasi sehingga tidak ada simbol yang lebih mungkin daripada yang lain. Itu adalah 24 x log2(56), sekitar 139 bit entropi, dan ditampilkan sekali, dalam kotak yang ditandai jelas. Kebersihan memori. Kunci turunan dan string kata sandi dihapus dari memori saat tidak lagi diperlukan (crate zeroize).Saluran. Baris perintah ( -p), variabel lingkunganNIKPAK_PASSWORD, permintaan interaktif, atau stdin saat tidak ada terminal. Bentuk baris perintah praktis tetapi terlihat di daftar proses; bentuk lain lebih disukai.
8.6 Uji serangan
Kata sandi yang lemah selalu dapat ditebak; Argon2id membuatnya mahal tetapi tidak dapat menyelamatkan password123. nikpak belum diaudit secara independen. Ia tidak dapat bertahan dari keylogger, malware, atau orang yang membaca memori proses yang sedang berjalan. Untuk data yang keterbukaannya akan sangat merugikan, mintalah implementasinya ditinjau kriptografer terlebih dahulu. |
9 Ketahanan kuantum
9.1 Yang diubah komputer kuantum
9.2 Posisi nikpak
9.3 Bagaimana dengan kata sandinya?
9.4 "Harvest now, decrypt later"
9.5 Batas jujur dan jalan ke depan
"Quantum-resistant" berarti tidak ada algoritma kuantum yang diketahui mengalahkan pencarian generik terhadap primitif ini. Itu bukan bukti; kriptanalisis ChaCha20 dan Argon2 berlanjut, dan formatnya diberi versi sehingga parameter atau algoritma dapat diubah. Jika berbagi kunci publik pernah ditambahkan (mengenkripsi arsip ke kunci penerima), ia akan memakai skema hibrida, X25519 digabungkan dengan ML-KEM, sehingga aman jika salah satu komponennya bertahan. Ketahanan kuantum tidak melindungi dari kesalahan implementasi. Lihat bagian 8.6 dan 10.
10 Pengerasan dan ketangguhan
10.1 Ekstraksi aman
Path traversal ("zip slip"). Setiap nama entri dinormalkan: garis miring terbalik menjadi garis miring, komponen kosong dan .dibuang, dan komponen..apa pun menyebabkan entri dilewati dengan peringatan. Nama absolut kehilangan akarnya, sehingga/etc/passwddiekstrak di dalam folder tujuan.Nama Windows. Saat berjalan di Windows, komponen yang memuat < > : " | ? *atau karakter kontrol, berakhir dengan spasi atau titik, atau sama dengan nama perangkat terpesan (CON, PRN, AUX, NUL, COM1-9, LPT1-9) ditolak.Symbolic link. Sebelum menulis, setiap komponen jalur target yang sudah ada di bawah tujuan diperiksa; link tidak pernah diikuti. Berkas yang sudah ada dihapus lebih dulu dan yang baru dibuat dengan create_new, yang menolak membuka jalur yang sudah ada, sehingga link tidak dapat dipakai untuk mengalihkan penulisan.Bit berprivilege. Bit setuid, setgid, dan sticky tidak pernah dipulihkan; izin dimasker ke bit rwx biasa. Berkas gagal. Berkas yang CRC32-nya tidak cocok dihapus, tidak ditinggalkan.
../../evil.txt, /tmp/evil.txt, ..\..\evil.txt, dan ok/../../evil.txt diekstrak dalam pengujian: tidak ada yang lolos dari tujuan, entri yang tidak aman dilaporkan dan dilewati, dan symlink yang ditanam di tujuan ditolak.10.2 Dekoder yang dibatasi
Parameter Argon2id diperiksa rentangnya sebelum alokasi apa pun (bagian 8.2). Potongan terenkripsi harus memiliki panjang antara 16 byte dan 64 KiB + 16; nama maksimal 4096 byte; blok audio harus menyatakan panjang yang masuk akal; wilayah BMP dibatasi 256 MiB; kode Rice unary dibatasi. Dekoder audio dan media diumpani ribuan masukan acak dan bit-terbalik dalam pengujian unit dan harus mengembalikan kesalahan, tidak pernah panik atau abort. Kode nikpak sendiri tidak memuat blok unsafe, dan pemeriksaan batas Rust mengubah kesalahan logika apa pun yang akan menjadi bug korupsi memori di C menjadi kegagalan yang bersih.
t lebih dulu jika itu penting.10.3 Pembuatan aman dan kesalahan jujur
Arsip ditulis ke name.nik.tmpdan diganti namanya hanya saat lengkap; sebuah guard menghapus berkas sementara pada kegagalan apa pun, sehingga proses yang terputus tidak pernah meninggalkan arsip setengah tertulis atau tergantikan.Jika berkas menjadi lebih pendek saat sedang diarsipkan, nikpak membatalkan dengan pesan eksplisit alih-alih menulis entri yang tidak konsisten. Berkas yang tidak terbaca, symbolic link, dan berkas khusus dilewati dengan peringatan (kode keluar 1), dan arsip tidak pernah ditambahkan ke dirinya sendiri. Kesalahan diklasifikasikan agar skrip dapat bereaksi: kesalahan checksum atau frame di dalam arsip adalah kerusakan (exit 3), kegagalan autentikasi adalah kata sandi salah atau perusakan (exit 11), penolakan penulisan adalah kesalahan fatal (exit 2).
11 Benchmark
11.1 Metode
-ma5); nikpak 1.1.0 dibangun dalam mode release dengan LTO; FLAC 1.x -8 sebagai acuan audio. | |
-m3 (bawaan RAR) dan -m5 (terbaik). Untuk uji data umum juga -s (solid) dan -md256m (dictionary 256 MB), karena arsip nikpak selalu solid dan perbandingan yang adil mengharuskan RAR diizinkan hal yang sama. | |
cmp untuk berkas media, SHA-256 dari semua 10,949 berkas untuk set umum). |
Materi uji
Musiknya sintetis: ia dirender dari MIDI dan memuat penggalan yang berulang, yang membantu setiap alat berbasis LZ, termasuk tahap Zstandard setelah NAC. Rekaman nyata memuat lebih sedikit pengulangan persis, sehingga ukuran absolut akan berbeda. Perbandingan memperlakukan semua alat sama, dan hasil FLAC pada berkas yang sama menegaskan bahwa codec audio itu sendiri kompetitif, tetapi pembaca dengan materi spesifik harus mengukurnya: nikpak mt melakukan hal itu. |
11.2 Berkas media
| 9,183,956 | 2,862,744 | 2,035,223 | 1,750,706 | ||
| 2,507,557 | 1,070,290 | 966,622 | 927,973 | ||
| 2,991,820 | 1,605,879 | 1,529,219 | 1,418,532 | ||
| 17,371,848 | 11,024,411 | 9,415,519 | 9,411,898 | ||
| 4,342,996 | 3,112,135 | 2,635,819 | 2,634,669 | ||
| 2,171,520 | 844,160 | 742,462 | 740,751 | ||
| 28,362,206 | 21,467,283 (-m3) | 18,689,529 | 18,688,030 |
-m3, sehingga baris itu adalah perbandingan yang lebih lemah daripada yang lain.

Yang ditambahkan filter media
| 3,580,971 | 2,035,223 | 43.2 % | |
| 1,260,607 | 966,622 | 23.3 % | |
| 1,876,722 | 1,529,219 | 18.5 % | |
| 15,585,422 | 9,415,519 | 39.6 % | |
| 3,887,183 | 2,635,819 | 32.2 % | |
| 1,078,493 | 742,462 | 31.2 % |
Perbandingan dengan FLAC
-8, encoder acuan khusus, menghasilkan 9,407,019 byte. Aliran NAC untuk audio yang sama adalah 9,425,305 byte, dalam 0.2 %, dan arsip nikpak jadinya 9,415,519 byte. Untuk versi mono 22 kHz dan 8-bit, NAC lebih kecil daripada FLAC (2,635,446 lawan 2,638,954, dan 785,890 lawan 798,810 untuk wilayah audio saja), dan untuk 24-bit arsip (18.69 MB) lebih kecil daripada 19.12 MB milik FLAC. FLAC jauh lebih lemah pada berkas galeri (2.50 MB lawan 1.61 MB milik RAR), karena alasan yang dijelaskan di bagian 7.5; inilah kasus saat filter lain mendapatkan tempatnya.11.3 Data umum
| 24,443,483 | 45.6 s | 1.8 s | |
| 25,862,475 | 36.2 s |
| |
| 26,002,812 | 26.7 s |
| |
| 26,536,863 | 16.7 s | 1.5 s | |
| 26,814,023 | 13.5 s |
| |
| 30,329,965 | 2.0 s |
| |
| 36,266,743 | 0.9 s | 0.8 s | |
| 50,851,230 | 14.8 s |
| |
| 50,974,773 | 9.7 s | 2.3 s |

Level maksimum: nikpak menghasilkan arsip 5.5 % lebih kecil daripada yang terbaik RAR (24.4 lawan 25.9 MB). RAR lebih cepat pada level ini (26.7 hingga 36.2 s lawan 45.6 s). Ukuran setara: nikpak -m4berada dalam sekitar 1 % dari level solid bawaan RAR dalam 81 % waktu (13.5 s lawan 16.7 s).Level cepat: -m2menukar rasio dengan kecepatan: 18 kali lebih cepat daripada RAR solid-m3, dan 37 % lebih besar. Ini adalah level untuk cadangan dan pipeline di mana waktu lebih penting daripada beberapa megabyte terakhir.Tidak solid: arsip bawaan (non-solid) RAR hampir dua kali ukuran arsip solidnya pada data banyak-berkas-kecil ini. Siapa pun yang membandingkan nikpak dengan RAR harus menambahkan -ske RAR.
11.4 Kecepatan pada satu berkas media besar

| 1.45 s (-m2) | 2.54 s (-m3) | ||
| 3.14 s (-m5) | 5.87 s (-m5) | ||
| 0.28 s | 0.23 s |
11.5 Overhead enkripsi
11.6 Mereproduksi hasil
# media: which filter wins, per file
nikpak mt song.wav tracker.mod photo.bmp
# archive with nikpak and RAR, then compare
nikpak a -q -ep -m2 test.nik *.wav
rar a -ep -m5 -ma5 test.rar *.wav
# fair comparison on many files: give RAR solid mode
rar a -r -s -m5 -ma5 -md256m data.rar data
nikpak a -m5 data.nik data
# verify
nikpak x -o+ test.nik restore\
11.7 Putaran kedua: nikpak, RAR 7, 7-Zip, dan ZIP
Metode
Materi uji
| 8 | 6,987,840 | ||
| 16 | 2,252,604 | ||
| 35 | 2,991,820 | ||
| 4 × 1 | 53,417,226 | ||
| 18 | 11,793,318 | ||
| 60 | 39,100,915 | ||
| 11,473 | 190,454,632 |
Level maksimum: ukuran arsip
| 6,987,840 | 3,557,350 | 4,394,310 | 4,195,043 | 4,974,680 | |
| 2,252,604 | 1,127,607 | 1,264,245 | 1,166,855 | 1,408,085 | |
| 2,991,820 | 1,346,484 | 1,596,971 | 1,484,879 | 1,852,279 | |
| 17,760,408 | 8,731,989 | 10,460,042 | 10,666,922 | 15,225,764 | |
| 4,440,136 | 2,458,867 | 2,797,026 | 2,784,080 | 3,736,722 | |
| 2,220,090 | 606,840 | 725,416 | 642,341 | 836,989 | |
| 28,996,592 | 18,198,056 | 21,229,465 | 25,542,036 | 26,980,770 | |
| 11,793,318 | 2,741,898 | 3,519,622 | 3,259,868 | 4,223,579 | |
| 39,100,915 | 6,887,729 | 11,186,217 | 10,085,779 | 17,399,998 | |
| 190,454,632 | 28,175,618 | 33,606,893 | 28,879,398 | 62,198,510 |

Level cepat: ukuran dan waktu pembuatan
| 54.0 % · 0.39 s | 63.0 % · 2.09 s | 60.1 % · 3.51 s | 71.2 % · 0.35 s | |
| 52.4 % · 0.61 s | 56.2 % · 0.43 s | 51.9 % · 0.69 s | 62.7 % · 0.10 s | |
| 51.1 % · 0.41 s | 53.6 % · 0.71 s | 49.6 % · 1.96 s | 61.9 % · 0.24 s | |
| 49.2 % · 1.72 s | 59.9 % · 3.60 s | 60.1 % · 14.03 s | 85.7 % · 0.82 s | |
| 55.4 % · 0.58 s | 64.1 % · 0.95 s | 62.7 % · 2.14 s | 84.2 % · 0.22 s | |
| 27.4 % · 0.77 s | 33.3 % · 0.52 s | 28.9 % · 2.13 s | 38.2 % · 0.32 s | |
| 62.8 % · 2.06 s | 73.6 % · 7.54 s | 88.1 % · 13.54 s | 93.0 % · 1.19 s | |
| 35.2 % · 0.11 s | 30.4 % · 5.53 s | 27.7 % · 11.76 s | 36.0 % · 0.89 s | |
| 38.0 % · 0.22 s | 29.5 % · 8.25 s | 26.2 % · 21.85 s | 44.7 % · 1.83 s | |
| 25.3 % · 1.67 s | 18.0 % · 48.19 s | 17.0 % · 93.71 s | 32.9 % · 7.32 s |
Data umum secara rinci
| 28,175,618 | 14.8 % | 154.3 s | 5.6 s | |
| 28,879,398 | 15.2 % | 120.9 s | 6.0 s | |
| 32,350,575 | 17.0 % | 73.6 s | 7.0 s | |
| 32,375,802 | 17.0 % | 93.7 s | 4.5 s | |
| 33,295,133 | 17.5 % | 37.8 s | 3.3 s | |
| 33,606,893 | 17.6 % | 72.4 s | 6.7 s | |
| 34,236,198 | 18.0 % | 48.2 s | 5.9 s | |
| 48,229,284 | 25.3 % | 1.7 s | 0.9 s | |
| 56,038,351 | 29.4 % | 20.2 s | 6.9 s | |
| 62,198,510 | 32.7 % | 28.2 s | 6.9 s | |
| 62,672,415 | 32.9 % | 7.3 s | 5.4 s |

Dari 1.1.0 ke 1.2.0
| 3,306,819 | 2,741,898 | 3,259,868 | ||
| 10,417,750 | 6,887,729 | 10,085,779 | ||
| 31,322,041 | 28,175,618 | 28,879,398 |
Membaca hasil dengan jujur
nikpak -m5 terkecil pada setiap set. Terhadap 7-Zip -mx9 ia 2.4 hingga 31.7 % lebih kecil, terhadap RAR 7 -m5 10.8 hingga 38.4 %, dan terhadap ZIP -9 19.9 hingga 60.4 %. Pada audio rekaman, NAC memprediksi apa yang hanya bisa dicocokkan kompresor berbasis LZ: pada musik 24-bit, 7-Zip menghemat 12 % dan nikpak 37 %. Berkas office: 31.7 % lebih kecil daripada 7-Zip. Rekompresi Deflate mengubah 6.6 MB .xlsx dan 1.9 MB .docx menjadi XML polos yang dikompres LZMA2 jauh lebih baik daripada yang dilakukan Deflate (6.89 MB lawan 10.09 MB). Bahkan -m4 1.3 % lebih kecil daripada 7-Zip -mx9 dan lebih cepat (16 s lawan 26 s). Harganya pada -m5 adalah waktu: 81 s lawan 26 s. Teks: 15.9 % lebih kecil, dalam separuh waktu. PPMd menang pada prosa (6.4 s lawan 12.9 s untuk membuat). Karena PPMd mendekode selambat saat mengodekan, ekstraksi memakan 2.7 s alih-alih 0.2 s. Kode sumber: 2.4 % lebih kecil, keunggulan tipis. 28.2 MB lawan 28.9 MB, dalam 154 s lawan 121 s. Pengurutan menurut jenis berkas dan pemilihan mesin pada sampel berurutan (6.7) membuat perbedaannya. Level cepat -m2: tercepat, bukan terkecil. nikpak -m2 memerlukan 1.7 s untuk set umum, lawan 93.7 s untuk 7-Zip -mx5 (56 kali lebih lama), 48.2 s untuk RAR, dan 7.3 s untuk ZIP. Ia lebih kecil daripada 7-Zip -mx5 pada gambar dan pada sebagian besar audio (berkas MOD dan gallery WAV 1 hingga 3 % lebih besar), tetapi lebih besar pada teks, berkas office, dan kode sumber (49.0 % pada set umum). Karena itu, sejak versi 1.2.1 nikpak memakai -m5 secara bawaan; -m2 harus diminta. ZIP cepat tetapi terbesar di mana-mana. Bahkan nikpak -m2 mengalahkan ZIP -9 pada setiap set. ZIP membuat arsip media kecil lebih cepat daripada nikpak -m2, karena Deflate melakukan jauh lebih sedikit pekerjaan daripada codec NAC, tetapi lebih lambat pada teks, berkas office, dan kode sumber. Ekstraksi. Set umum terekstrak dalam 0.9 s (nikpak -m2) atau 5.6 s (-m5), lawan 6.0 s untuk 7-Zip, 6.7 s untuk RAR, dan 6.9 s untuk ZIP. Arsip dengan aliran Deflate yang direkompresi mengekstrak lebih lambat, karena setiap aliran dibangun ulang (2.1 s lawan 0.7 s untuk set office). RAR pada mesin ini. RAR lebih lambat di sini daripada di 11.3 (72 s alih-alih 27 s untuk -m5 -s pada jumlah kode sumber yang serupa). Mesin dan data berbeda, sehingga kedua bagian tidak boleh dicampur. Dalam putaran ini setiap alat memenuhi kondisi yang sama.
Artinya bagi nikpak
12 nikpak dan RAR dibandingkan
12.1 Di mana nikpak unggul
-hp | ||
12.2 Di mana RAR unggul
| 45.6 s | ||
| 0.28 s | ||
12.3 Ketahanan kuantum dalam perspektif
12.4 Mana yang dipilih
Pilih nikpak untuk arsip audio, gambar, musik tracker, dan kode sumber yang ukuran serta kecepatannya penting, untuk cadangan terskrip, untuk enkripsi bawaan yang kuat, dan saat format terbuka yang terdokumentasi bernilai. Pilih RAR saat Anda memerlukan record pemulihan, arsip multi-volume atau self-extracting, pembaruan di tempat, atau harus bertukar arsip dengan orang yang hanya punya alat RAR. Gunakan keduanya: tidak ada yang menghentikan alur kerja memakai nikpak untuk media massal dan cadangan terenkripsi sambil mempertahankan RAR untuk distribusi.
12.5 Dan 7-Zip serta ZIP?
Pilih nikpak -m5 untuk arsip terkecil. Ia 2.4 hingga 31.7 % lebih kecil daripada 7-Zip -mx9 pada setiap set yang diukur: 31.7 % pada berkas office, 15.9 % pada teks, dan 2.4 % pada kode sumber. Pilih nikpak -m2 untuk cadangan cepat (56 kali lebih cepat daripada bawaan 7-Zip pada kode sumber). nikpak juga punya enkripsi yang lebih kuat: 7-Zip memakai AES-256 dengan penurunan kunci SHA-256 yang tidak memakan memori, dan hanya menyembunyikan nama berkas dengan -mhe. Pilih 7-Zip saat waktu lebih penting pada level maksimum (ia lebih cepat pada set office dan kode sumber yang besar), saat Anda butuh level bawaannya kecil pada dokumen, atau saat Anda perlu membuka banyak format yang dibaca 7-Zip. Pilih ZIP hanya untuk kompatibilitas. Setiap sistem operasi membukanya tanpa perangkat lunak tambahan, tetapi nikpak -m5 19.9 hingga 60.4 % lebih kecil, dan enkripsi tradisional ZIP lemah.
13 Membangun, menyebarkan, dan mengintegrasikan
13.1 Windows dengan PowerShell
winget install Rustlang.Rustup
$o = '--wait --passive --add Microsoft.VisualStudio.Workload.VCTools'
$o += ' --includeRecommended'
winget install Microsoft.VisualStudio.2022.BuildTools --override $o
winget tidak tersedia, pasang Rust dari rustup.rs dan Build Tools for Visual Studio dengan beban kerja Desktop development with C++. Lalu, di folder yang memuat sumbernya:.\build.ps1 # builds dist\nikpak.exe and dist\unNik.exe
.\build.ps1 -Test # runs the unit tests first
# if PowerShell refuses to run scripts:
powershell -ExecutionPolicy Bypass -File .\build.ps1
build.ps1 memeriksa bahwa Cargo terpasang (dan menjelaskan cara memasangnya jika tidak), menjalankan build, menjelaskan penyebab umum jika gagal, dan menyalin berkas eksekusi ke dist\nikpak.exe.Installer Windows
.\build.ps1 -Installer (atau npm run installer) juga membangun program setup dist\nikpak--setup.exe dengan Inno Setup 6.3 atau lebih baru (pasang sekali dengan winget install JRSoftware.InnoSetup). Skripnya adalah installer\nikpak.iss; versi diambil dari Cargo.toml. Berkas setup inilah yang diunggah ke situs shareware dan unduhan.Secara bawaan ia memasang hanya untuk pengguna saat ini, tanpa hak administrator atau permintaan UAC, ke %LOCALAPPDATA%\Programs\NikPak. Halaman pertamanya menawarkan "install for all users" (Program Files, memerlukan hak administrator). Ia menampilkan LICENSE.txt untuk disetujui dan memasang nikpak.exe, unNik.exe, ikon, LICENSE.txt, THIRD-PARTY-NOTICES.txt, dan CHANGELOG.md. Ia menambahkan entri Start menu, ikon desktop opsional, dan atas permintaan, folder ke PATH untuk baris perintah. Ia mendaftarkan uninstaller di Settings > Apps. Pintasan: NikPak, unNik, dan lisensi di Start menu; NikPak di desktop (selalu) dan unNik di desktop sebagai opsi. Berkas .nik selalu didaftarkan (sejak 1.5.2): mereka mendapat ikonnya sendiri (nikfile.ico, halaman dengan ritsleting, seperti berkas .zip), nama jenis "NikPak archive", dan klik dua kali membukanya di unNik ("Open with unNik" di menu klik kanan). unNik juga terdaftar di "Open with" dan di Default apps. Uninstaller menghapus pendaftaran. Jika berkas .nik sudah diatur terbuka dengan program lain, Windows mempertahankan pilihan itu hingga unNik dipilih sekali di "Open with". "Launch NikPak" terakhir menjalankan NikPak sebagai pengguna normal, tidak pernah sebagai administrator, sehingga drag and drop berfungsi. Pembaruan dipasang di atas versi sebelumnya (AppId tetap). Lisensi di %APPDATA%\nikpak dipertahankan saat pembaruan dan uninstall. Setup tidak pernah memuat kunci atau berkas kunci. Installer berjalan dalam English atau French, mengikuti Windows. Sebelum menerbitkan, tanda tangani nikpak.exe dan setup dengan sertifikat code-signing, sehingga Windows SmartScreen tidak memperingatkan penerbit yang tidak dikenal.
nikpak.exe, unNik.exe, dua setup, dan SHA256SUMS.txt — menyalinnya ke binaries\, membangun ulang situs web, dan mengunggahnya lewat FTP (-NoUpload melewati pengunggahan). Setup kedua, unnik--setup.exe (installer\unnik.iss), memasang unNik saja, peramban arsip gratis; saat NikPak sudah terpasang ia hanya memasang programnya, sehingga menu tidak pernah ganda.13.2 Membangun dengan npm
package.json kecil yang skripnya sekadar memanggil Cargo, sehingga pengembang yang hidup dalam alur kerja Node.js dapat mengetik perintah yang sudah dikenalnya:npm run build # cargo build --release
npm run dist # build.ps1 -> dist\nikpak.exe
npm test # cargo test --release
npm run clean # cargo clean
13.3 Berkas eksekusi mandiri
.cargo/config.toml menautkan runtime C secara statis untuk target Windows MSVC. nikpak.exe yang dihasilkan (beberapa MB dengan antarmuka grafis, sekitar 2.3 MB tanpa antarmuka) karena itu tidak memiliki dependensi DLL dan tidak memerlukan Visual C++ Redistributable pada mesin tempat ia berjalan. Salin ke folder di PATH untuk memakainya di mana saja. Profil release mengaktifkan optimisasi penuh, optimisasi link-time, satu unit code-generation, penghapusan simbol, dan panic = abort untuk biner yang kecil dan cepat.13.4 macOS dan Linux
./build.sh # builds and copies the result to dist/nikpak
# or: cargo build --release
sudo cp dist/nikpak /usr/local/bin/
xcode-select --install); di Debian atau Ubuntu pasang compiler C (sudo apt install build-essential). Rust sendiri berasal dari curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh. Pustaka kompresi dikompilasi dari sumber C-nya oleh Cargo, sehingga tidak diperlukan pustaka sistem../package-unix.sh, yang membangun nikpak dan unNik lalu mengemasnya dengan install.sh menjadi binaries\nikpak--macos.zip (biner universal: Intel + Apple silicon) atau binaries\nikpak--linux-.tar.gz. Setel ZIG=1 di Linux untuk membangun dengan cargo-zigbuild terhadap glibc 2.28, sehingga program juga berjalan di distribusi lama.13.5 Dependensi
Cargo.lock, yang merupakan bagian dari paket sumber, sehingga setiap build memakai kode yang sama.zstd | |
chacha20poly1305 | |
argon2 | |
rand | |
zeroize | |
rpassword | |
crc32fast | |
glob | |
liblzma | |
ppmd-rust | |
preflate-rs | |
eframe / egui | |
rfd | |
ed25519-dalek | |
rustybuzz, unicode-bidi |
13.6 Skripting
$archive = "D:\Backups\docs-$(Get-Date -Format yyyy-MM-dd).nik"
# the password comes from a file or secret store, not from the script
$env:NIKPAK_PASSWORD = Get-Content "$env:USERPROFILE\.nikpak-secret"
nikpak a -p -m3 -inul $archive "$env:USERPROFILE\Documents"
if ($LASTEXITCODE -gt 1) { throw "nikpak failed: $LASTEXITCODE" }
nikpak t -inul $archive # verify what was written
if ($LASTEXITCODE -ne 0) { throw "archive verification failed" }
export NIKPAK_PASSWORD="$(cat ~/.nikpak-secret)"
nikpak a -p -m3 -inul "backup-$(date +%F).nik" ~/Documents || [ $? -eq 1 ]
nikpak lb backup-2026-10-16.nik | grep -i '\.wav$'
13.7 Total Commander
nik; gunakan a untuk packing dan x untuk unpacking; biarkan front-end melewatkan @listfile untuk daftar berkas panjang; beri -o+ atau -y untuk ekstraksi tanpa pengawasan; dan kirim kata sandi dengan -p atau variabel NIKPAK_PASSWORD, karena front-end grafis tidak punya konsol untuk meminta.14 Pengujian dan verifikasi
14.1 Pengujian unit
cargo test --release:
14.2 Pengujian end-to-end
Setiap arsip benchmark diekstrak dan dibandingkan dengan sumbernya, byte demi byte (SHA-256 untuk set 10,949 berkas), pada beberapa level. Arsip campuran (WAV, MOD, BMP, teks, data acak, subfolder) dibuat, didaftar, diuji, diekstrak seluruhnya, dan satu berkas diekstrak dari tengahnya. Arsip yang sama dibuat dengan enkripsi, diuji dengan kata sandi benar dan salah, lalu diekstrak. Arsip yang ditulis format versi sebelumnya (1.0) dibuka oleh 1.1. Pemasukan kata sandi interaktif dilatih melalui pseudo-terminal: kata sandi cocok, tidak cocok, entri kosong (pembuatan), kata sandi benar dan salah saat membuka.
14.3 Uji serangan
14.4 Cacat yang ditemukan pengujian
15 Keterbatasan dan peta jalan
15.1 Keterbatasan saat ini
-o+. | |
-m4 dan -m5 memakai jendela 128 MiB; mendekompresinya memerlukan memori sebesar itu. | |
Single-threaded and the slowest level. Creating needs up to about 1.1 GB of memory, extracting up to about 350 MB. | |
cargo test --release di sana sebelum mengandalkan build. |
15.2 Peta jalan
Cargo.lock di repositori agar build dapat direproduksi, dan jalankan cargo test --release dalam job continuous-integration setiap platform yang Anda dukung.A Lampiran A: konstanta dan batas format
89 4E 49 4B 0D 0A 1A 0A | |
u32 panjang big-endian di depan | |
-mt) |
B Lampiran B: glosarium