Như vậy, để tìm các số đối của các số nguyên ở cột bên trái bảng cộng bằng cách quét lần lượt các phần từ trong dòng để tìm phần tử 0 và khi đó phần tử ở dòng đầu tiên ứng với cột này là
Một số thuật toán trên Zn
1.2.1 Tìm s ngh ch đ o ố ị ả Định nghĩa: Phần tử nghịch đảo
+ Cho a e Zn + Phần tử nghịch đảo (ngược theo phép nhân) của a mod n là một số nguyên xe Z, sao cho: ax = 1 mod n)
+ Nếu x tồn tại thì nó là duy nhất, a được gọi là khả nghịch Phần tử nghịch đảo của a được ký hiệu là a-.
Thuật toán (Tính các nghịch đảo trong Z ): n
RA: a mod n (nếu tồn tại) -1
(1) Dùng thuật toán Euclide mở rộng để tìm các số nguyên x và y sao cho ax + ny = d trong đó d = (a, n).
(2) Nếu d > 1 thì a mod n không tồn tại Ngược lại return(x) -1
Bảng 1.4 Minh họa cho ví dụ tính phần tử nghịch đảo
Tính giá trị biểu thức z = A mod n k
₋ Thuật toán “bình phương và nhân”
₋ Biểu diễn k dạng nhị phân bibi - 1bi - 2…b b1 0, bi ∈ {0, 1}
Hình 1.2 Các bước của thuật toán bình phương và nhân
Ví dụ: Bảng sau chỉ ra các bước tính toán a mod n, với a = 7, k = 560 = k
Bảng 1.5 Các bước tính của thuật toán bình phương và nhân
Giá trị f cuối cùng = 1, là đáp số cần tìm
Như chúng ta đã biết số nguyên tố là các số nguyên dương chỉ có ước số là 1 và chính nó Chúng không thể được viết dưới dạng tích của các số khác I là số nguyên tố, nhưng không quan tâm đến nó Xét các số nhỏ hơn 10 ta có:
2, 3, 5, 7 là số nguyên tố, vì chúng không có ước số khác 1 và chính nó; 4, 6,
8, 9, 10 không phải là số nguyên tổ Có thể nói 2 là số chẵn duy nhất là số nguyên tố Các số nguyên tố là trung tâm của lý thuyết số Số các số nguyên tố là vô hạn.
Ví dụ Sau đây là danh sách các số nguyên tố nhỏ hơn 200:
● Phân tích thừa số nguyên tố
₋ Một trong những bài toán cơ bản của số học là phân tích ra thừa số nguyên tố số a, tức là viết nó dưới dạng tích của các số nguyên tố Lưu ý rằng phân tích là bài toán khó hơn rất nhiều so với bài toán nhân các số để nhận được tích.
₋ Ta có kết luận, mọi số nguyên dương đều có phân tích duy nhất thành tích các lũy thừa của các số nguyên tố;
₋ Thông thường để tìm phân tích trên, ta phải kiểm tra tính chia hết cho các số nguyên tố từ nhỏ đến lớn và thực hiện phép chia liên tiếp cho các số nguyên tố, rồi gộp thành lũy thừa của các số nguyên tố
● Số nguyên tố cùng nhau và GCD
₋ Hai số nguyên dương a và b không có ước chung nào ngoài 1, được gọi là nguyên tố cùng nhau.
₋ Ví dụ: 8 và 15 là nguyên tố cùng nhau, vì ước của 8 là 1, 2, 4, 8, còn ước của 15 là I, 3, 5, 15 Chỉ có 1 là ước chung của 8 và 15.
₋ Ngược lại có thể xác định ước chung lớn nhất bằng cách trong các phân tích ra thừa số của chúng, tìm các thừa số nguyên tố chung và lấy bậc lũy thừa nhỏ nhất trong hai phân tích của hai số đó.
Ví dụ Ta có phân tích: 300 = 21 * 31 * 52 và 18 = 21 * 32
● Định lý Fermat (định lý Fermat nhỏ) a p - 1 mod p = 1 trong đó: p là số nguyên tố, a là số nguyên bất kỳ khác bội của p; GCD(a, p) = 1
₋ Hay với mọi số nguyên tốp và số nguyễn a không là bội của p, ta luôn có: a p = a mod p
₋ Công thức trên luôn đúng, nếu p là số nguyên tố, còn a là số nguyên dương nhỏ hơn
Ví dụ Vi 5 và 7 là các số nguyên tố 2 và 3 không là bội tương ứng của 7 và 5, nên theo định lý Fermat ta có:
₋ Kết quả trên được dùng trong khoa công khai Nó cũng được sử dụng để kiểm tra tính nguyên tố của một số nguyên p nào đó, bằng cách lấy ngẫu nhiên các số a và kiểm tra xem có tính chất nêu trên không, kết luận là p nguyên tố cảng thuyết phục nếu phép thử trên dùng với nhiều lần chọn ngẫu nhiên các số a
₋ Cho n là một số nguyên dương Khi thực hiện phép tính đồng dư n của mọi số nguyên khác ta nhận được tập đầy đủ các phần dư có thể có là: 0, 1, 2…, n - 1
₋ Từ tập trên ta tìm tập rút gọn bao gồm các số nguyên tố cùng nhau với n và quan tâm đến số lượng các phần tử như vậy đối với số nguyên dương n cho trước.
+ Tập đầy đủ các phần dư là {0,1,2,3,4,5,6,7,8,9}
+ Tập rút gọn các phần dư nguyên tố với 10 là {1,3,7,9}
+ Số các phần tử của tập rút gọn trên là giá trị của hàm Euler (n) Vậy φ φ (10) = 4
₋ Muốn tính (n), việc đếm số các số nguyên tố cùng nhau với n và nhỏ hơnφ n được loại bỏ vì đây là bài toán tổn nhiều công sức.
₋ Nói chung có thể tính hàm Euler của một số dựa trên biểu thức phân tích ra thừa số của số đó
+ Dễ dàng thấy, nếu p là số nguyên tố: (p) = p - 1φ
+ Nếu p và q là hai số nguyên tố khác nhau, thì có thể chứng minh: (p.q)φ
+ Nếu p là số nguyên tố, thì: (p ) = p - pφ n n n - 1
+ Nếu s và t là hai số nguyên tố cùng nhau, thì (s.t) = (s) (t) φ φ φ
₋ Định lý Euler là tổng quát hóa của định lý Fermat: a 𝛟 (n) mod n = 1 với mọi cặp số nguyên dương nguyên tố cùng nhau a và n; gcd(a, n) = 1
● Kiểm tra tính nguyên tố
Trong một số thuật toán mã hóa ta cần chọn một hoặc một số nguyên tố rất lớn một cách ngẫu nhiên Như vậy, ta cần phải giải quyết bài toán xác định liệu xem một số lớn có phải là số nguyên tố hay không Như vậy, việc áp dụng thuật toán kiểm tra một số nhỏ là nguyên tố hay không để kiểm tra một số rất lớn là không phù hợp
Để kiểm tra một số lớn có phải là nguyên tố hay không ta dựa vào hai tính chất của số nguyên tố: oTính chất thứ nhất: Nếu p là số nguyên tố và a là số nguyên dương nhỏ hơn p thì: a mod p = 1 khi và chỉ khi a mod p = 1 hoặc a mod p = -1 mod 2 p = p–1 Theo quy tắc của module số học (a mod p)(a mod p) = a mod p 2
+ Nếu a mod p = 1 hoặc a mod p = -1 thì a mod p = 1 2
+ Ngược lại: Nếu a mod p = 1 thì (a mod p) = 1 Nó chỉ đúng với a 2 2 mod p = 1 hoặc a mod p = -1 oTính chất thứ hai: Cho p là số nguyên tố lớn hơn 2 Sau đó ta có thể viết p
– 1 = 2 k q với k > 0 và q là số lẻ Cho a là số nguyên bất kỳ trong dãy (1 < a < p–1) thì một trong hai điều kiện sau là đúng:
1 a là phù hợp với 1 modulo p đó là a mod p =1 hoặc a ≡ 1(mod p) q q q
2 Một trong những số a , a , a , a q 2q 4q 2(k-1)q thích hợp với -1 mod p, tức là có 1 số j trong dải (1 ≤ j ≤ k) Như vậy a 2(j-1)q mod p = - 1 mod p = p - 1. Tương đương với a 2(j-1)q ≡ -1(mod p)
Thuật toán Miller-Rabin thường được sử dụng để kiểm tra một số lớn là số nguyên tố Trước khi giải thích thuật toán, ta cần một số kiến thức căn bản Bất kì một số dương lẻ nào n ≥ 3 có thể được biểu diễn như sau: n – 1 = 2k q với k > 0, q là số lẻ.
Để thấy điều này, lưu ý rằng (n – 1) là 1 số nguyên Sau đó chia (n– 1) cho 2 đến khi kết quả là số lẻ q, với tổng số lần chia là k Nếu n được biểu diễn dưới dạng nhị phân số, thì kết quả đạt được bằng cách dịch chuyển số sang bên phải cho đến khi số bên phải là số 1, với tổng số k lần dịch chuyển.
Chi tiết về thuật toán: Nếu n là số nguyên tố thì phần tử đầu tiên trong danh sách dư lượng hoặc phần dư, modulo n bằng một hoặc một số phần tử trong danh sách bằng (n–1), nếu không n là hỗn hợp (như là, không phải là số nguyên tố) Mặt khác, nếu điều kiện được đáp ứng, điều đó không nhất thiết có nghĩa là n là số nguyên tố.
+ Ta tính 21023 mod 2047 = 1, lên 2047 thỏa mãn điều kiện nhưng phải là số nguyên tố.
+ Ta có thể sử dụng thuộc tính trước để tạo ra một phép thử cho tính nguyên tố Cách thức kiểm tra: Lấy 1 số nguyên tố n là đầu vào và trả kết quả “hỗn hợp” nếu n chắc chắn không phải số nguyên tố và kết quả trả về là “chưa đi đến kết quả” nếu n có thể hoặc không thể là 1 số nguyên tố.
+ Các bước để kiểm tra như sau:
1 Tìm số nguyên k, q với k > 0, q là số lẻ Sao cho (n – 1) = 2 k
2 Lựa chọn 1 số nguyên ngẫu nhiên a: 1< a < n - 1
3 Nếu a mod n thì trả về kết quả là “chưa đi đến kết quả” q
- Nếu a (2^j)q mod n = n – 1 thì trả về “chưa đi đến kết quả”.
- Ngược lại trả về “hỗn hợp”.
Hình 1.3 Các bước của thuật toán Miller-Rabin
+ Ta tính 10 mod 29 = 17 (a mod n): Kết quả này không phải 1 hay 28 7 q + Vậy nên ta tiếp tục kiểm tra.
+ Tính toán tiếp theo ta thấy (10 mod 29 = 28 và kiểm tra trả về là “chưa 7 ) 2 đi đến kết quả” Tức là 29 có thể là số nguyên tố.
+ Ta thử với a = 2 (a mod n) = 2 mod 29 = 12; [(a mod n] = 2 mod 29 q 7 q ) 2 14
= 28 Lần này vẫn trả về là chưa đi đến kết quả.
NỘI DUNG THUẬT TOÁN
Hướng phát triển
Thuật toán mã hóa ElGamal có thể ứng dụng để phát triển trong các ứng dụng nhắn tin, hoặc tạo chữ ký số nhằm tăng cường khả năng bảo mật, ngăn chặn rò rỉ thông tin và xác định trách nhiệm của người dùng.
THIẾT KẾ XÂY DỰNG CHƯƠNG TRÌNH ỨNG DỤNG
3.1 Thiết kế giao diện và mô tả kịch bản
Hình 3.1 Giao diện chương trình mã hóa và giải mã Elgammal
Bước 1: Bấm nút ‘Sinh khóa tự động’, chương trình sẽ tạo ra ngẫu nhiên khóa công khai và khóa bí mật cho người dùng.
Hình 3.2 Minh họa quá trình sinh khóa
Bước 1: Trong phần ‘Mã hóa, người dùng nhập bản rõ muốn mã hóa vào ô
‘Bản rõ’, sau đó nhấn nút ‘ Mã hóa ‘ , hệ thống sẽ mã hóa và hiển thị kết quả trong ô ‘Bản mã’.
Hình 3.3 Minh họa quá trình mã hóa
Bước 2: Người dùng nhấn nút ‘Chuyển’ để chuyển bản mã sang ô ‘Bản mã’ trong phần ‘Giải mã’.
Hình 3.4 Minh họa quá trình chuyển bản mã sang bản rõ
Bước 1 : Người dùng nhấn nút ‘Giải mã’ để giải mã Bản rõ sẽ được hệ thống hiển thị trong ô ‘Bản rõ’ của phần ‘Giải mã’.
Hình 3.5 Minh họa quá trình giải mã
Bước 2: Người dùng nhấn nút ‘Lưu file’, hệ thống hiển thị cửa sổ lưu file, người dùng nhập tên file và dạng file là txt hoặc docx theo ý muốn rồi nhấn
‘Save’ Hệ thống hiển thị thông báo lưu thành công
Hình 3.6 Minh họa quá trình lưu file
Trường hợp khác: Nếu người dùng có sẵn file bản rõ hoặc bản mã
Bước 1: Người dùng nhấn nút ‘Chọn file’ Hệ thống hiển thị cửa sổ chọn file
Hình 3.7 Minh họa quá trình mở file
Người dùng nhấn vào file muốn mở rồi nhấn nút ‘Open’ Hệ thống sẽ hiển thị nội dung file đã chọn vào ô ‘Bản mã’ hoặc ‘Bản rõ’ tùy theo vị trí nút ‘Chọn file’ Sau đó người dùng có thể chọn mã hóa hoặc giải mã theo ý muốn sử dụng
Hình 3.8 Minh họa quá trình mã hóa và giải mã sau khi mở file
3.2.1 Đặc tả code JavaScript (Nguyễn Thái Dương)
3.2.1.1 LÝ THUYẾT a, Tìm ước chung lớn nhất
- Đặc tả : Hàm tìm ước chung lớn nhất được truyền vào 2 tham số a và b để tìm ước chung lớn nhất của chúng bằng giải thuật đệ quy.
Bước 1: Kiểm tra điều kiện của tham số b, nếu b = 0 thì ước chung lớn nhất của a và b là a vì a chia hết cho chính nó và b cũng chia được cho a Nếu b khác 0 chuyển sang bước 2.
Bước 2: Nếu b khác 0, hàm sẽ gọi lại chính nó với hai tham số mới: b và a % b (phần dư của phép chia a cho b) Hàm sẽ gọi lại chính nó đến khi b = 0 và tìm được ước chung lớn nhất của 2 số. b, Thuật toán bình phương và nhân
- Đặc tả: Thuật toán bình phương và nhân tìm kết quả phép tính α mod p a
Bước 1: Tạo hàm chuyển đổi số hệ thập phân sang nhị phân để chuyển số a từ hệ thập phân sang nhị phân Truyền tham số decimal vào hàm,nếu số đó bằng 0 thì ở hệ nhị phân cũng bằng 0
Bước 2: Tiếp theo ta khai báo chuỗi rỗng binary và sự dụng vòng lặp while, nếu decimal > 0, cộng dồn chuỗi binary ban đầu với phần dư của decimal khi chia cho 2 để được bit 0 hoặc 1 Sau đó làm tròn decimal sau khi chia cho 2 vì sau khi chia có thể nó là số lẻ Vòng lặp sẽ kết thúc đến khi decimal 1 ta vào vòng lặp while.
Bước 3: Tạo biến q là kết quả của phép chia a / b, r2 là kết quả của phép chia lấy dư a % b Khi này ta tính được ti = t0 – q * t1 và gán lại các giá trị t0 = t1 ; t1 = ti ; a = b ; b = r2 Vòng lặp sẽ kết thúc khi b