You are on page 1of 4

Thuật toán ELGAMAL

------
Là thuật toán mã hoá khoá công khai, ElGamal được đề xuất năm 1985, dựa
vào độ phức tạp của bài toán lôgarit rời rạc.
 Tạo khoá
Chọn số nguyên tố p, phần tử sinh g của Z*p
Chọn ngẫu nhiên x  [1, p-1]; hay 1 ≤ x ≤ p − 2
Tính h = gx mod p
Khóa bí mật là KSA = (p, g, x)
Khóa công khai là KPA = (p, g, h)
Ví dụ:
G =Z*29 , p=29, g=8
x=15
Tính h=gx mod p, h=815 mod 29 = 21
Khoá bí mật: KSA=(29,8,15); Khoá công khai: KPA=(29,8,21)
 Mã hoá (thông điệp m gửi cho A)
Biết khóa công khai là KPA = (p, g, h)
Chọn ngẫu nhiên y  [1, p-1]
Tính khóa chung c1 = gy mod p và s = hy mod p = (gx)y mod p
c2 = m.s
Bản mã: c = (c1, c2) = (gy, ms)
Gửi ciphertext c = (c1,c2) to A.
Ví dụ:
KPA=(29,8,21), m=10
y=7, s = 217 mod 29 = 12
c1=gy = 87 mod 29 = 17
c2=m.s = 10.12 mod 29 = 4
c=(c1,c2) = (17,4)
 Giải mã (giải mã bởi A)
- Bản mã c = (c1, c2)
- Dùng khóa bí mật là KSA = (p, g, x)
- Tính khóa chung s = c1x
- Bản rõ: m = c2s-1
Ví dụ:
c = (17,4)
KSA = (29,8,15)
s=c1x= 1715 mod 29 = 12
s-1 = 12-1 mod 29 = 17
m=c2s-1 = 4.17 mod 29 = 10

Hệ mã hóa ELGAMAL
* Thuật toán sinh khóa:
+ Sinh ngẫu nhiên số nguyên tố lớn p và α là phần tử sinh của Z*p.
+ Chọn ngẫu nhiên số nguyên a, 1 ≤ a ≤ p-2, tính h = αa mod p.
+ Khóa công khai là (p, α, αa ). Khóa bí mật là (a).
* Thuật toán mã hóa:
(i) Lập mã:
+ Lấy khóa công khai (p, α, αa ) theo thuật toán trên.
+ Chọn một bản rõ x, trong khoảng [0, p-1].
+ Chọn ngẫu nhiên số nguyên k, 1 ≤ k ≤ p-2.
+ Tính γ = αk mod p và δ = x.(h)k mod p.
+ Nhận được bản mã là (γ, δ).
(ii) Giải mã:
+ Sử dụng khóa bí mật (a) và tính γp-1-a mod p. (note: γp−1−a = γ−a = α−ak)
+ Lấy bản rõ: x = δ.(γa )-1 mod p.
γ-a · δ ≡ α-ak x αak ≡ m (mod p)
Ví dụ:
Chọn số nguyên tố p = 2579 và một phần tử sinh α = 2 của tâp Z*2579.
Chọn khóa bí mật a = 765 và tính αa mod p = 2765 mod 2579 = 949.
Khóa công khai (p = 2579, α = 2, αa = 949).
(i) Lập mã: Mã hóa bản rõ x = 1299, chọn số nguyên k = 853.
γ = 2853 mod 2579 = 435.
δ = 1299 * 949853 mod 2579 = 2396.
Bản mã là: (435, 2396).
(ii) Giải mã: tinh s = γk = 435765 mod 2579 = 2424
x = (453-765) * 2396 mod 2579 = 1299.
x = 2396 * (435765)-1 mod 2579
= 2396*(2424)-1 mod 2579
= 2396*1980 mod 2579 =1299
LƯỢC ĐỒ KÝ SỐ ELGAMAN
1. Tạo khoá
Chọn số nguyên tố p, phần tử sinh g của Z*p
Chọn ngẫu nhiên x  [1, p-1]
Tính h = gx mod p
Khóa bí mật là KSA = (p, g, x)
Khóa công khai là KPA = (p, g, h)
Ví dụ:
G*29 q=28, g=8
Chọn x=15
Tính h=gx mod p = 815 mod 29 = 21
KSA = (29,8,15); KPA = (29,8,21)
2. Ký số (bởi Alice)
Thông điệp m, sử dụng KSA = (p, g, x)
1. Sinh ngẫu nhiên: 1<k <p-1; gcd(k,p-1)=1
2. Tính r=gk (mod p)
3. Tính s = (m-xr)k-1 (mod p-1)
4. Nếu s=0 thì trở lại bước 1
5. Chữ kí số lên thông điệp m là (r,s)
Ví dụ:
Cho m=10; KSA = (29,8,15)
k=11;
tính r= gk mod p = 811 mod 29 = 3
s = (m-xr)k-1 (mod p-1)
= (10-15.3).11-1 mod 28
= (10-15*3)*23 mod 28 = 7
sign(10) = (3,7)
3. Kiểm tra chữ ký (bất kỳ ai)
Thông điệp m, sử dụng KPA = (p, g, h)
1. Kiểm tra: 0< r <p; 0< s <p-1
2. Kiểm tra: gm = hrrs (mod p)
Cơ chế:
s = (m-xr)k-1 (mod p-1)
=> m = xr + sk (mod p-1)
=> gm = gxr+sk = gxrgsk = hrrs mod p
Ví dụ:
m=10; sign(3,7); KPA = (29,8, 21)
hr*rs mod p = 213 * 37 mod 29 = 4
gm = 810 mod 29 = 4

You might also like