delsum delsum هو تطبيق CLI لمعرفة عمليات الفحص المستخدمة في ملف.
يوجد حاليًا ثلاثة مخصصات فرعية:
check : بالنظر إلى مواصفات لخوارزمية Checksum وقائمة من الملفات ، فإن هذا ببساطة يخرج اختبارات هذه الملفات.part : بالنظر إلى مواصفات لخوارزمية Checksum وقائمة من الملفات ذات الفحص المقابل ، فإن هذا يجد أجزاء من الملفات التي تحتويreverse : بالنظر إلى قائمة بالملفات مع عمليات فحص المقابلة checkيحسب هذا المفوض الفرعي فحوصات مع خوارزمية معينة.
مثال:
$ 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
يمكن تحديد الخوارزمية مباشرة كوسيطة مع -m أو يمكن توفير قائمة من الخوارزميات في ملف.
يتم إعطاء بداية أو نهاية النطاق لحساب عمليات الاختبار لـ -S أو -E ويمكن أيضًا أن تكون سلبية لجعلها نسبية إلى النهاية. على سبيل المثال ، لحساب الفحوصات من جميع البايتات باستثناء آخر الاثنين ، يحدد واحد -S 0 و -E-3 (إنه شامل ، لذلك لا يزال -3 جزءًا من المبلغ).
للاطلاع على الخوارزميات المتاحة وكيفية تحديدها ، انظر هنا.
partيجد هذا المجموعة الفرعية جميع أجزاء قائمة الملفات حيث تتطابق جميع عمليات الفحص المعطاة. يجب أن تكون أجزاء الملف التي تطابق هي نفس الملفات.
مثال:
$ 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
في هذه الحالة ، يتطابق الفحص في الجزء 0x8:-0x3 ، حيث يكون -0x3 نسبيًا من النهاية. هذا نطاق شامل ، وهذا يعني أن الفحص الذي ينتقل من البداية إلى النهاية سيكون له نطاق 0x0:-0x1 . إذا كانت الملفات بأحجام 15 و 16 و 18 بايت على التوالي ، فإن هذا الإخراج يعني ذلك
file_a على Checksum 1234 من البايت 8 إلى 13file_b على Checksum 5678 من البايت 8 إلى 14file_c على Checksum abcd من البايت 8 إلى 16 يمكن للمرء أيضًا أن يكون نهاية الأجزاء نسبية من بداية الملف (وليس النهاية) باستخدام علامة -s . علاوة على ذلك ، فإن -S و -E يسمحان بتقييد حيث تبدأ النطاقات وتنتهي من خلال تحديد النطاقات (شاملة أيضًا). على سبيل المثال ، عندما تكون النطاقات 0x1:0xa ، 0x3:0x10 و 0x4:0xb ، فإن تحديد -S0x0:0x3 سيسمح فقط لجزء البدء من النطاقات بين 0 و 3 شامل ، لذلك لن يتم طباعة 0x4 . هذا يمكن أن يساعد في تجنب الإيجابيات الخاطئة ويمكن أيضا تقليل وقت التنفيذ.
هناك فرصة ضئيلة لإخراج شيء مثل 0x1,0x6:0x5,0x10 . هذا يعني فقط أن كل مجموعة ممكنة. في هذه الحالة ، سيكون لدى المرء 0x1:0x5 ، 0x1:0x10 و 0x6:0x10 . على الرغم من أن 0x6:0x5 سيكون من الناحية النظرية أيضًا اختيارًا ، إلا أنه ليس ساري المفعول لأنه يعود إلى الوراء.
من خلال استغلال خطية الفحوصات ، يمكن القيام بهذه العملية برمتها في الوقت المناسب تقريبًا ، ولكن ضع في اعتبارك أن لديها مساحة كبيرة (خطي) وقد تنفد من الذاكرة إذا قمت بتشغيلها على حفنة من ملفات 500 ميغابايت.
يمكن للمرء أيضًا إعطاء قائمة من الخوارزميات في ملف كمدخل لـ -M . يمكن أن يكون هذا مفيدًا ، لأنه يسمح ببساطة بوضع خوارزمية الشيكات القليلة الأكثر شيوعًا هناك وابحث إذا كانت أي خوارزميات في أي جزء من الملفات لديها عمليات التحقق المطلوبة. للاطلاع على الخوارزميات المتاحة وكيفية تحديدها ، انظر هنا.
reverseيجد هذا المجموعة الفرعية معلمات خوارزمية الاختبارات.
من خلال الملفات والتحققات المعطاة ، يبحث عن معلمات الخوارزمية التي تحتوي الملفات بأكملها على عمليات الفحص المحددة.
لاحظ أنه على الأقل يجب تحديد الخوارزمية الأساسية وعرض الفحص (على سبيل المثال ، crc width=32 ). للاطلاع على الخوارزميات المتاحة وكيفية تحديدها ، انظر هنا.
مثال:
$ 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
تحتاج عمومًا إلى 3 ملفات ، وبالنسبة لخوارزميات أخرى غير modsum ، يحتاج أحد الملفات على الأقل إلى طول مختلف. من الممكن أيضًا تحديد بعض المعلمات للخوارزمية (باستخدام -m 'crc width=32 init=0' ) ، والذي يحتاج إلى عدد أقل
إذا كان لديك ملفات بطول معين فقط ، ولكن أيضًا تهتم فقط بالتحقق من هذا الطول ، بالنسبة modsum لا يمكنك ببساطة تعيين init=0 .
عادة ما يكون سريعًا جدًا ؛ على سبيل المثال ، يكون وقت التشغيل لخوارزمية عكس CRC في معظم الحالات حول O(n*log^2(n)*log(log(n))) حيث n هي عبارة عن ملفات ، وذلك بفضل خوارزمية GCD السريعة التي يتم تنفيذها داخل مكتبات NTL و GF2X.
بالنسبة لبعض المعلمات ، يتم البحث في مجموعات محتملة فقط:
wordsize عن قوى 2 مضاعفات 8 أصغر أو تساوي widthrefin وإعادة refout عن refin = refout للبحث في هذه المعلمات ، إما تحديدها يدويًا أو استخدم وسيطة CLI --extended-search .
يوجد حاليًا ثلاث عائلات من الخوارزميات: modsum و fletcher و crc . تم تحديدها على هذا النحو: algofamiliy width=123 para1=ff para2=true para3=10 name="algoname" . لاحظ أن جميع المعلمات العددية باستثناء width wordsize في سداسي عشري.
حاليا ، هذه هي مشتركة تراكم جميع أنواع المبلغ:
width : عرض الفحص في البتاتout_endian : Endian of the Checksum ، يمكن أن يكون إما little أو bigwordsize : عدد أجزاء الكلمة في نص الإدخال. يجب أن يكون مضاعفًا من 8 و 8 و 64. على سبيل المثال ، في عمليات فحص بسيطة ، باستخدام wordsize=16 من شأنه أن يقطع الملف في أعداد صحيحة 16 بت وإضافتها إلى module Modulo.in_endian : إنديان من كلمات الإدخال ، يمكن أن يكون إما little أو big .modsum مجموع وحدات بسيطة مع width المعلمات ، init module .
يتوافق مع
sum = init
for byte in file:
sum = (sum + byte) % module
return sum
لاحظ أنه بالنسبة module 0 ، فإنه يعادل 2^width .
القيم الافتراضية module init كلاهما 0.
fletcher مجموع يشبه Fletcher مع width المعلمات ، init ، addout ، module swap .
يتوافق مع
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
يتم الإخراج في نموذج "معبأة" حيث يتم تخزين Sum1 في الجزء السفلي/بت 2 بت و SUM2 في العرض الأعلى/2 (أو العكس إذا تم تمكين swap ). المعلمات هي:
width : عرض الاختبارات المعبأة بأكملها. إلزامي.module : القيمة التي لتقليلها. module = 0 تعني 2^(width/2) وهي القيمة الافتراضية.init : القيمة لتهيئة الفحص العادي مع. الافتراضات إلى 0.addout : القيمة المعبأة التي يتم إضافتها في نهاية المبلغ. تتم إضافة الجزء العالي دائمًا إلى الجزء العالي من الفحص في النهاية ، بغض النظر عن swap . الافتراضات إلى 0.swap : العلم المنطقي الذي يشير إلى أن المبلغ العادي يجب أن يكون في النصف العالي من الاختبارات المعبأة. الإعدادات الافتراضية إلى false .crcخوارزمية CRC مع معلمات وفقًا لنموذج Rocksoft^TM ، كما هو موثق في "دليل غير مؤلم للكشف عن خطأ CRC".
لديها المعلمات التالية:
width : العرض في أجزاء من الفحص (ودرجة بولي). إلزامي.poly : مولد متعدد الحدود ، في التدوين الطبيعي. إلزامي (باستثناء reverse ).init : القيمة الأولية لحالة CRC. الافتراضات إلى 0.xorout : القيمة النهائية إلى xor إلى المبلغ. الافتراضات إلى 0.refin : العلم المنطقي الذي يشير إلى ما إذا كان يجب أن تعكس أجزاء بايت المدخلات. الإعدادات الافتراضية إلى false .refout : العلم المنطقي الذي يشير إلى ما إذا كان سيعكس أجزاء الفحص النهائي ، قبل إضافة xorout . الإعدادات الافتراضية إلى false . لاحظ أن القيم الأخرى wordsize مع in_endian=little (المعيار) هي نفسها تبديل البايتات في كل مجموعة من wordsize البتات قبل حساب wordsize=8 الاختبارات.
تم العثور على بعض (غير مكتمل) شرح الخوارزميات المستخدمة هنا.
هناك بناء Linux يحتوي على مكتبة NTL التي تم تجميعها هنا ، ولكن ضع في اعتبارك أنه يتم تجميعها دون معظم امتدادات X86 الحديثة ، وبالتالي لا يمكنها الاستفادة من بعض الروتين المحسّن في gf2x مما يجعل CRC عكس الكثير. أنا أيضًا أغبياء جدًا في القيام ببناء Windows ، آسف لذلك.
يرتبط هذا البرنامج مقابل NTL و gf2x و gmp .
إذا كنت على نظام قائم على Debian ، فيمكنك تثبيته مع
apt-get install libgmp-dev libgf2x-dev libntl-dev
يمكنك أيضًا تجميعهم بأنفسكم ، انظر هنا. سيجعل ذلك عمومًا أسرع ثنائي ، حيث يمكن استخدام ملحقات مجموعة التعليمات ، وهناك أيضًا ممكن لضبط معلمات الخوارزمية.
إذا قمت بتثبيت cargo ، فيجب أن يكون من الممكن بعد ذلك تجميع هذا في جذر دليل المشروع مع
cargo install --path .
أو دون تنزيل المستودع ،
cargo install delsum
إذا كنت ترغب في ربط مكتبة NTL بشكل ثابت ، فيمكنك تعيين متغير البيئة DELSUM_STATIC_LIBS=1 عند تشغيل cargo .
تم ترخيص مدونة هذا المشروع بموجب ترخيص معهد ماساتشوستس للتكنولوجيا.