الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تمت الإجابة ]تفسير عمل برنامج pjw-32

بدأه ghith-js في 20 سبتمبر 2012 · 4 رد · 715 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اذا امكن من الشباب شرح كيفية عمل pjw-32 من الناحية الاكواد من ناحية الرياضية ولكم جزيل الشكر

#include "stdio.h"
#include "stdlib.h"
char M[12] = {"Work for PK"};
unsigned int h, g;
int i;
void main(){
	for(i = 0; i < 12; i++){
		printf("%c ", M);
	}
	printf("\n");
		for(i = 0; i < 11; i++){
			h = g = 0;
			h = (h << 4) + M;
			if( g == (h & 0xF00000000)){
				h = h ^ (g >> 24);
				h = h ^ g;
				h = h % 211;
				printf(" %i ", h);
			}
		}
	printf("\n");
	return;
}

تم تعديل هذه المشاركة بواسطة محمد عودة في 20 سبتمبر 2012 في 20:06 — السبب: تنسيق كود

#2

مرحبا بك أخي الكريم ...

اقتباس
كيفية عمل pjw-32

ارجو منك ان تشرح هذا الاختصار .. ماذا يعني ؟

اقتباس
من الناحية الاكواد

الجزء الأول :

#include "stdio.h"
#include "stdlib.h"
char M[12] = {"Work for PK"};
unsigned int h, g;
int i;
void main(){

تضمين المكاتب .. ونعريف متحولين .. وتعريف مصفوفة محارف فيها عبارة نصية ...ثم بدء البرنامج ..

        for(i = 0; i < 12; i++){
                printf("%c ", M);
        }
        printf("\n");

نمر على كل الحروف في العبارة لنقوم بطباعتها....

الجزء الثاني :

                for(i = 0; i < 11; i++){
                        h = g = 0;
                        h = (h << 4) + M;
                        if( g == (h & 0xF00000000)){
                                h = h ^ (g >> 24);
                                h = h ^ g;
                                h = h % 211;
                                printf(" %i ", h);
                        }
                }

أشم رائحة التشفير من هذا الكود ...

ولكن هناك عدة أخطاء ..وملاحظات ...

     h = g = 0;
                        h = (h << 4) + M;

أسندنا للمتحول h قيمة الصفر .. وفي السطر التالي قمنا بإزاحة منطقيى لليسار بمقدار 4 !!! لا داعي لهذه الإزاحة طالما أن h صفر !!!

المهم أن هذه العبارة ستقوم بإسناد الحرف رقم i من النص إلى المتحول h

 if( g == (h & 0xF00000000))

نعلم أن g=0 فلماذا وضعنا هذا الصفر العجيب في متحول مستقل !!

كما أن الرقم

0xF00000000 من 9 خانات عشرية!!! يعني لن يتسع له المتغير unsigned int في أنظمة 32بت !!!

كما أنه حتى لو اتسع فإن حجم الحرف هو 8 بت وهذا يعني أنه مهما كان الحرف الذي خزّنا قيمته داخل h سيكون ناتج عملية and هو 0 !!!!

وبالتالي سندخل إلى داخل if التالية دوماً ...!!! فلماذا كل هذا ؟؟؟

الجزء الثالث:

                                h = h ^ (g >> 24);
                                h = h ^ g;
                                h = h % 211;
                                printf(" %i ", h);

قمنا بإزاحة g بمقدار 24 وقيمته أصلاً 0 وسيبقى 0 ..

ثم عملنا xor بين h والذي هو الحرف [M[i وبين الصفر أن العملية هي نفي h .. أسأل نفسي لماذا كل هذا الكود بلا فائدة ؟؟!!

ثم عدنا لنعمل xor بين h وبين الصفر أي أن h عادت لقيمتها [M[i!!!

ثم جعلنا h هي باقي قسمة h على 211 وهذه هي العملية الوحيد في البرنامج كله !!!!

يعني ببساطة يمكن اختصار كل هذا الكود إلى :

#include "stdio.h"
#include "stdlib.h"
char M[12] = {"Work for PK"};
unsigned int h, g;
int i;
void main(){
    	for(i = 0; i < 12; i++){
            	printf("%c ", M);
    	}
    	printf("\n");
            	for(i = 0; i < 11; i++)
                            	printf(" %i ", M%211);
    	printf("\n");
    	return;
}

وأرى أن البرنامج لا يقوم بأي شيء خارج عن المألوف!!!

فهل هذا ما تريده بالضبط ؟؟؟؟

بالتوفيق

2
#3

جزاك الله كل خير اخ مصطفى 36a2

البرنامج هذا مسؤل عن

PJW-32 (hashpjw) - دالة البعثرة

لوظيفة ادخال رسالة التعسفي يولد قيمة 32 بت التجزئة، هذا بيأدي الى تجزئة الرسالة. يتم استخدام هذه الخوارزمية في الأشجار التجزئة tablitsax والديكارتية، وكذلك إجراءات التحقق من مفاتيح التسجيل لحماية البرمجيات. حاليا، يتم استخدام هذه الدالة في شكل لينكس ELF الملف، واختيار الملفات الثنائية القياسية في يونكس مثل أنظمة

#4

الـPJW خورزمية hashing خفيف, ولاتصلح لشئ أكثر من إكتشاف الأعطاب في الملفات الصغيرة. تطبيقك لها غير صحيح :

#include <stdio.h>
#include <string.h>

unsigned int hash(char *data, unsigned int len);

int main(int argc, char **argv)
{
    char *data    = "Work for PK";

    printf("hash = %.8X\n", hash(data, strlen(data)));

    return 0;
}

unsigned int hash(char *data, unsigned int len)
{
    unsigned int h = 0;
    unsigned int g = 0;
    unsigned int i = 0;

    for( i = 0 ; i < len ; i++ ) {
        h = (h << 4) + data;

        if( (g = (h & 0xf0000000)) )
            h = ((h ^ (g >> 24)) & 0x0fffffff);
    }

    return h;
}

إذا كنت تواجه مشكلة في فهم تلك العمليات إطلع على : المرفقات التعامل مع البتات والبايتات والعمليات المنطقية عليها

هذا الكود مكتوب لـgcc وحجم الـint فيه أربع بايتات, 32 بت.

تم تعديل هذه المشاركة بواسطة Mr.B في 22 سبتمبر 2012 في 17:29

#5

جزاك الله كل خير اخ Mr.B

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…