Em có 1 thuật toán này mong các bác giúp đỡ
- Nhập số thành viên của nhóm n
- Hình thành các số nguyên tố lớn p và q , sao cho (p – 1) có thừa số là q, tức là: p = N.q + 1, ở đây N – số nguyên.
-Phát sinh: g=α^N,α được chọn ngẫu nhiên
- Mỗi thành viên chọn ngẫu nhiên số nguyên x[i] làm khóa bí mật và tính khóa công khai tương ứng:
y[i]= g^x[i] mod p
- Tính Khóa công khai chung của nhóm:
Y= ∏y[i] mod p (tích từ 1 đến n)
- Mỗi thành viên chọn ngẫu nhiên số nguyên k[i] và tính thành phần thứ nhất của chữ ký cá nhân theo công thức:
r[i]= g^k[i] mod p
- Người đại diện tính: R= ∏r[i] mod p (tích từ 1 đến n)
rồi tính thành phần thứ nhất của đa chữ ký: E= R*m mod q
ở đây : m=h(m) là bản tóm lược của văn bản M, với h là hàm băm được chọn đủ an toàn, chẳng hạn: SHA-1, MD5.
Sau đó người đại diện gửi giá trị E cho các thành viên trong nhóm
- Các thành viên trong nhóm tính phần thứ hai của chữ ký cá nhân theo công thức:
s[i]= (k[i] + x[i]*E) mod q
rồi gửi lại cho người đại diện nhóm. Cặp giá trị (r[i],s[i]) là chữ ký cá nhân của thành viên thứ i vào văn bản M.
- Sau khi nhận được tất cả các chữ ký cá nhân , người đại diện cho nhóm kiểm tra sự hợp lệ của các chữ ký này nhờ công thức:
r[i]'= y[i]^E * g^s[i] mod p
- Nếu: r[i] = r[i]' , người đại diện cho nhóm sẽ tính thành phần thứ hai của đa chữ ký theo công thức:
S = ∑ s[i] mod q (tổng 1 đến n)
Cặp giá trị (E,S) là đa chữ ký của nhóm ký trên văn bản M.

Đây là code của em
C Code:
  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include<math.h>
  4. #include<stdlib.h>
  5. #include<string.h>
  6. //==================
  7. int ktra_ngto(long pq);
  8. long  USCLN(long  n,long m);
  9. long Ktra_ngto_cungnhau(long b,long phi_N);
  10. long int p,q,z,m,g,alpha,x[10],y[10],k[10],r[10],s[10],r2[10],e,yb=1,rb=1,sb=1;
  11. //===================================================
  12.  
  13. int ktra_ngto(long pq)
  14. {
  15.    for(long i=2;i<=(long)sqrt(pq);i++)
  16.     if(pq%i==0)
  17.        {
  18.        printf("\n\n Khong phai so nguyen to!\n\nMoi ban nhap lai!");
  19.        return 0;
  20.        }
  21.      return 1;
  22. }
  23. //===================================================
  24.  
  25. long  USCLN(long  n,long m)
  26. {
  27.     while(m!=0&&n!=0)
  28.       if(n>m) n=n-m;
  29.       else m=m-n;
  30.       if(n==0) return m;
  31.       else return n;
  32. }
  33. //=========== Tinh Mod ============
  34. long exp_mod(long x, long b, long n)
  35. {
  36.  long a = 1l, s = x;
  37.    while (b != 0) {
  38.     if (b & 1l) a = (a * s) % n;
  39.     b >>= 1;
  40.     if (b != 0) s = (s * s) % n;
  41.     }
  42.     if (a < 0) a += n;
  43.     return a;
  44. }
  45. //================================
  46. long sosanh(long o, long q)
  47. {
  48.     if(o>q)
  49.     {
  50.        printf("hay nhap so <q.\nMoi ban nhap lai!");
  51.        return 0;
  52.     }
  53.     return 1;
  54. }
  55. //===================================================
  56. void main()
  57. {
  58.     clrscr();
  59.     int i,n;
  60.     printf("nhap so thanh vien nhom n:");
  61.         scanf("%ld",&n);
  62.     printf("Nhap alpha:");
  63.         scanf("%ld",&alpha);
  64.     p:printf("nhap so nguyen to lon p:");
  65.         scanf("%ld",&p);  
  66.         if(ktra_ngto(p)!=1)goto p;
  67.     q:printf("\n nhap so q tu cac so duoi day:\n", p);//dieu kien q la uoc cua p-1
  68.         timuoc(p);
  69.         scanf("%ld",&q);
  70.         if(ktra_ngto(q)!=1)goto q;
  71.     z=(p-1)/q;
  72.     g=exp_mod(alpha,z,p);
  73.     printf("\n moi thanh vien chon ngau nhien mot so nguyen x[i]\n");
  74.     for(i=0; i<n; i++)
  75.     {
  76.         printf("x[%d]=",i+1);
  77.         scanf("%ld",&x[i]);
  78.     }
  79.     for(i=0; i<n; i++)
  80.     {
  81.         y[i]=exp_mod(g,x[i],p);
  82.     }
  83.     for(i=0;i<n;i++)
  84.     {
  85.         yb*=y[i]%p;
  86.     }
  87.     printf("\n moi thanh vien chon ngau nhien mot so nguyen ki\n");
  88.     for(i=0; i<n; i++)
  89.     {
  90.         printf("k[%d]=",i+1);
  91.         scanf("%ld",&k[i]);
  92.     }
  93.     for(i=0; i<n; i++)
  94.     {
  95.         r[i]=exp_mod(g,k[i],p);
  96.     }
  97.     for(i=0;i<n;i++)
  98.     {
  99.         rb*=r[i]%p;
  100.     }
  101.     printf("nhap ma van ban m:");
  102.     scanf("%ld",&m);
  103.     e=(rb*m)%q;
  104.     for(i=0;i<n;i++)
  105.     {
  106.         s[i]=(k[i]+x[i]*e)%q;
  107.     }
  108.     for(i=0;i<n;i++)
  109.     {
  110.         r2[i]=(exp_mod(y[i],e,p)*exp_mod(g,s[i],p))%p;
  111.     }
  112.     for(i=0;i<n;i++)
  113.     {
  114.       if (r2[i]=r[i])
  115.       {
  116.           for(i=0;i<n;i++)
  117.           {
  118.             sb+=s[i]%q;
  119.           }
  120.       }
  121.     }
  122.     getch();
  123. }