delsum delsum adalah aplikasi CLI untuk mencari tahu checksum yang digunakan dalam file.
Saat ini ada tiga sub -perintah:
check : Diberikan spesifikasi algoritma checksum dan daftar file, ini hanya menghasilkan checksum file -file ini.part : Diberikan spesifikasi algoritma checksum dan daftar file dengan checksum yang sesuai, ini menemukan bagian -bagian dari file yang memiliki checksum yang diberikanreverse : Diberikan daftar file dengan checksum yang sesuai, ini menemukan parameter checksum yang digunakan checkSub -perintah ini menghitung checksum dengan algoritma yang diberikan.
Contoh:
$ delsum check -m 'crc width=32 poly=0x4c11db7 init=0xffffffff xorout=0xffffffff refin=true refout=true' file_a file_b file_c
700b14f5,e1207917,79741cb2
Algoritma dapat ditentukan secara langsung sebagai argumen dengan -m atau daftar algoritma dapat disediakan dalam file.
Mulai atau akhir kisaran untuk menghitung checksum diberikan dengan -S atau -E dan juga bisa negatif untuk membuatnya relatif ke akhir. Misalnya, untuk menghitung checksum dari semua byte kecuali dua terakhir, satu menentukan -S 0 dan -E-3 (inklusif, jadi -3 masih menjadi bagian dari jumlah).
Untuk algoritma yang tersedia dan cara menentukannya, lihat di sini.
partSub -perintah ini menemukan semua bagian dari daftar file di mana semua checksum yang diberikan cocok. Bagian -bagian dari file yang cocok harus sama dengan file yang sama.
Contoh:
$ delsum part -m 'modsum width=16 module=ffff' -c 1234,5678,abcd file_a file_b file_c
modsum width=16 module=ffff:
0x8:-0x3
Dalam hal ini, checksum cocok di bagian 0x8:-0x3 , di mana -0x3 relatif dari akhir. Ini adalah rentang inklusif, yang berarti bahwa checksum yang berjalan dari awal hingga akhir akan memiliki kisaran 0x0:-0x1 . Jika file masing -masing dari ukuran 15, 16 dan 18 byte, maka output ini berarti itu
file_a memiliki checksum 1234 dari byte 8 hingga 13file_b memiliki checksum 5678 dari byte 8 hingga 14file_c memiliki checksum abcd dari byte 8 hingga 16 Seseorang juga dapat memiliki akhir bagian relatif dari awal file (dan bukan akhir) dengan menggunakan bendera -s . Selain itu, -S dan -E memungkinkan seseorang untuk membatasi di mana rentang dimulai dan diakhiri dengan menentukan rentang (juga inklusif). Misalnya, ketika secara normal, rentang 0x1:0xa , 0x3:0x10 dan 0x4:0xb akan menjadi output, menentukan -S0x0:0x3 hanya akan memungkinkan bagian awal dari rentang menjadi antara 0 dan 3 inklusif, jadi 0x4 tidak akan dicetak. Ini dapat membantu menghindari positif palsu dan juga dapat mengurangi waktu eksekusi.
Ada kemungkinan kecil bahwa itu akan menghasilkan sesuatu seperti 0x1,0x6:0x5,0x10 adalah output. Ini hanya berarti bahwa setiap kombinasi dimungkinkan. Dalam hal ini, seseorang akan memiliki 0x1:0x5 , 0x1:0x10 dan 0x6:0x10 . Sementara 0x6:0x5 secara teoritis juga akan menjadi pilihan, itu bukan pilihan yang valid karena mundur.
Dengan mengeksploitasi linearitas checksum, seluruh proses ini dapat dilakukan dalam waktu yang kira -kira loglinear, tetapi perlu diingat bahwa ia memiliki overhead ruang (linier) yang besar dan Anda mungkin kehabisan memori jika Anda menjalankannya pada banyak file 500MB.
Seseorang juga dapat memberikan daftar algoritma dalam file sebagai input ke -M . Ini dapat bermanfaat, karena memungkinkan untuk hanya menempatkan beberapa algoritma checksum yang paling umum di sana dan melihat jika ada algoritma di bagian mana pun dari file memiliki checksum yang diinginkan. Untuk algoritma yang tersedia dan cara menentukannya, lihat di sini.
reverseSub -perintah ini menemukan parameter algoritma checksum.
Dengan file dan checksum yang diberikan, ia mencari parameter algoritma yang seluruh file memiliki checksum yang diberikan.
Perhatikan bahwa setidaknya algoritma mendasar dan lebar checksum harus ditentukan (misalnya, crc width=32 ). Untuk algoritma yang tersedia dan cara menentukannya, lihat di sini.
Contoh:
$ delsum reverse -m 'crc width=32' -c 700b14f5,e1207917,79741cb2 file_a file_b file_c
crc width=32 poly=0x4c11db7 init=0xffffffff xorout=0xffffffff refin=true refout=true
Anda biasanya memerlukan 3 file, dan untuk algoritma selain modsum setidaknya satu dari file yang harus memiliki panjang yang berbeda. Dimungkinkan juga untuk menentukan beberapa parameter algoritma (menggunakan misalnya -m 'crc width=32 init=0' ), yang membutuhkan lebih sedikit file atau menghasilkan lebih sedikit positif palsu.
Jika Anda hanya memiliki file dengan panjang tertentu, tetapi juga hanya peduli tentang checksum dengan panjang itu, untuk algoritma bukan modsum Anda cukup mengatur init=0 .
Biasanya cukup cepat; Misalnya runtime untuk algoritma pembalik CRC adalah dalam banyak kasus di sekitar O(n*log^2(n)*log(log(n))) di mana n adalah ukuran file, yang berkat algoritma GCD cepat yang diterapkan dalam pustaka NTL dan GF2X.
Untuk beberapa parameter, hanya kombinasi yang mungkin dicari:
wordsize dicari kekuatan 2 kelipatan 8 yang lebih kecil atau sama dengan widthrefin dan refout dicari refin = refout Untuk mencari parameter ini, tentukan secara manual atau gunakan argumen CLI --extended-search .
Saat ini ada tiga keluarga algoritma: modsum , fletcher dan crc . Mereka ditentukan seperti ini: algofamiliy width=123 para1=ff para2=true para3=10 name="algoname" . Perhatikan bahwa semua parameter numerik kecuali width dan wordsize dalam heksadesimal.
Saat ini, ini dibagikan kepada semua jenis jumlah:
width : Lebar checksum dalam bitout_endian : Endian of the Checksum, bisa little atau bigwordsize : Jumlah bit kata dalam teks input. Harus kelipatan 8 dan antara 8 dan 64. Misalnya, dalam checksum sederhana, menggunakan wordsize=16 akan memotong file menjadi bilangan bulat 16-bit dan menambahkannya module modulo.in_endian : Endian dari kata -kata input, bisa little atau big .modsum Jumlah modular sederhana dengan width parameter, init dan module .
Sesuai dengan
sum = init
for byte in file:
sum = (sum + byte) % module
return sum
Perhatikan bahwa untuk module 0, setara dengan 2^width .
Nilai default untuk module dan init keduanya 0.
fletcher Jumlah seperti fletcher dengan width parameter, init , addout , module dan swap .
Sesuai dengan
sum1 = init
sum2 = 0
for byte in file:
sum1 = (sum1 + byte) % module
sum2 = (sum2 + sum1) % module
sum1 = (sum1 + addout.sum1) % module
sum2 = (sum2 + addout.sum2) % module
if not swap:
returm (sum2 << (width/2)) | sum1
else:
returm (sum1 << (width/2)) | sum2
Ini adalah output dalam bentuk "dikemas" di mana SUM1 disimpan dalam lebar lebih rendah/2 bit dan SUM2 dalam lebar lebih tinggi/2 (atau sebaliknya jika swap diaktifkan). Parameternya adalah:
width : Lebar seluruh checksum yang dikemas. Wajib.module : Nilai yang dapat dikurangi. module = 0 berarti 2^(width/2) dan merupakan nilai default.init : Nilai untuk menginisialisasi checksum reguler dengan. Default ke 0.addout : Nilai yang dikemas yang ditambahkan pada akhir jumlah. Bagian tinggi selalu ditambahkan ke bagian tinggi checksum pada akhirnya, terlepas dari swap . Default ke 0.swap : Bendera Boolean yang menunjukkan bahwa jumlah reguler harus berada di bagian yang lebih tinggi dari checksum yang dikemas. Default ke false .crcAlgoritma CRC dengan parameter sesuai dengan model Rocksoft^TM, seperti yang didokumentasikan dalam "Panduan Tanpa Penyakiti untuk Deteksi Kesalahan CRC".
Ini memiliki parameter berikut:
width : Lebar bit checksum (dan derajat poli). Wajib.poly : Polinomial generator, dalam notasi normal. Wajib (kecuali untuk reverse ).init : Nilai awal status CRC. Default ke 0.xorout : Nilai akhir untuk XOR ke jumlah. Default ke 0.refin : Bendera boolean yang menunjukkan apakah akan mencerminkan bit byte input. Default ke false .refout : Bendera Boolean yang menunjukkan apakah akan mencerminkan bit checksum akhir, sebelum menambahkan xorout . Default ke false . Perhatikan bahwa nilai -nilai lain untuk wordsize dengan in_endian=little (standar) sama dengan menukar byte di setiap kelompok bit wordsize sebelum menghitung wordsize=8 checksum.
Beberapa penjelasan (tidak lengkap) dari algoritma yang digunakan ditemukan di sini.
Ada bangunan Linux yang memiliki perpustakaan NTL yang dikompilasi di sini, tetapi perlu diingat bahwa itu dikompilasi tanpa sebagian besar ekstensi x86 modern dan oleh karena itu tidak dapat memanfaatkan beberapa rutinitas yang dioptimalkan dalam gf2x yang membuat CRC membalik lebih cepat. Saya juga terlalu bodoh untuk melakukan build windows, jadi maaf untuk itu.
Program ini menghubungkan terhadap NTL , gf2x dan gmp .
Jika Anda berada di sistem berbasis Debian, Anda dapat menginstalnya
apt-get install libgmp-dev libgf2x-dev libntl-dev
Anda juga dapat mengkompilasi mereka sendiri, lihat di sini. Ini umumnya akan membuat biner tercepat, karena ekstensi set instruksi dapat digunakan dan ada juga kemungkinan menyetel parameter algoritma.
Jika Anda memiliki cargo terpasang, maka harus dimungkinkan untuk mengkompilasi ini di root direktori proyek dengan
cargo install --path .
atau, tanpa mengunduh repositori, dengan
cargo install delsum
Jika Anda ingin menautkan pustaka NTL secara statis, Anda dapat mengatur variabel lingkungan DELSUM_STATIC_LIBS=1 saat menjalankan cargo .
Kode proyek ini dilisensikan di bawah lisensi MIT.