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

Digital Signature Algorithm

بدأه ghith-js في 20 سبتمبر 2012 · 3 رد · 3,997 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام عليكم

اذا امكن شرح عمل Digital Signature Algorithm الرياضية والكود اذا امكن ولكم جزيل الشكر

#2

أظن أن هذا المقال سيفيدك ..(للأخ أحمد الشنقيطي )

كما أن سؤالك أخي الكريم عام جداً ... يعني بعض التخصيص سيكون أفضل لتحصل على الإجابة المناسبة من الإخوة المختصين ...

بالتوفيق

#3

لفهم خوارزمية DSA لا بد أن تكون ملماً ببعض مفاهيم التوقيع الرقمي.

التوقيع الرقمي هو وسيلة للتحقق من مصدر الرسالة المنقولة عبر وسائط إلكترونية كالبريد الإلكتروني. و بالتالي هو عبارة عن ختم رقمي مشفر يملك مفتاحه صاحب الختم ويعني تطابق المفتاح مع التوقيع الرقمي على الرسالة الإلكترونية أن مرسل الرسالة هو من أرسلها فعلا وليس من قبل شخص آخر , ويضمن التوقيع الرقمي عدم تعرض الرسالة لأي نوع من أنواع التزوير أو التعديل بمحتواها.

لا تؤدي إضافة التوقيع الرقمي للرسالة إلى تشفير الرسالة ذاتها إذ يمكن توقيع رسالة بدون تشفيرها .

وفي التوقيع الرقمي يتم توقيع النص الأصلي بالمفتاح الخاص ويتحقق الطرف الآخر من هوية صاحب النص بمفتاحه العام.

أما بالنسبة لخوارزمية التوقيع الرقمي فقد صممها طاهر الجمل و سكنور للمعهد الوطني للمقاييس و التكنولوجيا (NIST) في الولايات المتحدة الأمريكية وقد أصدرت كمقياس للتوقيع الرقمي (DSS) وذلك عام 1994م. كان الإصدار الأول بمفتاح (512 بت) ونظرا لأهمية طول المفتاح في زيادة الأمان فقد أصدر منها إصدار ثاني بمفتاح (1024 بت), ونلاحظ بان احد عيوب هذا التوقيع إن أطول مفتاح له هو (1024 بت) و إذا كان المفتاح بهذا الطول فانه يجعل البعض يشك في إمكانية كسره.

توجد أيضاً خوارزميات أخرى للتواقيع الاكترونية مثل : RSA, D-H, PKCS

:: المكان المناسب للموضوع هو قسم الرياضيات و الخوارزميات, يُنقل ::

1
#4
أحمد الشنقيطي كتب:

لفهم خوارزمية DSA لا بد أن تكون ملماً ببعض مفاهيم التوقيع الرقمي.

التوقيع الرقمي هو وسيلة للتحقق من مصدر الرسالة المنقولة عبر وسائط إلكترونية كالبريد الإلكتروني. و بالتالي هو عبارة عن ختم رقمي مشفر يملك مفتاحه صاحب الختم ويعني تطابق المفتاح مع التوقيع الرقمي على الرسالة الإلكترونية أن مرسل الرسالة هو من أرسلها فعلا وليس من قبل شخص آخر , ويضمن التوقيع الرقمي عدم تعرض الرسالة لأي نوع من أنواع التزوير أو التعديل بمحتواها.

لا تؤدي إضافة التوقيع الرقمي للرسالة إلى تشفير الرسالة ذاتها إذ يمكن توقيع رسالة بدون تشفيرها .

وفي التوقيع الرقمي يتم توقيع النص الأصلي بالمفتاح الخاص ويتحقق الطرف الآخر من هوية صاحب النص بمفتاحه العام.

أما بالنسبة لخوارزمية التوقيع الرقمي فقد صممها طاهر الجمل و سكنور للمعهد الوطني للمقاييس و التكنولوجيا (NIST) في الولايات المتحدة الأمريكية وقد أصدرت كمقياس للتوقيع الرقمي (DSS) وذلك عام 1994م. كان الإصدار الأول بمفتاح (512 بت) ونظرا لأهمية طول المفتاح في زيادة الأمان فقد أصدر منها إصدار ثاني بمفتاح (1024 بت), ونلاحظ بان احد عيوب هذا التوقيع إن أطول مفتاح له هو (1024 بت) و إذا كان المفتاح بهذا الطول فانه يجعل البعض يشك في إمكانية كسره.

توجد أيضاً خوارزميات أخرى للتواقيع الاكترونية مثل : RSA, D-H, PKCS

:: المكان المناسب للموضوع هو قسم الرياضيات و الخوارزميات, يُنقل ::

جزاكم الله كل خير الاخين مصطفى 36a2 و أحمد الشنقيطي

بتمنا اذا امكن في شي كتب عن التشفير ممكن تفيدوونا فيها واذا بتكون بلغة العربية بيكون افضل

#include "stdio.h"
#include "stdlib.h"
#define kr 1000 
union u{
	unsigned long h2;
	char h3[4];
} uu;
char M[12] = {"Work for PK"};
unsigned long q, b, p, x, y, a;
unsigned long p1, mp[kr];
unsigned long k, r,h1, s, h_1;
unsigned long u1, u2, v, v1;
int i, j, j1;
/////////////////////
int simple(unsigned long m, int k){
	unsigned long n;
	int k1, pr;
	k1 = k;
	k1--; pr = 0;
	while( k1 >= 0){
		n = mp[k1];
		n = m % n;
		if(n == 0){
			pr = 0;
			return pr;
		}
		else
			pr++;
		k1--;
	}
	mp[k] = m;
	return pr;
}
////////////////////////
void m_simple(){
	unsigned long m;
	i = 2;
	j = 3;
	while(j < kr){
		m = mp[j-1];
		m++;
		while(!simple(m,j)){
			m++;
		}
		j++;
	}
}
//////////////////////////////
void p_q_a(){
	unsigned long mn;
	unsigned long k1;
	a = 2;
	do{
		mn = 1; k1 = 1;
		while(k1 != q){
			mn *= a;
			k1++;
		}
		a++;
	}while((mn % p) != 1);
	return;
}
/////////////////////////////
unsigned int hash(char A){
	unsigned int h, g;
	h = g = 0;
	h = (h << 4) + A;
	if( g == (h & 0xF0000000)){
		h = h ^ (g >> 24);
		h = h ^ g;
		h = h % 211;
	}
	return h;
}

////////////////////////////////
void main(){
	int pp1;
	unsigned long p1;
	for(i = 0; i < 12; i++){
		printf("%c ", M);
	}
	printf("\n");
	mp[0] = 2; mp[1] = 3; mp[2] = 5;
	m_simple();
	printf("Vvedite celoe chislo, posle kotorogo mozhno  vzjat prostoe chislo\n");
	scanf("%i", &pp1);
	///////////////////////////
	p1 = pp1;
	i = 0;
	while(mp <= pp1)
		i++;
	q = mp;
	printf("q = %i \n", q);
	j = i + 1;
	while((j <= kr) && ((mp[j] % q) != 1))
		j++;
	if(j <= kr)
		p = mp[j];
	else
		return;
	printf("p = %i \n", p);
	b = p / q;
	printf("b = %i \n", b);
	p_q_a();
	printf("a = %i \n", a);
	x = rand() % q;
	printf("x = %i \n", x);
	y = 1; p1 = 1;
	while(p1 <= x){
		y *= a;
		p1++;
	}
	y = y % p;
	printf("y = %i \n", y);
	h1 = hash(M[0]);
	printf("m = %c h = %i \n", M[0], h1);
	do{
		k = rand() % q;
		r = 1; p1 = 1;
		while(p1 <= k){
			y *= a;
			p1++;
		}
		r = (y % p) % q;
		s = (k * h1 + x * r) % q;
	}while((r == 0) || (s == 0));
	printf("k = %i \n", k);
	printf("<m %c, r %i, s %i> \n", M[0], r, s);
	/////////////////////////////////
	uu.h2 = h1;
	h_1 = hash(uu.h3[0]);
	h_1 = (1 / h_1) % q;
	printf("h_1 %i \n", h_1);
	if((r < 0) || (r >= q)){
		printf("Error r");
		return;
	}
	if((s < 0) || (s >= q)){
		printf("Error s");
		return;
	}
	u1 = (s * h_1) % q;
	u2 = ((-r) * h_1) % q;
	printf("u1 = %i u2 %i \n", u1, u2);
	v = 1; p1 = 1;
	while(p1 <= u1){
		y *= a;
		p1++;
	}
	v1 = 1; p1 = 1;
	while(p1 <= u2){
		v1 *= y;
		p1++;
	}
	v = ((v * v1) % p) % q;
	if(v == r)
		printf("v %i = r %i \n", v, r);
	else
		printf("v %i <> r %i \n", v, r);
	return;
}

اذا امكن شرح البرنامج من الاساتذة الكرام

تم تعديل هذه المشاركة بواسطة ghith-js في 21 سبتمبر 2012 في 10:15

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