3. 7 Sơ đồ chữ ký Fail-Stop
THỬ NGHIỆM KÝ ĐIỆN TỬ BẰNG CHƢƠNG TRÌNH 4 1 Chƣơng trình mã hố RSA
4. 1. Chƣơng trình mã hố RSA
Chương trình có menu chính như sau:
1. Vào bản rõ 2. Xem bản rõ 3. Xem bản số hoá 4. Xem bản mã 5. Giải mã văn bản 6. Về bản rõ 7. Thoát
Bản rõ chuyển số hoá mã hoá giải mã.
Các văn bản sẽ lần lượt được sinh ra như sau:
“Banro” “sohoa” ”vbma” “vbgiai” “vesohoa” “vebanro”
Sơ đồ thực hiện theo các bước:
1. Đầu tiên G chuyển "banro" (là văn bản cần ký) thành bản "sohoa" chính là viết lại văn bản theo quy ước lại bảng ký tự.
2. Dùng hàm lập mã để mã hoá trên văn bản "sohoa" được bản "vbma". 3. G gửi "vbma" cùng khoá cho N.
4. N dùng hàm giải mã với khoá đã biết để giải mã "vbma" được
"vesohoa", văn bản này trùng với văn bản "sohoa".
5. Cuối cùng dùng ngược lại quy ước bảng ký tự để được "banro" ban đầu.
Đầu vào của sơ đồ là một văn bản. Trong văn bản sử dụng bộ chữ cái tiếng Anh gồm 52 ký tự hoa (từ A đến Z) và thường (từ a đến z), 9 chữ số (từ 0 đến 9), các dấu cách („ ‟), dấu xuống dòng, một số dấu câu(, . : ? !), tất cả là 70 ký tự. Ta gọi đây là q trình chuyển số hố. Thực ra đây cũng chính là
một phương pháp mã hố cổ điển.
Quy ước: ký tự mã chuyển ký tự mã chuyển ký tự mã chuyển A 00 A 26 0 52 B 01 B 27 1 53 .. . .. . .. . Z 25 Z 51 9 61 „ ‟ 62 „\n‟ 63 , 64
. 65 ? 66 : 67
! 68
Tiếp theo, G mã hoá trên văn bản vừa tạo ra. Văn bản có thể dài ngắn tuỳ ý do đó G sẽ “chia” văn bản ra để mã hố. Trong ví dụ G mã hố trên từng cặp 2 ký tự. Sử dụng thuật toán mã hoá RSA như ở trên.
Chọn các số nguyên tố p và q bằng cách sử dụng hàm ramdom() và sau đó sử dụng thuật tốn Solovay – Strassen để thử tính ngun tố.
Chương trình được viết như sau:
// Hàm trả lại 1 nếu n là số nguyên tố
// Trả lại 0 trong trường hợp ngược lại. int isprime(unsigned long n){
unsigned long ret1, ret2, a; ramdomize();
a = ramdom(n); ret1 = legendre(a, n);
ret2 = xpmodn(a, (n-1)/2, n); if(ret1 = = ret2) return 1; return 0;
}
Trong đó các hàm legendre và xpmodn được khai báo và sử dụng như sau:
1. Hàm legendre:
Khai báo: unsigned long legendre(unsigned long a, unsigned long b): Sử dụng: Tính legendre của (an).
1. Hàm xpmodn: Khai báo:
unsigned long xpmodn(unsigned long x,unsigned long p,unsigned long n);
Sử dụng: Là hàm trả lại giá trị xp
mod n.
Như vậy p và q được chọn "ngẫu nhiên". Thực ra là giả ngẫu nhiên (do tính chất của hàm random()).
Chẳng hạn chọn p = 83, q = 89 (n) = 11*41*8 = 7216, n = 7387. Chọn b sao cho ƯCLN(b, (n) = 1)
ta chọn b không chia hết cho 11, 41 và 2 Chọn b = 9*17 = 153 a = b-1
Hàm nghịch đảo được tính như sau:
unsigned long nghichdao(unsigned long a, unsigned long n) {
unsigned long i;
for(i = 2;i<sqrt(n); i++)
if(ptdongdu(i, n) = = 1) return 1; return 0;
}
Hàm này trả lại b *
n
Z thoả mãn a*b 1 (mod n) nếu tồn tại, trường hợp ngược lại trả lại 0.
Ví dụ văn bản cần gửi có nội dung:
"HOM NAY NGAY 19 THANG 5 toi chuan bi bao cao khoa hoc. " toi chuan bi bao cao khoa hoc. "
Đầu tiên G tạo bản số hoá như sau (dựa vào bảng quy ước trên):
"071412621300246213060024625361621907001306625763
45403462283346263962273462272640622826402662334028656362" "
Nếu G mã hoá từng cặp 2 ký tự một, anh chia x1 = 0714, x2 = 1262, x3 = 1300, .. . , x16 = 6362
Sau đó G mã yi = xib mod n = xi153 mod 7387. Được "banma" như sau:
"511825311718719621871341633316746348278903722051
2315090033563515525808332533710720027107020230684995316873664345" 73664345"
Sau đó G gửi đến N. Khi nhận được bản mã, đầu tiên N giải mã "banma" để được bản "vesohoa". Nếu dùng đúng hàm giải mã, văn bản này
trùng với bản "sohoa". Từ bản "vesohoa" phải qua một lần chuyển ngược lại q trình số hố mới về bản gốc. Như vậy văn bản được mã hai lần chứ không phải một lần, bằng cách sử dụng các cách chuyển số hoá khác nhau (quy ước mã khác nhau). Điều này làm tăng tính bảo mật của sơ đồ.