NikPak

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

nikpak adalah pengarsip baris perintah untuk format .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 -help yang mendokumentasikan setiap opsi.

1.2 Hasil sekilas

MetrikHasilDibandingkan dengan
Foto BMP38.8 % lebih kecilRAR 7.00 -m5
Musik stereo, 44.1 kHz 16-bit14.6 % lebih kecil (setara dengan FLAC -8)RAR 7.00 -m5
Berkas ProTracker MOD13.3 % lebih kecilRAR 7.00 -m5
Audio mono, 8-bit dan 16-bit12.2 % dan 15.3 % lebih kecilRAR 7.00 -m5
197 MB berkas sumber, level maksimum5.5 % lebih kecil (24.4 MB vs 25.9 MB)RAR 7.00 -m5 -s -md256m
Data yang sama, level cepat -m2 0.9 sRAR 7.00 -m3 solid: 16.7 s
EnkripsiArgon2id + XChaCha20-Poly1305RAR5: AES-256-CBC + PBKDF2
Semua 10 set uji, level maksimum, vs 7-Zip2.4 hingga 31.7 % lebih kecil7-Zip 23.01 -mx9 (bagian 11.7)
Berkas Office (doc, docx, xls, xlsx, csv, pdf)31.7 % lebih kecil7-Zip 23.01 -mx9 (bagian 11.7)
Semua 10 set uji, level maksimum, vs ZIP19.9 hingga 60.4 % lebih kecilZIP -9, Info-ZIP 3.0 (bagian 11.7)
Berkas eksekusisatu berkas, tanpa dependensi; sekitar 9 MB dengan jendela, 2.3 MB hanya baris perintahWindows, macOS, Linux



Cara angka-angka ini diperoleh
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?

nikpak ditujukan bagi orang yang mengarsipkan media atau kode sumber dalam jumlah besar dan peduli pada ukuran serta kecepatan, bagi pengembang yang menginginkan pengarsip yang dapat diskrip dengan kode keluar yang masuk akal dan format yang terdokumentasi, serta bagi siapa pun yang membutuhkan enkripsi kuat tanpa mempercayai implementasi tertutup. Karena baris perintahnya mengikuti konvensi RAR, front-end seperti Total Commander dapat mengendalikannya dengan sedikit atau tanpa konfigurasi ulang.

1.4 Cara membaca panduan ini

Bab 2 dan 3 menjelaskan apa yang dilakukan nikpak dan cara menggunakannya. Bab 4 hingga 7 menjelaskan arsitektur, format berkas, mesin kompresi, dan codec media. Bab 8 hingga 10 membahas enkripsi, ketahanan kuantum, dan pengerasan. Bab 11 menyajikan benchmark, bab 12 membandingkan nikpak dengan RAR secara jujur, dan bab 13 hingga 15 membahas pembangunan, pengujian, dan peta jalan.

1.5 Komunitas dan kontak

Berita, pertanyaan, ide, dan laporan bug: penulis nikpak dapat dihubungi melalui

  • Telegramhttps://t.me/cryptonikko
  • Xhttps://x.com/cryptonikkoid
  • Discordhttps://discord.com/users/1537826350759415811

Ketiga tautan yang sama ditampilkan sebagai tombol bulat berwarna di bagian bawah jendela nikpak, di bawah folder tujuan (bagian 3.7), dan di akhir nikpak -help.

2 Ikhtisar fitur

2.1 Kemampuan

AreaYang disediakan nikpak
KompresiZstandard (multi-utas, padat) pada -m1 hingga -m4, dengan jendela 128 MiB dan pencocokan jarak jauh pada -m4. Pada -m5 badan multi-mesin: LZMA2 untuk data biner dan PPMd untuk teks, dipilih melalui uji coba; berkas diurutkan menurut jenis seperti pada 7-Zip.
Kecerdasan mediaDeteksi WAV, AIFF, ProTracker MOD, dan BMP berdasarkan isi; uji coba per berkas di antara empat filter (NAC, Shuffle, Shuffle+Delta, MED); fallback otomatis ke kompresi biasa.
Office, PDF, gzipRekompresi Deflate (preflate): aliran Deflate di dalam berkas docx, xlsx, pptx, odt, ods, epub, jar, zip, pdf, dan gz didekode, dikompresi jauh lebih baik, dan dibangun ulang bit demi bit saat ekstraksi (-m4, -m5).
EnkripsiPenurunan kunci Argon2id (64 MiB), XChaCha20-Poly1305 dalam potongan 64 KiB yang terautentikasi; nama, ukuran, tanggal, dan izin dienkripsi.
Kata sandiPermintaan interaktif dengan konfirmasi, variabel lingkungan, stdin, baris perintah; pembuatan kata sandi acak yang kuat secara otomatis bila tidak ada yang diberikan.
IntegritasCRC32 dari byte asli setiap berkas; autentikasi AEAD untuk arsip terenkripsi; penanda akhir dengan jumlah entri; codec audio yang memverifikasi diri sendiri.
Baris perintahPerintah gaya RAR (a x e l v lb t p d), ekstraksi satu berkas, folder, atau wildcard, serta saklar, alias gaya zip, wildcard, @listfiles, pengecualian, kebijakan timpa, mode senyap, kode keluar eksplisit.
KeamananPerlindungan zip-slip, penolakan symlink, penghapusan setuid, dekoder yang dibatasi, penulisan arsip atomik, keamanan memori Rust.
PortabilitasWindows (PowerShell, cmd), macOS, Linux; satu berkas eksekusi statis; hasil byte-persis di setiap platform.
Antarmuka grafisSaat dijalankan tanpa argumen, nikpak membuka jendela drop minimalis: lepaskan (atau pilih) berkas atau folder untuk mengompresnya dengan kompresi terbaik; cincin progres, folder tujuan yang diingat (bagian 3.7).
Peramban arsipunNik.exe, gratis untuk semua orang: menjelajah folder, mencari, melihat berkas teks dan biner, mengekstrak pilihan, dan menghapus berkas dalam arsip .nik (bagian 3.9).
Skin55 skin jendela, termasuk 14 skin pemandangan yang dilukis; kotak skin yang berdiri di samping jendela dengan tombol Apply Skin dan Cancel; impor berkas Nikkomander .skin.json milik Anda (bagian 3.10).
Menu pengelola berkasSubmenu “NikPak” di Explorer, Dolphin, Nemo, Nautilus, dan Finder: Add to archive, Extract here, Extract to its own folder, Open with unNik; satu arsip untuk pilihan beberapa item (bagian 3.11).



2.2 nikpak dan RAR berdampingan

Tabel di bawah membandingkan nikpak 1.1 dengan RAR 7 sebagaimana diukur dalam proyek ini, dan menyatakan dengan jelas di mana RAR lebih unggul. Bab 12 membahas poin-poinnya satu per satu.


nikpak 1.1RAR 7
Kompresi mediaCodec tanpa rugi khusus yang dipilih per berkas melalui uji cobaAlgoritma umum dengan filter bawaan
Kode sumber, level maksimum24.4 MB (lebih kecil), 45.6 s25.9 MB, 26.7 - 36.2 s
Kecepatan pada level cepat0.9 s untuk 197 MB (-m2) 9.7 - 16.7 s (-m3)
EnkripsiArgon2id + XChaCha20-Poly1305 (terautentikasi)AES-256-CBC + PBKDF2-HMAC-SHA256
Nama berkas selalu terenkripsiYaHanya dengan -hp
Hash kata sandi yang memakan memoriYa (64 MiB)Tidak
Pembangkit kata sandi acakBawaanTidak bawaan
Kode sumber, bahasaSumber lengkap, Rust (aman memori)Proprietary, C++
Record pemulihan, volume, SFX, pembaruan di tempatBelumYa (WinRAR)
Rekam jejakBaru, belum diauditPuluhan tahun



3 Referensi baris perintah

nikpak mengikuti sintaks yang dikenal pengguna RAR: nikpak [options] [files...]. Opsi dapat muncul di mana saja sebelum atau sesudah nama arsip; -- mengakhiri penguraian opsi.

3.1 Perintah

PerintahArti
aMembuat arsip baru. .nik ditambahkan bila nama tidak memiliki ekstensi. Folder selalu ditelusuri secara rekursif.
xMengekstrak dengan jalur lengkap: semuanya, atau hanya nama, folder, dan wildcard yang diberikan setelah nama arsip (nikpak x backup.nik Docs/report.pdf mengekstrak satu berkas). Pemisah jalur di akhir (atau -d dir) menentukan tujuan.
eMengekstrak tanpa jalur: setiap berkas langsung masuk ke folder tujuan.
lMembuat daftar isi (semua, atau hanya nama yang cocok): atribut, ukuran, tanggal (UTC), nama, total.
vDaftar lengkap: menambahkan CRC32 setiap berkas.
lbDaftar polos: satu nama per baris, dirancang untuk skrip dan front-end GUI.
tUji: mendekompresi semuanya, memeriksa setiap CRC32, dan untuk arsip terenkripsi, memverifikasi autentikasi.
pMencetak berkas ke keluaran standar: semuanya, atau yang disebutkan (nikpak p notes.nik todo.txt | more).
dMenghapus berkas atau folder (folder turut membawa isinya) dari arsip. Arsip ditulis ulang tanpa berkas/folder itu; arsip terenkripsi mempertahankan kata sandinya. Nama wajib diberikan.
mtUji media: mendeteksi berkas WAV/AIFF/MOD/BMP dan menunjukkan ukuran yang dicapai setiap filter media. Tidak menulis apa pun.
(none)Saat dijalankan tanpa argumen apa pun (misalnya dengan mengeklik dua kali nikpak.exe), nikpak justru membuka jendelanya (bagian 3.7).



3.2 Opsi

Gaya RARgaya zipArti
-p -eEnkripsi / dekripsi, meminta kata sandi. Entri kosong menghasilkan kata sandi acak dan menampilkannya.
-p -P Kata sandi di baris perintah (terlihat oleh pengguna lain mesin tersebut).
-hp[password]
Sama seperti -p. Nama berkas selalu terenkripsi di nikpak.
-m0 .. -m5 -0 .. -9Store, tercepat, cepat, baik, tinggi (menambahkan rekompresi Deflate), maksimum (bawaan sejak 1.2.1; LZMA2/PPMd, bagian 6.7). Gunakan -m2 bila kecepatan lebih penting daripada ukuran.
-mt
Jumlah utas, 1 hingga 256 (bawaan: semua inti).
-mc- / -mc+
Semua filter isi (codec media dan rekompresi Deflate) mati / filter media selalu aktif. Bawaan: uji coba otomatis per berkas.
-r
Menelusuri folder secara rekursif (selalu aktif, diterima demi kompatibilitas).
-ep -jMenyimpan hanya komponen jalur terakhir dari setiap argumen.
-ep1
Tidak menyimpan nama folder dasar dari argumen folder.
-o+ -oMenimpa berkas yang sudah ada tanpa bertanya.
-o- -nMelewati berkas yang sudah ada tanpa bertanya.
-or
Mengganti nama berkas hasil ekstraksi yang sudah ada: name (1).ext.
-y
Menganggap Ya untuk setiap pertanyaan.
-x -x Mengecualikan berkas; dapat diulang.
-d -d Folder tujuan untuk x dan e.
-inul -idq -qSenyap: hanya kesalahan yang dicetak.
@listfile
Membaca nama berkas dari berkas teks, satu per baris.
-h -help -?
Bantuan lengkap. -V mencetak versi.



Opsi yang sering dikirim front-end RAR tetapi tidak bermakna di sini (-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.

Menu pengelola berkas menambahkan beberapa opsi panjang (bagian 3.11): 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

Saat arsip dibuat dengan -p, nikpak menentukan kata sandi dalam urutan ini, dan tidak pernah gagal hanya karena tidak ada yang diberikan:

  • -p atau -P di 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.

Kata sandi yang dibuat memiliki 24 karakter dari alfabet 56 simbol yang tidak ambigu (tanpa 0/O, 1/l/I), sekitar 139 bit entropi. Kata sandi dicetak sekali di dalam kotak pada konsol. Tidak ada pemulihan: arsip yang kata sandinya hilang tidak dapat dibuka oleh siapa pun.

Saat membuka arsip terenkripsi, nikpak menggunakan sumber yang sama lalu gagal dengan kode keluar 11 dan pesan penjelasan; ia tidak pernah membuat apa pun, karena kata sandi yang dibuat tidak mungkin cocok.

3.4 Kode keluar

KodeArtiPenyebab umum
0Berhasil
1PeringatanBeberapa berkas dilewati (tidak terbaca, jalur tidak aman, symlink)
2Kesalahan fatalTidak dapat membuat atau membaca berkas, kesalahan internal
3Arsip rusak atau kesalahan CRCArsip rusak atau terpotong, checksum gagal
7Kesalahan baris perintahOpsi tidak dikenal, nama arsip tidak ada
10Tidak ada yang cocokTidak ada berkas yang cocok dengan nama atau wildcard
11Kata sandi salah atau tidak adaKata sandi salah, atau arsip terenkripsi telah dirusak



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

Karena nikpak menerima sintaks perintah RAR (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.

Folder dengan spasi di Windows
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

nikpak yang dijalankan tanpa argumen, misalnya dengan mengeklik dua kali nikpak.exe, membuka jendela kecil alih-alih mencetak petunjuk pemakaiannya. Ia melakukan satu hal: mengompres apa yang Anda lepaskan di atasnya.

The nikpak window: waiting for files (left) and compressing (right).
Jendela nikpak: menunggu berkas (kiri) dan sedang mengompres (kanan).
  • 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).

Jendelanya berukuran 500 × 560 poin (sekitar 9:10), sehingga tangkapan layar seluruh jendela muat dalam posting gambar X (Twitter) tanpa dipotong. Jendela tanpa bingkai: seret lewat area atasnya; tombol di kanan atas membuka kotak About, meminimalkan, dan menutupnya. Saat nikpak.exe dijalankan dari Explorer, jendela konsol yang dibuka Windows untuknya ditutup otomatis; saat dijalankan dari command prompt, prompt dibiarkan apa adanya. Tanpa tampilan grafis (misalnya lewat SSH), nikpak mencetak petunjuk pemakaiannya seperti biasa. Antarmuka menggunakan egui/eframe dan menyematkan subset rupa huruf Inter, Noto Sans SC, Noto Sans Devanagari, Noto Sans Bengali, dan Noto Sans Arabic (SIL Open Font License, lihat assets/fonts/OFL.txt). Berkas eksekusi khusus baris perintah dibangun dengan cargo build --release --no-default-features.

The window in Chinese, Hindi and Arabic, and the language menu.
Jendela dalam bahasa Chinese dan Arabic, pengingat dalam Hindi, serta menu bahasa.

Hindi, Bengali, dan Arabic memerlukan shaping: huruf berubah bentuk dan menyambung, tanda vokal bergeser mengelilingi konsonannya, dan Arabic mengalir dari kanan ke kiri. egui menggambar satu glif per karakter, yang akan mencetak bahasa-bahasa ini secara salah, sehingga nikpak mengurutkan teks semacam itu dengan algoritma dua arah Unicode (unicode-bidi), membentuknya dengan rustybuzz (port Rust dari HarfBuzz), merasterkannya dengan ab_glyph, dan menggambar hasilnya sebagai gambar (textshape.rs). Kata-kata Latin dan angka di dalamnya mempertahankan font Inter. Terjemahan panjang dikecilkan agar muat pada tombolnya, dan kotak membesar mengikuti teksnya. Terjemahan (i18n.rs) ditulis dengan bantuan mesin; tinjauan oleh penutur asli sangat disambut.

3.8 Lisensi dan registrasi (shareware)

NikPak adalah shareware, © 2026 Nicolas Choukroun, didistribusikan oleh Nikkoid LLC, dan dilisensikan seperti WinRAR: paket yang sama adalah salinan evaluasi gratis dan, begitu kunci lisensi dimasukkan, menjadi versi terdaftar. Tidak ada yang dinonaktifkan dalam salinan evaluasi.

SiapaKetentuan
PeroranganGratis untuk penggunaan pribadi nonkomersial, tanpa batas waktu. Lisensi pribadi ($19) menghapus pengingat; lisensi ini mencakup semua komputer yang dipakai pemegangnya.
Perusahaan dan organisasiSatu lisensi perusahaan per seat, setelah evaluasi gratis 40 hari; seat adalah komputer atau pengguna, mana yang lebih tinggi. Harga volume per seat, meniru WinRAR: 1–9 seat $19, 10–24 $15, 25–49 $12, 50–99 $9, 100–199 $7, 200–499 $6, 500 ke atas $5.
DistribusiPaket yang tidak dimodifikasi (dengan LICENSE.txt dan THIRD-PARTY-NOTICES.txt) boleh diletakkan di situs shareware atau unduhan mana pun; menambahkan kunci, berkas kunci, atau crack dilarang. Arsip .nik bebas royalti.



The reminder of the evaluation copy, the registration box and the file chooser.
Pengingat salinan evaluasi (kiri), kotak registrasi (tengah), dan pemilih berkas (kanan).
The main window with the i button, and the About box.
Jendela utama dengan tombol kecil i di kanan atas (kiri) dan kotak About (kanan).
  • 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.key di samping nikpak.exe, yang mendaftarkan setiap pengguna PC itu.
  • Baris perintah: nikpak register "Jane Doe" jane@example.com NPK1-… mendaftar; nikpak license menampilkan status; nikpak unregister menghapus lisensi. nikpak -V dan nikpak -help juga 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

Kunci lisensi berbunyi 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.

Kunci dibuat dengan kunci privat, yang tidak pernah meninggalkan Nikkoid LLC: baik dengan alat privat 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

unNik (unNik.exe) adalah program kedua dari paket ini. Ia membuka arsip .nik, menunjukkan isinya, dan mengekstrak apa yang Anda pilih. Ia gratis untuk semua orang, termasuk perusahaan, tanpa registrasi dan tanpa pengingat (LICENSE.txt, bagian 2a). Setup memasangnya di samping nikpak.exe, menambahkannya ke Start menu, dan menjadikannya program untuk berkas .nik, sehingga klik dua kali pada arsip membukanya di unNik; unNik archive.nik melakukan hal yang sama dari command prompt.

unNik waiting for an archive and its built-in viewer
unNik menunggu arsip (kiri) dan penampil bawaannya, mencari berkas sumber (kanan).

Jendela kosong tampak persis seperti milik NikPak, dengan panah mengarah ke atas di dalam cincin. Lepaskan arsip .nik di atasnya, klik cincin, atau pilih salah satu arsip terbaru: jendela membesar menjadi peramban (1120 × 720, dapat diubah ukurannya dari tepinya, dan dapat dimaksimalkan). Arsip terenkripsi meminta kata sandinya lebih dulu.

The unNik archive browser
Peramban: pohon folder dan ringkasan kompresi (kiri), berkas (tengah), dan detail berkas terpilih (kanan).
  • 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.
Extracting a selection and deleting a file in unNik
Mengekstrak pilihan (kiri) dan menghapus berkas (kanan).

3.10 Skin

NikPak dan unNik berbagi 55 skin jendela yang sama: 41 skin Nikkomander — dari Nikkoid Blue (bawaan) dan Nikkoid Bright hingga Dracula, Nord, Solarized, Classic Blue, Matrix, Pizza, Christmas, dan 8-Bit Game — plus 14 skin lukis yang latarnya digambar oleh program itu sendiri: Moon, America, Pattaya Neons, Burgers Tokyo, Sushi, Amiga, MSX, Colecovision, ZX Spectrum, Cat Life, Dog Life, Mario Bros, Counter Strike, dan Chess.

  • 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 folder skins di 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 pass discreet() di src/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

Submenu “NikPak” pada menu klik kanan pengelola berkas, seperti milik WinRAR, dipasang oleh setup (Windows: opsi yang dicentang secara bawaan; Linux: 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 --add dan --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

nikpak adalah satu program Rust dengan sekitar 9,600 baris (termasuk pengujian unitnya) dalam enam belas berkas sumber, plus alat lisensi privat nikpak-keygen. Aturan desain utamanya adalah streaming: berkas dibaca dalam potongan 256 KiB, didorong melalui rantai writer, dan tidak pernah ditahan di memori secara utuh (satu-satunya pengecualian adalah data piksel BMP, yang dibatasi 256 MiB, serta buffer kerja 64 KiB dari codec).

4.1 Alur data saat membuat arsip

Figure 1: the creation pipeline. The two lower boxes are inputs to the stage above them.
Gambar 1: jalur pembuatan. Dua kotak di bawah adalah masukan bagi tahap di atasnya.

Setiap tahap adalah implementasi dari trait 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

BerkasTanggung jawab
main.rsTitik masuk. Mengurai argumen, mengirim perintah, mengubah kesalahan menjadi kode keluar. Menangani pipe yang tertutup dengan tenang (nikpak lb x | head).
cli.rsParser argumen gaya RAR/zip yang ditulis tangan, tabel opsi, dan teks -help lengkap. Pustaka bergaya Clap tidak dapat menyatakan saklar seperti -pSECRET atau -m5 dengan bersih.
archive.rsMembuat, mendaftar, menguji, mengekstrak (berdasarkan filter atau pilihan persis), menghapus, mencetak, dan uji media; juga pembacaan indeks dan berkas tunggal yang dipakai unNik. Memuat writer dan reader aliran entri, kebijakan timpa, dan logika berkas sementara atomik.
media.rsDeteksi isi untuk WAV, AIFF, MOD, dan BMP; filter Shuffle, Delta, dan MED; pemilihan uji coba; pembantu CRC dan framing potongan.
nac.rsCodec audio tanpa rugi NAC: dekorelasi stereo, prediktor, pengodean residu.
bits.rsWriter dan reader bit MSB-first yang dipakai NAC.
crypto.rsPenurunan kunci Argon2id serta writer dan reader potongan XChaCha20-Poly1305.
format.rsKonstanta format di disk: magic, versi, jenis record, batas KDF.
util.rsPermintaan dan pembuatan kata sandi, pembersihan jalur, pencocokan wildcard, pemformatan tanggal dan ukuran.
error.rsJenis kesalahan, kode keluarnya, dan klasifikasi kesalahan I/O (kerusakan versus kegagalan sistem).
engine.rsBadan multi-mesin dari -m5: writer dan reader blok, mesin LZMA2 dan PPMd, uji coba mesin (bagian 5.6, 6.7).
recomp.rsRekompresi Deflate untuk kontainer ZIP, PDF, dan gzip dengan preflate (bagian 7.9).
gui.rsAntarmuka grafis: jendela drop, cincin progres, pengaturan tujuan, tautan komunitas (bagian 3.7).
unnik.rsunNik, peramban arsip: pohon, daftar, pencarian, penampil, kotak ekstrak dan hapus (bagian 3.9).
lib.rs, bin/unnik.rsPustaka yang dibagikan nikpak dan unNik, dan titik masuk unNik.exe (program berjendela, tanpa konsol).
license.rsLisensi shareware: format kunci, verifikasi Ed25519, penyimpanan lisensi, registrasi (bagian 3.8).
i18n.rsTerjemahan jendela ke sepuluh bahasa yang paling banyak dituturkan; pengaturan bahasa (bagian 3.7).
textshape.rsTeks berbentuk untuk Hindi, Bengali, dan Arabic: pengurutan bidi, shaping, rasterisasi (bagian 3.7).



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), @listfiles dibaca, 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.tmp menjadi name.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

Zstandard menggunakan utas pekerja untuk kompresi (semua inti secara bawaan, -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

Berkas .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

OffsetUkuranFieldCatatan
0 8Magic89 4E 49 4B 0D 0A 1A 0A (gagasan PNG: mendeteksi kerusakan transfer mode teks)
8 1Versi3 (1 dan 2 masih dapat dibaca)
9 1Flagsbit 0 = terenkripsi; bit lain harus 0
10 1Metode0 = store, 1 = Zstandard, 2 = blok multi-mesin (5.6)
11 1Reserved 0
12 4Memori Argon2id (KiB)hanya arsip terenkripsi, little endian
16 4Pass Argon2idhanya terenkripsi
20 4Lane Argon2idhanya terenkripsi
24 16Saltacak per arsip, hanya terenkripsi
40 19Awalan nonce aliranacak per arsip, hanya terenkripsi



Header lengkap (12 byte, atau 59 byte saat terenkripsi) kemudian diautentikasi sebagai associated data dari setiap potongan terenkripsi, sehingga tidak dapat diubah tanpa terdeteksi.

5.2 Record entri

Di dalam aliran (terdekripsi, terdekompresi) setiap entri adalah sebuah record. Semua bilangan bulat little endian.

JenisTata letak
0 ENDcount:u64. Menandai akhir dan menyatakan berapa banyak entri yang mendahuluinya.
1 FILEname_len:u16 name mtime:i64 mode:u32 size:u64 data[size] crc32:u32
2 DIRname_len:u16 name mtime:i64 mode:u32
3 MEDIAname_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.
  • mtime adalah detik Unix; mode adalah 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, size adalah ukuran asli. framed_stream adalah rangkaian potongan [u32 length][bytes] yang diakhiri panjang nol, sehingga reader selalu dapat melewati entri media tanpa memahami filternya.

Parameter media

FilterParamsIsi
1 Audio19 byteoffset:u64 frames:u64 channels:u8 bits:u8 flags:u8 (bit flag 0 = big endian, bit 1 = signed)
2 Image21 byteoffset:u64 width:u32 rows:u32 bpp:u8 stride:u32
3 Deflate0 bytenone: the framed stream holds raw segments and recompressed Deflate streams (section 7.9)



Segala sesuatu sebelum 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

Saat flag terenkripsi disetel, keluaran zstd dipotong menjadi potongan 64 KiB plaintext. Setiap potongan disimpan sebagai panjang big-endian 32-bit yang diikuti ciphertext, yang 16 byte lebih panjang karena tag Poly1305. Sebuah potongan hanya disegel bila setidaknya ada satu byte lagi yang mengikutinya, sehingga potongan terakhir tidak pernah kosong dan dapat ditandai sebagai final (bagian 8.3).

5.4 Mengapa aliran padat?

Mengompres semua berkas sebagai satu aliran memungkinkan kompresor menemukan pengulangan antarbarkas, yang sangat berpengaruh untuk pohon sumber dan kumpulan dokumen (benchmark di bab 11 menunjukkan keluaran non-solid RAR hampir dua kali lebih besar daripada keluaran solidnya pada 10,949 berkas). Harganya adalah akses berurutan: mengekstrak satu berkas memerlukan dekompresi atas apa yang mendahuluinya. nikpak mengurangi biaya ini untuk entri media dengan melewatinya tanpa mendekode.

5.5 Versioning

Byte versi diperiksa terhadap versi tertinggi yang dipahami program. Arsip yang lebih baru menghasilkan pesan Unsupported archive version N; please update nikpak alih-alih kesalahan kerusakan yang menyesatkan. Flag, metode, atau filter media yang tidak dikenal ditolak dengan cara yang sama.

5.6 Badan multi-mesin (versi 3)

Arsip yang dibuat dengan -m5 menggunakan metode 2. Aliran record dalam yang dijelaskan di 5.2 tidak berubah, tetapi dipotong, hanya di antara entri, menjadi blok, dan setiap blok dikompresi dengan mesinnya sendiri. Setelah dirangkai, blok yang terdekompresi persis sama dengan aliran record arsip mesin tunggal, sehingga pendaftaran, pengujian, dan ekstraksi bekerja dengan cara yang sama.

ElemenTata letak
bodyblock* diikuti satu byte 0
blockengine:u8 parameters, lalu frame [u32 length 1 .. 1 MiB][compressed bytes], diakhiri panjang nol
engine 1Zstandard (tanpa parameter)
engine 2Aliran mentah LZMA2: dictionary size u32, lc u8, lp u8, pb u8
engine 3PPMd varian I (PPMd8): order u8, model size u32, restore method u8 (0 = restart)



Framing ini memungkinkan reader menemukan akhir setiap blok tanpa memercayai dekoder, dan setiap parameter diperiksa rentangnya sebelum memori dialokasikan (dictionary LZMA2 maksimal 1.5 GiB, model PPMd maksimal 1 GiB, order 2 hingga 16). Saat terenkripsi, badan dilindungi oleh potongan terautentikasi yang sama seperti arsip lainnya (bab 8).

6 Mesin kompresi

6.1 Mengapa Zstandard

Zstandard menggabungkan pencocokan LZ77 dengan tahap entropi yang dibangun dari pengodean Huffman dan entropi finite-state (FSE). Dibandingkan dengan algoritma Deflate dari ZIP, ia menemukan kecocokan dalam jendela yang jauh lebih besar, memodelkan literal dan panjang kecocokan dengan kode entropi yang lebih ketat, dan mendekode dalam kecepatan gigabyte per detik. Ia juga merupakan format terbuka yang diaudit luas, yang menjaga data nikpak tetap dapat dipulihkan oleh alat independen.

6.2 Pemetaan level

nikpak menerima level gaya RAR (-m0 .. -m5) maupun level gaya zip (-0 .. -9) dan memetakannya ke level Zstandard:

OpsiLevel ZstandardKarakter
-m0none (stored)Tanpa kompresi, tanpa filter media
-m1 1Tercepat
-m2 3Cepat; sekitar 0.9 s untuk 197 MB pada satu inti (bawaan hingga 1.2.0)
-m3 9Keseimbangan baik
-m4 15Tinggi; jendela 128 MiB dan pencocokan jarak jauh; rekompresi Deflate (7.9)
-m5 (default)LZMA2 / PPMdMaksimum, dan bawaan sejak 1.2.1: badan multi-mesin (6.7) dan rekompresi Deflate



Level gaya zip dipetakan sebagai berikut: -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

Pada Zstandard level 15 ke atas, nikpak mengaktifkan jendela pencocokan 2^27 byte (128 MiB) dan pencocokan jarak jauh. Pohon sumber, kumpulan dokumen, dan cadangan memuat banyak berkas yang hampir duplikat yang letaknya berjauhan di dalam aliran; jendela 8 MiB biasa tidak dapat melihat melintasinya. Pada set uji 197 MB ini mengurangi keluaran pada -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

Encoder membagi masukan menjadi job yang berjalan di utas pekerja (semua inti secara bawaan). Kecepatan kompresi karena itu menyesuaikan dengan jumlah inti, sementara format tetap satu aliran. Semua angka dalam panduan ini diukur pada satu inti; pada mesin multi-inti yang umum, nikpak jauh lebih cepat daripada yang ditampilkan.

6.5 Integritas di dalam aliran

Frame Zstandard membawa checksum isinya sendiri, nikpak menambahkan CRC32 per berkas dan penanda akhir dengan jumlah entri. Arsip biasa yang rusak karena itu terdeteksi pada tiga level: checksum frame, CRC per berkas, dan penanda akhir.

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

Zstandard adalah mesin yang tepat untuk kecepatan, tetapi pada pengaturan terkuatnya ia masih tertinggal beberapa persen dari LZMA2 pada kode sumber dan dokumen, dan jauh di belakang PPMd pada prosa. Sejak versi 1.2, -m5 karena itu membangun arsip dari dua blok (format di 5.6):

  • 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.

Pengaturan LZMA2 "Extreme" diukur dan ditolak: pada XML spreadsheet pengaturan itu hingga sepuluh kali lebih lambat dan tidak lebih kecil. -m5 berjalan pada satu utas, terlepas dari -mt.

7 Kecerdasan media

Kompresor serbaguna melihat byte. Ia tidak tahu bahwa berkas WAV adalah bentuk gelombang yang sampel berikutnya dapat diprediksi dari sampel sebelumnya, atau bahwa piksel bertetangga pada foto hampir sama. Lapisan media nikpak menyediakan pengetahuan itu: ia mengenali berkas semacam itu, menerapkan transformasi tanpa rugi yang menyingkap redundansinya, dan membiarkan kompresor (atau codec khusus) mengeksploitasinya. Di sinilah nikpak paling unggul atas RAR.

7.1 Deteksi berdasarkan isi

Deteksi melihat byte pertama setiap berkas yang berukuran minimal 8 KiB dan tidak pernah memercayai ekstensi, sehingga WAV yang diganti namanya menjadi .dat tetap ditemukan dan berkas teks bernama .wav tidak.

JenisCara dikenaliYang difilter
WAVRIFF..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 dataWilayah sampel. Panjang data nol, terlalu besar, atau palsu dijepit ke berkas; byte sisa dan potongan akhir dipertahankan apa adanya.
AIFF / AIFCFORM..AIFF atau AIFC (compression NONE atau twos), potongan COMM dan SSND, sampel signed big-endianWilayah data suara.
ProTracker MODTanda tangan pada offset 1080: M.K., M!K!, FLT4, 4CHN, 6CHN, 8CHN, FLT8, OCTA, atau CD81Area sampel 8-bit setelah data pola (bagian 7.6).
BMPBM, 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 MiBBaris piksel (bagian 7.7).



Tidak ditangani, dan karena itu disimpan dengan kompresi biasa: WAV floating-point, ADPCM dan audio terkompresi lainnya, BMP RLE atau bit-field, serta format tracker selain ProTracker MOD. Media yang sudah terkompresi seperti MP3, JPEG, FLAC, PNG, dan MP4 tidak dikenali sama sekali dan dibiarkan, karena mentransformasinya tidak akan membantu.

7.2 Uji coba: memilih filter terbaik per berkas

Tidak ada satu transformasi yang terbaik untuk setiap berkas. Pengodean prediktif menang pada musik rekaman; pemisahan bidang byte menang pada audio yang berasal dari sumber companded 8-bit (di mana hanya sekitar seribu nilai 16-bit berbeda yang muncul); kompresi biasa menang pada keheningan dan sampel tracker yang sangat repetitif. Karena itu nikpak mengukur, bukan menebak.

  • 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.

Tanpa rugi, terverifikasi, dan dapat dilewati
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

NAC (nikpak audio codec) adalah codec tanpa rugi berbasis blok untuk PCM bilangan bulat. Ia termasuk keluarga yang sama dengan FLAC: prediksi linear yang diikuti pengodean Rice. Ia memiliki aliran bitnya sendiri, dirancang untuk arsip ini, dan dipakai untuk WAV, AIFF, serta data sampel berkas MOD.

Figure 2: encoding one block of 4096 sample frames.
Gambar 2: mengodekan satu blok berisi 4096 frame sampel.

Blok dan dekorelasi stereo

Audio dipotong menjadi blok berisi 4096 frame sampel, masing-masing dikodekan secara independen, yang membuat codec tangguh (kesalahan tidak dapat menyebar) dan memungkinkan encoder beradaptasi dengan materi yang berubah. Untuk stereo, encoder memilih satu dari empat representasi per blok:

ModeKanal yang dikodekanRekonstruksi
0Left, Rightdirect
1Left, Side R = L - S
2Side, Right L = R + S
3Mid, Sidesum = (M << 1) | (S & 1), L = (sum + S) >> 1, R = (sum - S) >> 1



dengan 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

Setiap kanal yang dikodekan dari suatu blok disimpan sebagai salah satu dari empat sub-frame, mana yang terkecil:

JenisPenggunaanBiaya
ConstantSemua sampel sama (keheningan digital)2 + bit lebar sampel untuk seluruh blok
VerbatimMateri mirip noise, atau fallback keamanann x width bit
FixedPrediktor polinomial order 0 hingga 4sampel warm-up + residu
LPCPrediktor linear order 1 hingga 32 dengan koefisien yang dikirimkoefisien + warm-up + residu



Bit terbuang. Jika bit rendah setiap sampel dalam blok selalu nol (rekaman 8-bit yang disimpan dalam kontainer 16-bit, atau sinyal terkuantisasi), bit itu dihapus dan jumlahnya disimpan dalam 5 bit.

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]



Sampel order pertama dari blok disimpan verbatim sebagai nilai warm-up.

Pengodean prediktif linear (LPC)

Untuk musik tonal dan harmonik, prediktor yang koefisiennya dicocokkan dengan blok jauh lebih baik daripada polinomial tetap. Encoder menghitungnya sebagai berikut:

  • 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.

Prediktor itu sendiri adalah aritmetika bilangan bulat murni, yang dijalankan dekoder:

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)



Floating point hanya dipakai oleh encoder untuk memutuskan koefisien bilangan bulat mana yang dikirim. Dekoder tidak pernah menyentuh floating point, sehingga dekode bersifat bit-exact di setiap prosesor dan setiap compiler.

Pengodean residu

Kesalahan prediksi dipetakan ke bilangan tak bertanda dengan transformasi zig-zag (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

Level arsip (opsi -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.

Level arsipUpaya NACOrder LPC yang dicoba
-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



Prediktor tetap order 0 hingga 4 selalu dicoba. Dalam benchmark, level upaya mengubah hasil musik stereo kurang dari 0.05 %: keuntungan besar datang dari penggunaan prediksi itu sendiri.

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



Setiap blok disimpan dalam arsip dengan panjang 32-bit di depannya, sehingga dekoder selalu tahu di mana blok berikutnya dimulai.

7.4 Verifikasi diri

Menulis arsip adalah satu-satunya kesempatan untuk mendeteksi bug encoder, sehingga encoder NAC tidak memercayai dirinya sendiri. Setelah mengodekan setiap blok, ia mendekode ulang blok itu dan membandingkan hasilnya dengan sampel asli. Pada perbedaan apa pun, ia mengodekan ulang blok sebagai verbatim (yang tidak dapat gagal) dan memeriksa lagi; jika bahkan itu gagal, pengarsipan berhenti dengan kesalahan eksplisit dan saran untuk memakai -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.

Di atas itu, dekoder difuzz: ribuan blok berisi byte acak dan blok dengan bit terbalik diumpankan kepadanya dalam pengujian unit, dan ia harus mengembalikan kesalahan tanpa panik atau mengalokasikan memori yang tidak wajar. Selama pengembangan, ini menemukan bug nyata (untuk materi 32-bit, pencarian parameter Rice bisa keluar kosong dan jatuh ke parameter yang akan menghasilkan kode multi-gigabyte); bug itu diperbaiki dan dilindungi pengujian.

7.5 Shuffle dan Shuffle+Delta

Sebagian audio tidak merespons prediksi. Berkas WAV galeri yang dipakai benchmark adalah 16-bit, tetapi hanya memuat sekitar seribu nilai sampel berbeda, karena dihasilkan dari sumber companded 8-bit. Prediktor tidak dapat mengeksploitasinya, dan FLAC mengompresnya menjadi 84 % dari aslinya sementara Zstandard polos hanya memerlukan 63 %. Yang membantu adalah menata byte sehingga kompresor melihat data yang homogen:

  • 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.

Pada 35 berkas galeri, arsip dengan filter terbaik per berkas (dipilih lewat uji coba) berukuran 51 % dari ukuran asli pada -m2 dan 47 % pada -m5, dibandingkan 63 % untuk Zstandard polos.

7.6 Berkas ProTracker MOD

Modul MOD adalah header 1084 byte (judul, 31 deskriptor sampel, tabel urutan pola 128 entri, dan tanda tangan 4 byte pada offset 1080), lalu data pola, lalu sampel signed 8-bit mentah semua instrumen. nikpak menghitung di mana sampel dimulai dan seberapa panjangnya:

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



Header dan pola disimpan apa adanya (kompresor menangani peristiwa nada yang repetitif itu dengan baik) dan area sampel diperlakukan sebagai satu aliran mono, signed, 8-bit untuk uji coba. Per berkas, NAC, Shuffle+Delta, atau kompresi biasa menang: instrumen sampel kebanyakan menyukai NAC, sementara pada beberapa modul (misalnya yang sampelnya sangat pendek atau sangat repetitif) kompresi biasa menang. Modul terpotong ditangani dengan menjepit wilayah ke data yang benar-benar ada.

7.7 Gambar BMP

BMP tanpa kompresi menyimpan baris piksel yang dipadan ke kelipatan empat byte. Filter bekerja dalam empat langkah:

  • 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, atas b, dan kiri-atas c, prediksinya adalah min(a,b) jika c >= max(a,b), max(a,b) jika c <= min(a,b), dan a + b - c selain 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.

Dekoder membalik langkah-langkah itu secara persis. BMP 8-bit melewati langkah warna; uji coba kemudian memutuskan apakah prediksi membantu untuk palet itu, karena memprediksi indeks palet hanya masuk akal untuk palet grayscale atau yang terurut mulus. Berkas BMP di atas 256 MiB tidak difilter, untuk membatasi penggunaan memori.

7.8 Mengapa ini mengalahkan RAR

RAR mengompres media dengan mesin match-and-Huffman umum plus sekumpulan kecil filter byte. nikpak justru memberi audio codec prediktif sungguhan dengan dekorelasi stereo per blok dan pengodean Rice adaptif, memberi gambar prediktor 2-D yang layak dengan dekorelasi warna, dan memilih per berkas lewat pengukuran. Konsekuensinya terlihat di benchmark: 12 hingga 15 % lebih kecil pada audio segala jenis, 13 % pada musik tracker, dan 39 % pada foto, serta hasil NAC untuk trek stereo berada dalam 0.2 % dari encoder FLAC khusus.

7.9 Dokumen Office, PDF, dan gzip: rekompresi Deflate

Berkas office modern adalah arsip ZIP dari XML (docx, xlsx, pptx, odt, ods), dan berkas PDF menyimpan halamannya dalam aliran Deflate (FlateDecode). Isinya karena itu sudah terkompresi, dan tidak ada pengarsip yang dapat mengecilkannya banyak: pada benchmark 1.1, 6.6 MB berkas .xlsx hanya turun ke 5.6 MB dengan 7-Zip. nikpak 1.2 menghilangkan hambatan itu.

  • 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.

Pada set office di bagian 11.7, inilah yang membuat nikpak lebih kecil daripada setiap pengarsip lain. 6.6 MB berkas .xlsx memuat 71 MB XML setelah didekode, dan XML itu terkompres jauh lebih baik daripada yang dilakukan Deflate. Biayanya adalah waktu: preflate menganalisis kira-kira 15 MB data polos per detik. Karena itu rekompresi dipakai hanya pada -m4 dan -m5, tempat ia sepadan (terukur: -m3 hanya mendapat 0.5 % dengan waktu enam kali lipat). Batas: berkas hingga 512 MiB, dan per aliran hingga 512 MiB data polos serta 64 MiB koreksi. -mc- mematikannya.

8 Enkripsi

Enkripsi nikpak seluruhnya dibangun dari komponen standar yang dipelajari dengan baik (implementasi RustCrypto dari Argon2id dan XChaCha20-Poly1305). Tidak ada primitif yang diciptakan untuk proyek ini; pekerjaannya terletak pada menggabungkannya dengan benar.

8.1 Model ancaman

Desainnya mengasumsikan penyerang yang memperoleh berkas arsip dan dapat mempelajari serta memodifikasinya sesuka hati, dan yang dapat mencoba tebakan kata sandi tanpa batas secara offline. nikpak bertujuan menjamin:

  • 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.

Ia tidak menyembunyikan bahwa arsip ada, maupun perkiraan ukurannya, dan ia tidak dapat melindungi dari malware pada mesin yang membuat atau membuka arsip, atau dari kata sandi yang lemah.

8.2 Dari kata sandi ke kunci: Argon2id

Kata sandi adalah kunci yang buruk: pendek, dapat diprediksi, dan diketik manusia. Ia diubah menjadi kunci 256-bit dengan Argon2id, pemenang Password Hashing Competition dan algoritma yang distandarkan dalam RFC 9106. Argon2id sengaja memakan memori: menghitung satu kunci memerlukan blok memori besar yang diisi lalu berulang kali dibaca dalam pola yang bergantung pada data. nikpak memakai profil memori rendah RFC:

ParameterNilaiArti
Memori64 MiBSetiap tebakan memerlukan 64 MiB memori cepat
Pass 3Memori diproses tiga kali
Lane 4Derajat paralelisme dalam satu penurunan
Salt16 byte acakBaru untuk setiap arsip: kata sandi identik memberi kunci berbeda, dan tabel yang dihitung sebelumnya tidak berguna
Keluaran32 byteKunci XChaCha20-Poly1305



Memory-hardness adalah yang memisahkan Argon2id dari PBKDF2 yang lebih tua (dipakai RAR5 dan mode AES ZIP): PBKDF2 hampir tidak memerlukan memori, sehingga kartu grafis atau chip khusus dapat menguji tebakan dalam jumlah besar secara paralel. Dengan Argon2id, perangkat keras penyerang harus menyediakan 64 MiB per tebakan paralel, yang menghapus sebagian besar keunggulan itu. Biaya bagi pengguna sah adalah sepersekian detik, dibayar sekali per arsip.

Parameter disimpan di header, sehingga versi mendatang dapat menaikkannya tanpa merusak arsip lama. Saat membaca, parameter diperiksa rentangnya lebih dulu (memori 8 x lane hingga 1 GiB, pass 1 hingga 64, lane 1 hingga 64) sehingga arsip jahat tidak dapat membuat nikpak mengalokasikan memori yang tidak masuk akal sebelum kata sandinya diperiksa.

8.3 XChaCha20-Poly1305 dalam konstruksi STREAM

Data massal dilindungi dengan XChaCha20-Poly1305, cipher authenticated-encryption-with-associated-data (AEAD): ChaCha20 menyediakan cipher aliran berkunci 256-bit, varian X memperluas noncenya menjadi 192 bit (cukup besar untuk dipilih acak tanpa pernah berulang), dan Poly1305 menambahkan tag autentikasi 128-bit ke setiap pesan yang disegel. ChaCha20 cepat di setiap CPU tanpa instruksi khusus dan, tidak seperti AES berbasis tabel, secara alami bebas dari kebocoran cache-timing.

Arsip jauh lebih besar daripada satu pesan, sehingga nikpak memakai konstruksi STREAM (yang sama dengan alat enkripsi berkas modern): data dipotong menjadi potongan 64 KiB dan potongan nomor i disegel di bawah nonce

nonce (24 bytes) = random prefix (19 bytes)
| chunk counter (4 bytes, big endian)
| last-chunk flag (1 byte)



Ini memberi tiga jaminan sekaligus. Setiap potongan memiliki nonce unik, yang penting untuk cipher aliran. Karena counter adalah bagian dari nonce, pengurutan ulang atau penggandaan potongan gagal autentikasi. Karena potongan terakhir membawa flag berbeda, memotong arsip, bahkan tepat pada batas potongan, gagal autentikasi: potongan terakhir yang baru disegel sebagai non-final. Awalan 19 byte acak per arsip.

Selain itu, header arsip lengkap (versi, flag, metode, parameter Argon2id, salt, dan awalan nonce) dilewatkan sebagai associated data ke setiap potongan. Ia diautentikasi tetapi tidak dienkripsi; membalik bit mana pun membuat setiap potongan gagal. Ini juga memblokir serangan downgrade yang mencoba melemahkan parameter yang tersimpan.

ItemNilai
CipherXChaCha20-Poly1305: kunci 256-bit, nonce 192-bit, tag 128-bit
Potonganhingga 64 KiB plaintext; disimpan sebagai u32 length + ciphertext + tag 16-byte
Overhead ukuransekitar 0.03 % (20 byte per 64 KiB), terukur 0.03 % pada set data 222 MB
Overhead kecepatanterukur: +0.3 s total pada set data 222 MB (0.92 s alih-alih 0.64 s), termasuk penurunan kunci
Kata sandi salahTerdeteksi pada potongan pertama; tidak ada plaintext yang dihasilkan



8.4 Yang dapat dan tidak dapat dilihat pengamat

Terlihat tanpa kata sandiTerlindungi
Nomor magic, versi, flag, dan metode kompresiNama berkas dan struktur folder
Parameter Argon2id, salt, dan awalan nonceUkuran berkas, stempel waktu, dan izin
Ukuran total arsip dan jumlah potonganJumlah berkas
Fakta bahwa ini adalah arsip nikpakSemua isi, termasuk apakah memuat media



Satu konsekuensi dari mengompres sebelum mengenkripsi adalah ukuran arsip mencerminkan seberapa dapat dikompres datanya. Ini melekat pada setiap pengarsip yang mengompres dan mengenkripsi; ini penting hanya jika penyerang dapat mengendalikan sebagian data dan mengamati ukurannya, yang tidak berlaku untuk pengarsipan berkas.

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 lingkungan NIKPAK_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

Manipulasi arsip terenkripsi berikut dilakukan terhadap program yang sudah jadi. Semuanya terdeteksi sebelum data yang salah diterima:

ManipulasiHasil
Membalik satu byte di tengah ciphertextDitolak: kegagalan autentikasi (exit 11)
Membalik satu byte salt di headerDitolak (header adalah associated data dan kuncinya berubah)
Mengubah byte metode di headerDitolak
Memotong berkas sebesar 100 byteDitolak sebagai rusak (exit 3)
Menghapus potongan terakhir tepat pada batas potonganDitolak: potongan terakhir yang baru tidak memiliki flag final
Menukar dua potonganDitolak: ketidakcocokan counter
Memberi kata sandi yang salahDitolak pada potongan pertama (exit 11)
Memberi berkas acak sebagai arsipDitolak: tanda tangan buruk (exit 3)



Risiko sisa, dinyatakan terus terang
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

Komputer kuantum mengancam sebagian kriptografi dengan parah dan sebagian lainnya hampir tidak sama sekali. nikpak dirancang di sisi yang hampir tidak terpengaruh.

9.1 Yang diubah komputer kuantum

AlgoritmaEfekYang terpengaruh
Shor (1994)Memfaktorkan bilangan bulat dan menghitung logaritma diskrit dalam waktu polinomialRSA, Diffie-Hellman, DSA, kriptografi elliptic-curve: rusak oleh komputer kuantum besar
Grover (1996)Mencari ruang tak terstruktur berisi N item dalam sekitar akar kuadrat N langkahKunci simetris dan fungsi hash: panjang kunci efektif dipotong setengah



Algoritma Shor adalah yang dramatis: ia akan merusak setiap sistem yang bergantung pada matematika kunci publik, itulah sebabnya pemerintah dan badan standar bermigrasi ke algoritma kunci publik pasca-kuantum seperti ML-KEM (FIPS 203). Algoritma Grover adalah yang ringan: kunci 256-bit menawarkan sekitar 128 bit keamanan terhadapnya, dan iterasi Grover secara inheren berurutan, sehingga menyebar pekerjaan ke banyak mesin kuantum hanya menghasilkan akar kuadrat dari jumlahnya sebagai percepatan.

9.2 Posisi nikpak

KomponenPrimitifDampak kuantum
EnkripsiXChaCha20, kunci 256-bitSerangan terbaik yang diketahui: Grover, sekitar 2^128 operasi. Di luar jangkauan.
AutentikasiPoly1305, tag 128-bit, dikunci dari rahasia 256-bitTidak ada matematika kunci publik yang terlibat
Kata sandi ke kunciArgon2id, 64 MiB, 3 passGrover paling banter memangkas entropi kata sandi menjadi setengahnya, dan setiap iterasi akan memerlukan evaluasi fungsi yang memakan memori
KeacakanCSPRNG sistem operasiTidak terpengaruh
Kriptografi kunci publikTidak adaTidak ada yang dapat diserang algoritma Shor



Kunci simetris 256-bit adalah acuan untuk kategori keamanan tertinggi (kategori 5) standardisasi pasca-kuantum NIST: algoritma kunci publik yang distandarkan NIST dinilai dari seberapa dekat kecocokannya dengan kesulitan pencarian menyeluruh kunci AES 256-bit. Dengan kata lain, enkripsi data nikpak sudah berada pada kekuatan yang dituju standar pasca-kuantum.

9.3 Bagaimana dengan kata sandinya?

Ruang kunci cipher adalah 256 bit, tetapi kuncinya diturunkan dari kata sandi, sehingga kekuatan nyatanya adalah yang lebih kecil dari entropi kata sandi dan 256 bit. Terhadap musuh kuantum, entropi kata sandi, dalam kasus terbaik bagi penyerang, dipotong setengah:

Kata sandiEntropiPencarian klasikPencarian Grover (paling baik)
dibuat nikpak (24 simbol)sekitar 139 bitsekitar 2^139 tebakansekitar 2^70 iterasi, masing-masing memerlukan evaluasi Argon2id 64 MiB yang koheren
Enam kata Diceware acaksekitar 77 bitsekitar 2^77 tebakansekitar 2^39 iterasi dari sirkuit mahal yang sama
Kata sandi 10 karakter pilihan manusiabiasanya 30 - 45 bitlayaklayak



Kesimpulannya adalah yang sudah lazim, dinyatakan lebih tajam: kata sandi adalah titik lemahnya, bukan ciphernya. Gunakan kata sandi yang dibuat atau frasa sandi acak yang panjang dan arsip menahan penyerang klasik maupun kuantum untuk masa depan yang dapat diramalkan. Argon2id membantu di kedua dunia, karena biaya setiap tebakan didominasi memori, yang tidak dibuat lebih murah oleh algoritma Grover.

9.4 "Harvest now, decrypt later"

Ancaman kuantum yang sering dikutip adalah musuh merekam data terenkripsi hari ini dan mendekripsinya saat komputer kuantum ada. Untuk sistem yang menukar kunci dengan RSA atau elliptic curve, seperti koneksi TLS atau enkripsi e-mail, ini nyata. Arsip nikpak tidak punya pertukaran kunci: kuncinya berasal dari rahasia yang tidak pernah meninggalkan kepala atau pengelola kata sandi pengguna. Salinan tersimpan hanya dapat dibuka kelak dengan menebak rahasia itu, dan komputer kuantum tidak membuatnya secara fundamental lebih mudah.

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

Pengarsip membaca berkas yang ditulis orang asing dan menulis berkas di disk penggunanya, yang membuatnya menjadi sasaran klasik. nikpak memperlakukan setiap arsip sebagai masukan yang tidak tepercaya.

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/passwd diekstrak 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.

Arsip buatan tangan yang memuat ../../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.

nikpak tidak membatasi rasio ekspansi arsip, sehingga, seperti setiap pengarsip, "bom kompresi" yang sengaja dibuat dapat memenuhi disk saat diekstrak. Uji arsip yang tidak dikenal dengan t lebih dulu jika itu penting.

10.3 Pembuatan aman dan kesalahan jujur

  • Arsip ditulis ke name.nik.tmp dan 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

Bab ini melaporkan pengukuran, bukan klaim. Ia menjelaskan persis apa yang diukur, menyertakan hasil yang tidak menguntungkan nikpak, dan memberi perintah yang diperlukan untuk mengulang semuanya.

Bagian 11.1 hingga 11.6 diukur dengan nikpak 1.1.0, yang -m5-nya masih memakai Zstandard. Bagian 11.7 membandingkan nikpak 1.2.0 dengan RAR, 7-Zip, dan ZIP pada satu mesin.

11.1 Metode

ItemDetail
MesinMesin virtual Linux x86-64, satu inti CPU. Semua waktu adalah detik wall-clock pada satu inti itu; mesin multi-inti lebih cepat untuk kedua alat.
Perangkat lunakRAR 7.00 (26 Feb 2024, build trial Linux, format -ma5); nikpak 1.1.0 dibangun dalam mode release dengan LTO; FLAC 1.x -8 sebagai acuan audio.
Pengaturan RAR-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.
VerifikasiSetiap arsip nikpak diekstrak dan dibandingkan dengan aslinya (cmp untuk berkas media, SHA-256 dari semua 10,949 berkas untuk set umum).



Materi uji

SetIsi
Gallery WAVs35 berkas suara dari galeri LibreOffice: mono 16-bit, 23 pada 11,025 Hz dan 12 pada 22,050 Hz. Mereka hanya memuat sekitar seribu nilai sampel berbeda (sumber companded) dan merupakan kasus yang sengaja dibuat canggung untuk pengodean prediktif.
MusicKarya multi-instrumen 100 detik (piano, strings, bass, flute, drums) yang dirender dengan TiMidity++ dan set suara Freepats ke 44.1 kHz stereo 16-bit (17.4 MB). SoX menurunkan versi mono 16-bit 22.05 kHz, mono 8-bit 22.05 kHz, dan versi stereo 24-bit 48 kHz.
MOD16 modul ProTracker dari koleksi uji libxmp.
BMP6 gambar: lima foto dari set sampel scikit-image (24-bit, plus konversi grayscale 8-bit dari salah satunya) dan tekstur dari TeX Live.
General data197.6 MB dalam 10,949 berkas: pustaka standar dan paket Python, dokumentasi, dan header C dari mesin uji, symbolic link dihapus.



Batas materi uji ini
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

SetAsliRAR 7 -m5nikpak -m2nikpak -m5m5 vs RAR
6 foto BMP 9,183,956 2,862,744 2,035,223 1,750,70638.8 % lebih kecil
16 berkas ProTracker MOD 2,507,557 1,070,290 966,622 927,97313.3 % lebih kecil
35 gallery WAV (mono 16-bit) 2,991,820 1,605,879 1,529,219 1,418,53211.7 % lebih kecil
Music 44.1 kHz stereo 16-bit 17,371,848 11,024,411 9,415,519 9,411,89814.6 % lebih kecil
Music 22.05 kHz mono 16-bit 4,342,996 3,112,135 2,635,819 2,634,66915.3 % lebih kecil
Music 22.05 kHz mono 8-bit 2,171,520 844,160 742,462 740,75112.2 % lebih kecil
Music 48 kHz stereo 24-bit 28,362,206 21,467,283 (-m3) 18,689,529 18,688,03012.9 % lebih kecil



Semua ukuran dalam byte. Untuk berkas 24-bit, RAR hanya diukur pada -m3, sehingga baris itu adalah perbandingan yang lebih lemah daripada yang lain.

Figure 3: archive size as a percentage of the original data (lower is better).
Gambar 3: ukuran arsip sebagai persentase data asli (lebih rendah lebih baik).
Figure 4: size reduction of nikpak compared with RAR 7.00 -m5.
Gambar 4: pengurangan ukuran nikpak dibandingkan RAR 7.00 -m5.

Yang ditambahkan filter media

nikpak yang sama tanpa filter media (versi 1.0, Zstandard polos pada level bawaan) adalah tolok ukur yang tepat untuk nilai lapisan media:

Setnikpak 1.0 (tanpa filter)nikpak 1.1 -m2Pengurangan
6 foto BMP 3,580,971 2,035,223 43.2 %
16 berkas ProTracker MOD 1,260,607 966,622 23.3 %
35 gallery WAV (mono 16-bit) 1,876,722 1,529,219 18.5 %
Music 44.1 kHz stereo 16-bit 15,585,422 9,415,519 39.6 %
Music 22.05 kHz mono 16-bit 3,887,183 2,635,819 32.2 %
Music 22.05 kHz mono 8-bit 1,078,493 742,462 31.2 %



Perbandingan dengan FLAC

Untuk musik stereo 44.1 kHz, 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

Kode sumber dan dokumen bukan media, sehingga uji ini memeriksa apakah keunggulan nikpak di tempat lain merugikannya pada berkas biasa.

Alat dan levelUkuran (byte)WaktuEkstraksi
nikpak -m5 24,443,483 45.6 s 1.8 s
RAR 7 -m5 -s -md256m 25,862,475 36.2 s
RAR 7 -m5 -s 26,002,812 26.7 s
RAR 7 -m3 -s 26,536,863 16.7 s 1.5 s
nikpak -m4 26,814,023 13.5 s
nikpak -m3 30,329,965 2.0 s
nikpak -m2 (bawaan 1.1) 36,266,743 0.9 s 0.8 s
RAR 7 -m5 (default, not solid) 50,851,230 14.8 s
RAR 7 -m3 (default, not solid) 50,974,773 9.7 s 2.3 s



Figure 5: general data, size and creation time on one core.
Gambar 5: data umum, ukuran dan waktu pembuatan pada satu inti.

Membaca tabel dengan jujur:

  • 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 -m4 berada dalam sekitar 1 % dari level solid bawaan RAR dalam 81 % waktu (13.5 s lawan 16.7 s).
  • Level cepat: -m2 menukar 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 -s ke RAR.

11.4 Kecepatan pada satu berkas media besar

Figure 6: creating an archive from the 17 MB stereo WAV.
Gambar 6: membuat arsip dari WAV stereo 17 MB.
OperasinikpakRAR 7Ukuran
Create, fast / RAR default 1.45 s (-m2) 2.54 s (-m3)9,415,519 vs 11,128,595
Create, maximum level 3.14 s (-m5) 5.87 s (-m5)9,411,898 vs 11,024,411
Extract 0.28 s 0.23 skeluaran sama



Pada media, nikpak lebih kecil sekaligus lebih cepat dibuat. RAR mengekstrak sedikit lebih cepat; kemungkinan penyebabnya adalah dekode NAC melakukan prediksi bilangan bulat untuk setiap sampel, yang sedikit lebih mahal daripada penyalinan kecocokan yang mendominasi dekode umum.

11.5 Overhead enkripsi

Pada set data 222 MB, arsip terenkripsi memakan waktu 0.92 s lawan 0.64 s tanpa enkripsi, dan 11,087 byte (0.03 %) lebih besar. Selisihnya termasuk penurunan Argon2id, sehingga biayanya didominasi oleh sepersekian detik yang tetap.

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

Diperbarui untuk nikpak 1.2.0. Pada versi pertama putaran ini, dengan nikpak 1.1.0, 7-Zip -mx9 unggul pada teks (1.4 %), berkas office (3.3 %), dan kode sumber (8.5 %). nikpak 1.2.0 menambahkan rekompresi Deflate (7.9) dan level maksimum baru yang dibangun di atas LZMA2 dan PPMd (6.7), dan diukur lagi pada mesin yang sama dengan berkas yang sama. Angka untuk RAR, 7-Zip, dan ZIP berasal dari putaran pertama.

Bagian 11.2 hingga 11.5 membandingkan nikpak hanya dengan RAR. Putaran kedua ini menambahkan dua pengarsip yang sudah dimiliki kebanyakan orang, 7-Zip dan format klasik ZIP, serta dua jenis berkas yang diarsipkan setiap hari: teks polos dan dokumen office (.doc, .docx, .xls, .xlsx, .csv, .pdf). Keempat alat dijalankan satu per satu pada mesin dan berkas yang sama, dan RAR diukur lagi. Korpora dibangun ulang dari sumber publik yang sama, sehingga ukuran dan waktu absolut berbeda dari yang di 11.2 hingga 11.4. Bandingkan angka di dalam bagian ini, bukan antar bagian.

Metode

ItemDetail
MesinMesin virtual Linux x86-64 (Intel Xeon, 2.8 GHz). Setiap perintah dipatok ke satu inti CPU dengan taskset dan dijalankan satu utas (nikpak -mt1, RAR -mt1, 7-Zip -mmt=1; ZIP satu utas secara desain).
Perangkat lunaknikpak 1.2.0 (build release); RAR 7.00 (-ma5, solid); 7-Zip 23.01 (format .7z, LZMA2, solid secara bawaan); Info-ZIP Zip 3.0 dan UnZip 6.0 (Deflate).
Levelnikpak: level cepat -m2 dan maksimum -m5, yang menjadi bawaan sejak 1.2.1 (dan -m4). Lainnya: bawaan dan maksimum, RAR -m3 -s / -m5 -s, 7-Zip -mx5 / -mx9, ZIP -6 / -9. RAR diberi mode solid (-s), karena tiga lainnya solid atau, dalam kasus ZIP, tidak bisa.
WaktuDetik wall-clock. Set di bawah 50 MB: terbaik dari tiga kali jalankan. Set umum: satu kali jalankan.
VerifikasiSemua 92 arsip diekstrak dan dibandingkan dengan aslinya memakai diff -r. Semua identik.



Materi uji

SetBerkasUkuran (byte)Isi
Gambar BMP 8 6,987,840Enam foto dari set sampel scikit-image sebagai BMP 24-bit, plus foto grayscale 8-bit dan tekstur kerikil 8-bit.
ProTracker MOD 16 2,252,60416 modul ProTracker terbesar dalam koleksi uji libxmp.
Gallery WAVs 35 2,991,82035 suara galeri LibreOffice yang sama seperti di 11.1.
Music, empat format 4 × 1 53,417,226Karya 100 detik baru (piano, strings, bass, flute, drums) yang dirender dengan TiMidity++ dan Freepats pada 44.1 kHz stereo 16-bit, lalu dikonversi SoX ke mono 16-bit 22.05 kHz, 8-bit, dan stereo 24-bit 48 kHz.
Teks polos 18 11,793,318Delapan belas buku Project Gutenberg sebagai .txt (Austen, Melville, Shakespeare, King James Bible, dan lainnya).
Berkas Office 60 39,100,91512 laporan sebagai .docx, .doc, dan .pdf (teks, judul, tabel, dan beberapa foto) dan 8 buku kerja penjualan berisi 500 hingga 30,000 baris sebagai .xlsx, .xls, dan .csv (dengan rumus), disimpan oleh LibreOffice.
General data 11,473 190,454,632Pustaka standar Python 3.12 dan 3.13, paket Debian Python, header C (/usr/include), dan /usr/share/doc. Symbolic link dihapus.



Level maksimum: ukuran arsip

SetAslinikpak -m5RAR 7 -m57-Zip -mx9ZIP -9
8 gambar BMP 6,987,840 3,557,350 4,394,310 4,195,043 4,974,680
16 berkas ProTracker MOD 2,252,604 1,127,607 1,264,245 1,166,855 1,408,085
35 gallery WAV (mono 16-bit) 2,991,820 1,346,484 1,596,971 1,484,879 1,852,279
Music 44.1 kHz stereo 16-bit 17,760,408 8,731,989 10,460,042 10,666,922 15,225,764
Music 22.05 kHz mono 16-bit 4,440,136 2,458,867 2,797,026 2,784,080 3,736,722
Music 22.05 kHz mono 8-bit 2,220,090 606,840 725,416 642,341 836,989
Music 48 kHz stereo 24-bit 28,996,592 18,198,056 21,229,465 25,542,036 26,980,770
18 buku teks polos (.txt) 11,793,318 2,741,898 3,519,622 3,259,868 4,223,579
60 berkas office 39,100,915 6,887,729 11,186,217 10,085,779 17,399,998
Data umum (11,473 berkas) 190,454,632 28,175,618 33,606,893 28,879,398 62,198,510



Semua ukuran dalam byte. Arsip terkecil di setiap baris ditampilkan tebal.

Figure 7: archive size at the maximum level of each tool, as a percentage of the original (lower is better).
Gambar 7: ukuran arsip pada level maksimum setiap alat, sebagai persentase aslinya (lebih rendah lebih baik).

Level cepat: ukuran dan waktu pembuatan

Setnikpak -m2RAR 7 -m37-Zip -mx5ZIP -6
8 gambar BMP 54.0 % · 0.39 s 63.0 % · 2.09 s 60.1 % · 3.51 s 71.2 % · 0.35 s
16 berkas ProTracker MOD 52.4 % · 0.61 s 56.2 % · 0.43 s 51.9 % · 0.69 s 62.7 % · 0.10 s
35 gallery WAV (mono 16-bit) 51.1 % · 0.41 s 53.6 % · 0.71 s 49.6 % · 1.96 s 61.9 % · 0.24 s
Music 44.1 kHz stereo 16-bit 49.2 % · 1.72 s 59.9 % · 3.60 s 60.1 % · 14.03 s 85.7 % · 0.82 s
Music 22.05 kHz mono 16-bit 55.4 % · 0.58 s 64.1 % · 0.95 s 62.7 % · 2.14 s 84.2 % · 0.22 s
Music 22.05 kHz mono 8-bit 27.4 % · 0.77 s 33.3 % · 0.52 s 28.9 % · 2.13 s 38.2 % · 0.32 s
Music 48 kHz stereo 24-bit 62.8 % · 2.06 s 73.6 % · 7.54 s 88.1 % · 13.54 s 93.0 % · 1.19 s
18 buku teks polos (.txt) 35.2 % · 0.11 s 30.4 % · 5.53 s 27.7 % · 11.76 s 36.0 % · 0.89 s
60 berkas office 38.0 % · 0.22 s 29.5 % · 8.25 s 26.2 % · 21.85 s 44.7 % · 1.83 s
Data umum (11,473 berkas) 25.3 % · 1.67 s 18.0 % · 48.19 s 17.0 % · 93.71 s 32.9 % · 7.32 s



nikpak -m2 lawan level bawaan alat lain. Setiap sel menampilkan ukuran arsip sebagai persentase aslinya dan waktu pembuatan pada satu inti. Arsip terkecil di setiap baris ditampilkan tebal.

Data umum secara rinci

Alat dan levelUkuran (byte)% dari asliPembuatanEkstraksi
nikpak -m5 28,175,618 14.8 % 154.3 s 5.6 s
7-Zip -mx9 28,879,398 15.2 % 120.9 s 6.0 s
RAR 7 -m5 -s -md256m 32,350,575 17.0 % 73.6 s 7.0 s
7-Zip -mx5 32,375,802 17.0 % 93.7 s 4.5 s
nikpak -m4 33,295,133 17.5 % 37.8 s 3.3 s
RAR 7 -m5 -s 33,606,893 17.6 % 72.4 s 6.7 s
RAR 7 -m3 -s 34,236,198 18.0 % 48.2 s 5.9 s
nikpak -m2 48,229,284 25.3 % 1.7 s 0.9 s
RAR 7 -m3 (not solid) 56,038,351 29.4 % 20.2 s 6.9 s
ZIP -9 62,198,510 32.7 % 28.2 s 6.9 s
ZIP -6 62,672,415 32.9 % 7.3 s 5.4 s



Figure 8: general data, size and creation time of all four tools on one core.
Gambar 8: data umum, ukuran dan waktu pembuatan keempat alat pada satu inti.

Dari 1.1.0 ke 1.2.0

Setnikpak 1.1.0 -m5nikpak 1.2.0 -m57-Zip -mx91.2.0 vs 7-Zip
18 buku teks polos 3,306,819 2,741,898 3,259,86815.9 % lebih kecil
60 berkas office 10,417,750 6,887,729 10,085,77931.7 % lebih kecil
General data 31,322,041 28,175,618 28,879,3982.4 % lebih kecil



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

Pada level maksimum, nikpak 1.2.0 membuat arsip terkecil dari keempat alat pada setiap set yang diukur, 2.4 hingga 31.7 % lebih kecil daripada 7-Zip -mx9. Biayanya adalah kecepatan: -m5 satu utas dan lebih lambat daripada 7-Zip pada berkas office dan kode sumber. Membuatnya lebih cepat ada di peta jalan (bagian 15.2).

12 nikpak dan RAR dibandingkan

RAR adalah pengarsip yang luar biasa dan dipakai luas, dan bab ini tidak berpura-pura sebaliknya. Ia memaparkan di mana pengukuran dan desain menguntungkan nikpak, di mana RAR unggul, dan siapa yang harus memilih apa.

12.1 Di mana nikpak unggul

AreanikpakBukti
Audio, gambar, musik tracker12 - 39 % lebih kecil daripada RAR 7 -m5 pada setiap set media yang diukurBagian 11.2
Kode sumber, level maksimum5.5 % lebih kecil daripada pengaturan solid terbaik RARBagian 11.3
Kecepatan pada level cepat -m20.9 s lawan 9.7 - 16.7 s untuk 197 MB; 1.45 s lawan 2.54 s untuk WAVBagian 11.3, 11.4
Cipher dan modeXChaCha20-Poly1305, terautentikasi; RAR5 memakai AES-256 dalam mode CBC, yang tidak terautentikasi dan bergantung pada checksum terpisahBab 8
Hash kata sandiArgon2id, memakan memori (64 MiB); RAR5 memakai PBKDF2-HMAC-SHA256, yang terikat CPU dan terparalelkan murah di GPUBagian 8.2
Privasi nama berkasSelalu terenkripsi; RAR memerlukan saklar -hpBagian 8.4
Pembuatan kata sandiBawaan: kata sandi acak kuat saat tidak ada yang diberikanBagian 3.3
Bukti perusakanPengurutan ulang, pemotongan, dan perubahan header terdeteksi secara kriptografisBagian 8.6
TransparansiSumber lengkap dan format terdokumentasi; implementasi dalam Rust yang aman memoriBab 5, 10
DistribusiSatu berkas eksekusi statis (jendela drop dan baris perintah; sekitar 2.3 MB tanpa jendela), atau installer Windows kecil; shareware, gratis untuk penggunaan pribadi (3.8)Bab 13



12.2 Di mana RAR unggul

AreaRAR 7nikpak hari ini
Record pemulihanDapat memperbaiki arsip yang rusakMendeteksi kerusakan, tidak dapat memperbaikinya
Arsip multi-volumeYaTidak
Arsip self-extractingYaTidak
Memperbarui arsipMenambah, mengganti, dan menghapus berkas di tempatHanya membuat atau menimpa
Antarmuka grafisWinRAR, dengan integrasi shellJendela drop untuk mengompres (3.7); tanpa integrasi shell, ekstraksi dari baris perintah
Kecepatan level maksimum26.7 - 36.2 s pada set umum 45.6 s
Kecepatan ekstraksi pada media0.23 s untuk WAV 17 MB 0.28 s
Kematangan dan jangkauanPuluhan tahun pengujian lapangan; jutaan berkas .rar yang sudah adaBaru; tanpa audit independen; hanya membaca .nik



12.3 Ketahanan kuantum dalam perspektif

Baik nikpak maupun RAR5 mengenkripsi dengan kunci simetris 256-bit, sehingga keduanya tidak tersentuh algoritma Shor dan keduanya mempertahankan sekitar 128 bit keamanan terhadap Grover. Tidak ada klaim yang membedakan keduanya. Yang ditambahkan nikpak di atasnya adalah langkah kata sandi yang memakan memori (yang membuat serangan dunia nyata yang dominan, menebak kata sandi, jauh lebih mahal) dan enkripsi terautentikasi (yang membuat perusakan dapat dideteksi). Ia juga dirancang sejak awal dengan asumsi bahwa tidak ada primitif kunci publik yang akan menjadi bagian dari format arsip, dan peta jalannya berkomitmen pada skema hibrida pasca-kuantum jika berbagi kunci publik ditambahkan.

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?

Bagian 11.7 juga mengukur nikpak 1.2 terhadap 7-Zip 23.01 dan Info-ZIP 3.0. Singkatnya:

  • 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

nikpak ditulis dalam Rust dan dibangun dengan Cargo. Di Windows, Rust memerlukan linker C/C++, yang berasal dari Visual Studio Build Tools. Dalam PowerShell administrator, pasang keduanya sekali lalu buka ulang PowerShell:

winget install Rustlang.Rustup
$o = '--wait --passive --add Microsoft.VisualStudio.Workload.VCTools'
$o += ' --includeRecommended'
winget install Microsoft.VisualStudio.2022.BuildTools --override $o



Jika 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.

buildall.ps1 membangun semua yang diterbitkan dalam satu jalankan — 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

Proyek Rust tidak memakai npm, sehingga npm tidak pernah diwajibkan. Demi kemudahan, proyek memuat 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

Berkas .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/



Di macOS pasang command-line tools lebih dulu (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.

Unduhan macOS dan Linux situs ini dibuat oleh ./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

Sejak versi 1.2 nikpak memerlukan Rust 1.89 atau lebih baru. build.ps1 dan build.sh memeriksa versi yang terpasang dan menjalankan rustup update stable saat lebih lama. Dengan npm, jalankan rustup update sekali sebelum npm run build.

nikpak bergantung pada sekumpulan kecil crate yang matang. Versi persisnya dikunci di Cargo.lock, yang merupakan bagian dari paket sumber, sehingga setiap build memakai kode yang sama.

CrateTujuan
zstdKompresi Zstandard, dengan multi-threading
chacha20poly1305XChaCha20-Poly1305 dan konstruksi STREAM (RustCrypto)
argon2Penurunan kunci Argon2id (RustCrypto)
randAkses ke generator acak aman sistem operasi
zeroizeMenghapus kunci dan kata sandi dari memori
rpasswordMembaca kata sandi tanpa echo, di setiap platform
crc32fastCRC32 cepat
globEkspansi wildcard (PowerShell tidak mengekspansi wildcard untuk program native)
liblzmaMesin LZMA2 untuk -m5 (liblzma, dikompilasi statis dari sumber C)
ppmd-rustMesin PPMd varian I untuk teks pada -m5
preflate-rsRekompresi Deflate bit-persis (Microsoft, Apache-2.0); salinan vendored di vendor/preflate-rs yang coder entropi LGPL-nya (cabac) diganti range coder milik nikpak sendiri, sehingga nikpak tidak memuat kode LGPL. Memerlukan Rust 1.89 atau lebih baru
eframe / eguiAntarmuka grafis (fitur cargo opsional gui, aktif secara bawaan)
rfdDialog folder native untuk Browse
ed25519-dalekVerifikasi tanda tangan kunci lisensi (bagian 3.8)
rustybuzz, unicode-bidiShaping dan pengurutan kanan-ke-kiri untuk Hindi, Bengali, dan Arabic di jendela (fitur cargo opsional gui)



13.6 Skripting

Kode keluar yang dapat diprediksi dan kata sandi variabel lingkungan membuat nikpak mudah diskrip. Cadangan PowerShell yang memperlakukan peringatan sebagai dapat diterima dan yang lebih buruk sebagai kegagalan:

$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" }



Hal yang sama dalam skrip shell, memakai perintah daftar polos untuk memberi makan alat lain:

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

Integrasi yang dijelaskan di bagian 3.6 bergantung pada nikpak yang mengikuti sintaks RAR. Daftar periksa singkat: daftarkan ekstensi 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

Karena pengarsip menyimpan data orang, nikpak diuji pada empat level.

14.1 Pengujian unit

Tiga puluh empat pengujian otomatis dijalankan dengan cargo test --release:

AreaYang diperiksa
Aliran enkripsiRound trip pada 0, 1, 100, 65,535, 65,536, 65,537, 131,072, 131,077, dan 327,803 byte (di sekitar batas potongan 64 KiB); header yang salah (associated data), kunci yang salah, dan pemotongan semuanya harus gagal.
Batas penurunan kunciParameter Argon2id yang bermusuhan (memori besar, nol pass, nol lane, pass berlebihan) ditolak.
Codec audio NACRound trip tanpa rugi untuk audio 8/16/24/32-bit, 1, 2, 3, dan 6 kanal, sembilan jenis sinyal (keheningan, sinus berisik, white noise, gelombang persegi skala penuh, ramp, impuls tunggal, maksimum konstan, bit rendah terbuang, minimum konstan), delapan panjang blok dari 1 hingga 5000 sampel, tiga level upaya, dan pengodean verbatim paksa.
Metode audioNAC, Shuffle, dan Shuffle+Delta di semua kedalaman bit, jumlah kanal, urutan byte, dan signedness, termasuk blok yang tidak terbagi rata.
Deteksi dan berkasWAV (mono, stereo, 8/16/24/32-bit, extensible, enam kanal, potongan akhir, byte sisa ganjil, panjang data nol dan terlalu besar), AIFF, MOD (juga terpotong), dan BMP (8/24/32-bit, padding baris, data akhir); WAV floating-point, berkas kecil, dan teks tidak boleh terdeteksi; setiap berkas round-trip melalui setiap filter yang berlaku.
KetangguhanRibuan blok acak dan bit-terbalik diumpankan ke dekoder audio dan dekoder media: mereka harus mengembalikan kesalahan, tidak pernah panik atau menghabiskan memori.
Framing dan pembantuFraming potongan dengan data akhir, pembersihan jalur, pencocokan wildcard dan filter, pemformatan tanggal, pembuatan kata sandi.
Rekompresi DeflateKontainer ZIP pada level Deflate 1, 3, 6, dan 9, PDF dengan dua aliran zlib, gzip tiga anggota, non-kontainer; 400 aliran rekompresi yang rusak atau terpotong harus gagal bersih (panik preflate ditangkap).
Blok multi-mesinRound trip melalui blok zstd, LZMA2, dan PPMd di sekitar batas frame 256 KiB; 300 badan rusak atau terpotong; parameter mesin yang bermusuhan; uji coba PPMd/LZMA2.
Antarmuka grafisDijalankan pada tampilan virtual (Xvfb): layar idle, hover, progres, dan selesai diperiksa secara visual; folder yang dilepaskan diarsipkan dan diekstrak byte demi byte; Cancel dan penutupan saat kompresi tidak meninggalkan berkas; tanpa tampilan jatuh kembali ke teks petunjuk pemakaian.
LisensiKunci yang dibuat nikpak-keygen dan kit PHP identik dan diterima; nama, e-mail, jenis, atau kunci yang diubah, dan kunci yang ditandatangani kunci lain, ditolak. Pada tampilan virtual: pengingat dalam kedua urutan tombol, kesalahan kunci salah, registrasi berhasil, mulai ulang tanpa pengingat; teks tetap berada di dalam kotak.
BahasaSetiap bahasa menerjemahkan setiap teks dengan placeholder yang sama; tanda vokal Devanagari dan penyambungan Arabic dibentuk; pada tampilan virtual kesepuluh bahasa diperiksa layar demi layar (pengingat, idle, progres, selesai, About, registrasi, menu bahasa); memilih bahasa menyimpannya dan memulai ulang nikpak dalam bahasa itu.
API arsipMembaca indeks, mengekstrak satu berkas dari dalam folder (ia mendarat tanpa jalur foldernya), menghapus folder beserta isinya, dan menghapus semuanya, untuk -m5, zstd + enkripsi, dan arsip stored; kata sandi salah dilaporkan sebagaimana adanya.
Peramban arsipPembangunan pohon dengan folder tersirat, deteksi dan dekode teks (UTF-8, UTF-16, Windows-1252), pembungkusan baris, dan pencarian di penampil. Pada tampilan virtual: membuka, kata sandi, navigasi, pemilihan, pencarian, penampil, ekstrak, hapus, dan uji, dalam beberapa bahasa.
Skin dan menu pengelola berkasBerkas menu Linux dibuat dan diperiksa; satu arsip untuk pilihan dimulai sebagai tiga program; --add-here dengan tiga item dan --extract-here / --extract-to di bawah tampilan virtual; arsip terenkripsi meminta kata sandinya dan mengekstrak berkas yang identik; setiap teks antarmuka baru diterjemahkan dalam sepuluh bahasa (pernyataan every-language-translates-every-text).



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

Perusakan, pemotongan, pengurutan ulang potongan, manipulasi header, berkas sampah, dan arsip path-traversal dari bagian 10.1 dijalankan terhadap setiap kandidat rilis. Hasilnya ditabulasi di bagian 8.6 dan 10.1; hasil yang diharapkan dalam setiap kasus adalah penolakan, pesan jelas, dan kode keluar bukan nol, tidak pernah panik dan tidak pernah menulis di luar tujuan.

14.4 Cacat yang ditemukan pengujian

Kampanye pengujian adalah alasan beberapa cacat tidak ada dalam program yang dirilis. Dua contoh: pencarian parameter Rice yang gagal untuk audio 32-bit dan akan menulis kode multi-gigabyte (ditemukan matriks pengujian unit dan diperbaiki), serta kegagalan checksum zstd yang dilaporkan dengan kode keluar generik 2 alih-alih 3 (ditemukan dalam uji perusakan dan diperbaiki). Contoh ketiga adalah metodologi benchmark itu sendiri: perbandingan pertama dengan RAR memakai bawaan non-solidnya, yang menyanjung nikpak pada kode sumber; itu diulang dalam mode solid, dan hasil di bab 11 adalah yang telah dikoreksi.

15 Keterbatasan dan peta jalan

15.1 Keterbatasan saat ini

KeterbatasanDetail dan solusi
Tanpa record pemulihan, volume, atau SFXKerusakan terdeteksi, tidak diperbaiki (simpan salinan kedua arsip penting); pecah arsip besar dengan alat umum jika diperlukan.
Tanpa pembaruan di tempatFormatnya satu aliran padat. Menghapus (nikpak d, atau Delete di unNik) menulis ulang arsip; menambah berkas ke arsip yang sudah ada tidak didukung: buat arsip baru, atau timpa dengan -o+.
Akses berurutanMengekstrak satu berkas dari arsip yang sangat besar membaca apa yang mendahuluinya (entri media dilewati tanpa dekode); unNik berhenti membaca setelah berkas terpilih terakhir.
Cakupan mediaWAV dan AIFF PCM bilangan bulat, ProTracker MOD, BMP tanpa kompresi. WAV float, ADPCM, XM/S3M/IT, dan gambar terkompresi disimpan dengan kompresi biasa.
Memori pada level tinggiArsip -m4 dan -m5 memakai jendela 128 MiB; mendekompresinya memerlukan memori sebesar itu.
Level maksimum -m5Single-threaded and the slowest level. Creating needs up to about 1.1 GB of memory, extracting up to about 350 MB.
Symbolic link dan tanggalLink dilewati saat mengarsipkan dan ditolak saat mengekstrak; tanggal didaftar dalam UTC.
Tinjauan keamananBelum diaudit secara independen.
Build Windows dan macOSDikembangkan, diuji, dan di-benchmark di Linux. Jalur kode spesifik Windows dan macOS ditinjau dengan tangan tetapi belum dilatih di sistem itu: jalankan cargo test --release di sana sebelum mengandalkan build.



15.2 Peta jalan

ItemTujuan
Record pemulihanParitas Reed-Solomon agar arsip yang rusak dapat diperbaiki, fitur utama yang dirindukan pengguna RAR.
Arsip multi-volume dan dukungan pembaruanMemecah arsip besar, menambah dan mengganti berkas.
Berbagi kunci publik dengan skema hibridaMengenkripsi arsip ke kunci penerima dengan X25519 yang digabungkan dengan ML-KEM, aman jika salah satu komponennya bertahan.
Lebih banyak filter mediaAudio floating-point, tracker XM/S3M/IT, rekompresi PNG, filter 2-D untuk TGA dan TIFF tanpa kompresi.
Membaca ZIP dan RAR, integrasi shellMembuka format umum di unNik dan menyeret berkas keluar dari unNik, sehingga nikpak bisa menjadi satu-satunya alat yang terpasang. (Menu konteks Explorer dan Finder hadir di 1.5.5, bagian 3.11.)
Level maksimum yang lebih cepat-m5 satu utas dan hingga tiga kali lebih lambat daripada 7-Zip -mx9 pada berkas office: blok LZMA2 dan PPMd multi-utas, deduplikasi berkas identik, dan filter BCJ untuk berkas eksekusi.
Tinjauan keamanan eksternalAudit independen atas kode kriptografi dan pengekstrak.



Lisensi: NikPak adalah shareware closed-source, © 2026 Nicolas Choukroun, didistribusikan oleh Nikkoid LLC (LICENSE.txt, bagian 3.8); unNik adalah freeware (bagian 3.9). Komponen open-source yang dikandungnya terdaftar beserta lisensinya di THIRD-PARTY-NOTICES.txt, yang wajib disertakan pada setiap salinan. Jauhkan kunci lisensi privat (keys/nikpak-private.key) dari setiap paket yang diterbitkan dan dari root web. Simpan 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

ItemNilai
Magic 89 4E 49 4B 0D 0A 1A 0A
Versi format3 (reader menerima 1, 2, dan 3)
Ukuran header12 byte; 59 byte saat terenkripsi
Jenis record0 END, 1 FILE, 2 DIR, 3 MEDIA
Metode arsip0 store, 1 Zstandard, 2 blok multi-mesin
Mesin blok1 Zstandard; 2 LZMA2 (dictionary hingga 128 MiB ditulis, 1.5 GiB diterima); 3 PPMd8 (order 8, 192 MiB ditulis; order 2-16, 1 GiB diterima)
Rekompresi DeflateZIP, PDF, gzip; berkas hingga 512 MiB; per aliran hingga 512 MiB data polos dan 64 MiB koreksi
Panjang nama maksimum4096 byte
Potongan terenkripsi64 KiB plaintext + tag 16-byte, u32 panjang big-endian di depan
Argon2id (ditulis)64 MiB, 3 pass, 4 lane, salt 16-byte, kunci 32-byte
Argon2id (diterima)memori 8 x lane .. 1 GiB, pass 1 .. 64, lane 1 .. 64
Nonce aliranawalan acak 19-byte + counter 32-bit + flag last 1-byte = 24 byte
Panjang kata sandi minimum8 karakter
Kata sandi yang dibuat24 karakter, alfabet 56 simbol, sekitar 139 bit
Ukuran berkas media minimum8 KiB (wilayah minimal 4 KiB)
Blok NAC4096 frame sampel; blok Shuffle 32768 frame
Uji cobahingga tiga jendela 768 KiB (5 %, 45 %, 85 %); seluruh wilayah jika hingga 3 MiB; margin 2 %
Batas wilayah BMP256 MiB
Jendela Zstandardbawaan; 2^27 dengan pencocokan jarak jauh pada -m4 dan -m5
Threads1 .. 256 (-mt)



B Lampiran B: glosarium

IstilahArti
AEADEnkripsi terautentikasi dengan associated data: mengenkripsi dan mendeteksi modifikasi apa pun, juga pada data yang dikirim jelas (seperti header).
Argon2idFungsi hash kata sandi yang memakan memori, distandarkan dalam RFC 9106; mengubah kata sandi menjadi kunci dengan biaya memori yang sengaja tinggi.
CRC32Checksum 32-bit yang mendeteksi kerusakan tak disengaja. Bukan fitur keamanan.
FSEFinite-state entropy: coder entropi berbasis tabel yang dipakai Zstandard.
Algoritma GroverAlgoritma pencarian kuantum dengan percepatan kuadratik; memotong setengah panjang efektif kunci simetris.
LPCPengodean prediktif linear: memprediksi sampel dari jumlah berbobot sampel sebelumnya.
Levinson-DurbinRekursi yang menghitung koefisien prediktor optimal untuk setiap order dari autokorelasi sinyal.
LZMA2Algoritma rantai Lempel-Ziv-Markov yang dipakai 7-Zip dan xz: pencocokan LZ77 dengan optimal parsing dan binary range coder.
MEDMedian edge detector: prediktor piksel dari coder gambar LOCO-I / JPEG-LS.
Memakan memoriFungsi yang biayanya didominasi memori, yang membatasi percepatan yang tersedia dari GPU dan chip khusus.
NACCodec audio tanpa rugi nikpak.
PPMdPrediction by Partial Matching (varian I): memprediksi setiap byte dari hingga 8 byte sebelumnya; sangat kuat pada teks.
preflateMetode (dan pustaka) yang mengubah aliran Deflate menjadi data polosnya plus koreksi kecil, yang darinya aliran Deflate yang identik dapat dibangun ulang.
Rice codingKode sederhana dan cepat untuk bilangan dengan distribusi yang kira-kira geometrik: hasil bagi unary dan sejumlah bit rendah tetap.
Algoritma ShorAlgoritma kuantum yang memfaktorkan bilangan bulat dan menghitung logaritma diskrit, merusak RSA dan kriptografi elliptic-curve.
Solid archiveArsip yang dikompres sebagai satu aliran kontinu, sehingga redundansi antarbarkas dapat dieksploitasi.
STREAMKonstruksi yang mengenkripsi pesan panjang sebagai potongan terautentikasi dengan counter dan flag potongan-terakhir di dalam nonce.
Zig-zag mappingMemetakan bilangan bulat bertanda ke tak bertanda (0, -1, 1, -2 ... ke 0, 1, 2, 3 ...), sehingga magnitudo kecil menjadi bilangan kecil.
ZstandardFormat kompresi terbuka modern yang menggabungkan pencocokan LZ77 dengan pengodean entropi Huffman dan FSE.



Version 1.6.2 · October 2026 Page 19