Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 10

SINH KHÓA CHO MÃ HÓA CÔNG KHAI ELGAMAL

Nhóm gồm có : Nguyễn Chí Nguyên


:Nguyễn Hữu Mạnh
Bài toán elgamal

• Hệ mật mã elgamal được xây dựng dựa trên bài toán logarit rời
rạc
• Định nghĩa : Cho một số nguyên tố p và một phần tử sinh α của
tập Z*p , một phần tử β thuộc Z
• Bàitoán đặt ra : tìm một số nguyên x, 0 <= x <=(p-2) sao cho αx =
β (mod p)
XÁC ĐỊNH BÀI TOÁN

• Input:
số nguyên tố p, 2 số nguyên tố nhỏ hơn p là α (phần tử
nguyên thủy của Z*p ) và a (khóa bí mật của người nhận)
• Output: β là khóa công khai
Thuật toán

• B1:Sinh ngẫu nhiên một số nguyên tố lớn p và α là phần tử sinh


của Z*p .
• B2: Chọn ngẫu nhiên một số nguyên a trong khoảng từ 1 ≤ a ≤ p-2
• B3: Tính khóa công khai β = αa mod p.
• B4: Khóa công khai là (p, α, β) và khóa bí mật là (a).
Các hàm trong chương trình

• int PhanTuSinh(int dem, int mangnguyento[Max], int khoa_1, int


k);
• int
SinhKhoa(int khoa_1, int key, int pt_sinh, unsigned long int
khoa_3);
• int random(int minN, int maxN);
• bool KTsnt(int n);
• voidmangsonguyento(int dem, int khoa_2[Max],int
soluongmang,int mangnguyento[Max] ,int khoa_1);
int random(int minN, int maxN);

• Input:
số min và số max (khoảng cách để chọn ngẫu nhiên trong
khoảng từ min đến max)
• Output: số ngẫu nhiên được chọn trong khoảng min đến max
bool KTsnt(int n);

• Input: một số n bất kỳ


• Output:đưa ra kết quả true nếu n là số nguyên tố, ngược lại không
phải số nguyên tố thì false
• Thuật toán: khởi tạo biến count = 0
: nếu n = 1 thì return false;
: Cho for có i=2 chạy trong khoảng từ i <= √n
: Nếu n % I ==0 thì tăng count++
: Nếu count == 0 thì true, còn ngược lại thì false
void mangsonguyento(int dem, int mang[Max],
mangnguyento[Max] ,int khoa_1);

• Input: Cho một mảng là mang , số nguyên tố khoa_1


• Output:Một mảng chứa số nguyên tố từ 2 đến khoa_1 và biến
dem là số lượng số nguyên tố trong mảng đó
• Thuật toán: khởi tạo mảng là mang và gán mỗi giá trị trong mang
đó từ 1 đến khoa_1
:Dùng for để kiểm tra xem những số nào trong mang[]
là số nguyên tố , nếu đúng thì gán số nguyên tố đó vào
mangnguyento[] và tang biến đếm
: Còn sai thì thôi
int PhanTuSinh(int dem, int mangnguyento[Max], int
khoa_1,int k);
• Input:
Biến dem chứa số lượng nguyên tố, mangnguyento[] chứa các số
nguyên tố trong khoảng từ 2 đến khoa_1, số nguyên tố khoa_1
• Output: đưa ra k là phần tử sinh
• Thuậttoán: khởi tạo biến count = 0 và mảng dem1 để chứa các lớp
đồng dư của mỗi số nguyên tố
: dùng for để kiểm tra xem mỗi số nguyên tố có lớp đồng dư
không, nếu có thì tăng biến count++ của từng số nguyên tố
: Xem số count của số nguyên tố nào nhiều hơn thì đó là phần
tử sinh k
int SinhKhoa(int khoa_1, int key, int pt_sinh, unsigned
long int khoa_3);
• Input: số nguyên tố khoa_1 và 2 số nguyên key và pt_sinh
• Output: khóa công khai khoa_3
• Thuật toán: Tính khoa_3 = pt_sinh key mod khoa_1 rồi return
khoa_3 ra

You might also like