Chương 3: Các Tiêu Chuẩn 3.1 Tiêu chuẩn mật mã khĩa cơng khai :
1.1. Giới thiệu:A B
5. Đoạn tin dự kiến cho A.
6. Tính tường minh và nguồn gốc của sự hồi âm.
Chứng thực hai phía cho phép cả hai đối tác truyền thơng làm rỏ định danh lẫn nhau. - Chứng thực ba phía (three-way): (h.c)
Tương tự như chứng thực hai phía nhưng cĩ thêm sự đáp lại rB từ A tới B. Với kiểu thiết kế này thì timestamp khơng cần thiết phải được kiểm tra bởi vì mỗi nonce đều được quay lại phía gởi, nên mỗi phía cĩ thể kiểm tra nonce quay về để dị các cuộc tấn cơng lặp lại. Cách tiếp cận này thì cần thiết khi đồng hồ đồng bộ khơng cĩ sẵn.
(h.a)
Chương 4: Thuyết minh chương trình
1.1. Giới thiệu:A B A B 1. A |tA, rA, B, sgnData, EKUb|Kab|| A B 1. A |tA, rA, B, sgnData, EKUb|Kab|| 2. B |tB, rB, A, sgnData, EKUa|Kba||
- Như đã trình bày trong phần lý thuyết, chúng ta cĩ thể rút ra một số kết luận trong vấn đề bảo mật dữ liệu như sau:
+ Khi mã hĩa:
. Dùng khĩa DES (KS) để mã hĩa data (M): EKs (M).
. Dùng khĩa cơng khai RSA (KU) để mã hĩa khĩa DES: EKU (KS). + Khi giải mã:
. Dùng khĩa bí mật RSA (KR) để giải mã khĩa DES: DKR (EKU (KS)) = KS. . Dùng khĩa DES (KS) để giải mã data (M): DKs (EKs (M)) = M.
Vấn đề quan trọng là phải đảm bảo tính xác thực của cặp khĩa RSA (đặc biệt là khĩa cơng khai) nghĩa là khi người gởi sử dụng khĩa cơng khai KU của một người nào đĩ thì phải đảm bảo khĩa cơng khai đĩ là của chính người đĩ chứ khơng phải của một người nào khác (người muốn giả dạng). Chương trình này cũng khơng ngồi mục đích đĩ, xây dựng server tạo khĩa cho user, thơng qua web server user cĩ thể xem khĩa cơng khai của các user khác thơng qua thư mục khĩa cơng khai và nếu cĩ yêu cầu thì server sẽ tạo cặp khĩa RSA cho user. Khĩa cơng khai được cập nhật vào thư mục khĩa cơng khai, cịn khĩa bí mật thì được mã hĩa bằng khĩa DES mà cả server lẫn user cùng sử dụng (một cách đơn giản là sử dụng password của user) và được gởi trở về cho user (user sẽ sử dụng password của mình để giải mã, tìm được khĩa bí mật RSA). Trang web server cơ bản như sau:
+ Thư mục khĩa cơng khai: yêu cầu user nhập vào password. Nếu đúng thì liên kết đến phần tử (thư mục khĩa cơng khai, tìm kiếm, cập nhật…), nếu sai thì yêu cầu nhập lại:
Thư mục khĩa cơng khai
Tạo khĩa cơng khai
Password: ……… Password confirm: ……… OK Cance l
+ Tạo khĩa cơng khai:
Danh sách các khĩa cơng khai Tìm kiếm Cập nhật
OK
Cancel
Nếu bạn là user mới thì kích nút Next, nếu khơng thì kích vào nút Form để đăng ký
Form Next Cancel
Name : Addr. : Email : Passsword: Other infor.: OK Cancel Form Key length o 512 o 1024 o 2048 User name
o Curren Login User o Other user
Other User Name
Enter Password
Reenter Password
KeyID Bits Type UserID
399c57aa 1024 e Tien1024Encrypt
7dc3fb84 1024 s Tien1024Sign
- Chương trình được viết bằng ngơn ngữ C và được biên dịch trong TC3. Chương trình gồm cĩ:
+ Các tập tin đầu (*.h): global, nn, prime, r_random, md5, des, rsa, rsatool. + Các tập tin nguồn (*.c): nn, prime, r_random, r_stdlib, md5, desc, rsa, r_keygen,
r_enhanc.
+ Các tập tin demo (*.c): rsagen, pubfind, pubdir. + Thư mục khĩa cơng khai default là: keypub.
+ Thư mục chứa thơng tin của user default là: usrpass.
1.2. Các hằng:
. Liên quan đến số DIGIT:
NN_DIGIT_BITS = 32 (số bít của số digit).
NN_HALF_DIGIT_BITS = 16 (số bít của một nửa số digit).
NN_DIGIT_LEN = NN_DIGIT_BITS / 8 (số byte của số digit).
MAX_NN_DIGIT = 0xffffffff (số byte tối đa của số digit).
MAX_NN_HALF_DIGIT = 0xffff (số byte tối đa của nửa số digit).
NN_LT = -1 (giá trị nhỏ hơn).
NN_EQ = 0 (giá trị bằng nhau).
OK
Cance l
NN_GT = 1 (giá trị lớn hơn).
. Liên quan đến khĩa RSA:
MIN_RSA_MODULUS_BITS = 145 (số bít tối thiểu của modulus).
MAX_RSA_MODULUS_BITS = 512
(số bít tối đa của modulus).
MAX_RSA_MODULUS_LEN = (MAX_RSA_MODULUS_BITS + 7) / 8
(số byte tối đa của modulus).
MAX_RSA_PRIME_BITS = (MAX_RSA_MODULUS_BITS + 1) / 2
(số bít tối đa của số nguyên tố).
MAX_RSA_PRIME_LEN = (MAX_RSA_MODULUS_BITS + 7) / 8
(số byte tối đa của số nguyên tố).
MAX_NN_DIGITS = (MAX_RSA_MODULUS_LEN+ NN_DIGIT_LEN –1) /(NN_DIGIT_LEN + 1)
(số chữ số digit tối đa).
MAX_ENCRYPTED_KEY_LEN = MAX_RSA_MODULUS_LEN
(chiều dài tối đa của khĩa mã hĩa khĩa). RANDOM_BYTES_RQ = 256
(số byte random yêu cầu để seed cấu trúc random đầu tiên để sử dụng). RANDOM_BYTES_RQINT = 512
(số byte random từ hàm thời gian ANSI yêu cầu để seed cấu trúc random đầu tiên để sử dụng).
MAX_NN_DIGITS thì đủ dài để chứa bất kỳ modulus RSA. Tất cả các số tự nhiên (DIGIT) cĩ nhiều nhất MAX_NN_DIGITS chữ số, ngoại trừ các giá trị trung gian cĩ chiều dài gấp đơi trong NN_Mult(t), NN_ModMult(t), NN_ModInv(w), NN_ModDiv(c).
.3. Các tập tin đầu (*.h):
1.3.1. Global.h: định nghĩa các kiểu data cơ sở như: unsigned char * POINTER, BYTE;
unsigned long int UINT4; unsigned short int UNIT2;
PROTO_LIST(list) = () (trả về một danh sách rỗng).
1.3.2. NN.h:
+ Định nghĩa các hằng liên quan đến DIGIT
+ Định nghĩa các hàm biến đổi data: từ xâu sang số DIGIT và ngược lại:
NN_Decode(a, digits, b, len): biến đổi xâu cĩ chiều dài len thành số DIGIT a cĩ chiều dài digits.
NN_Decode(b, len, a, digits): biến đổi số DIGIT a cĩ chiều dài digits thành xâu b cĩ chiều dài len.
+ Định nghĩa các hàm thiết lập (assign):
NN_Assign(a, b, digits): assign a = b
NN_AssignZero(a, digits): assign a = 0
NN_Assign2Exp(a, b, digits): assign a = 2b
+ Định nghĩa các hàm tính tốn số học: NN_Add(a, b, c, digits): tính a = b + c NN_Sub(a, b, c, digits): tính a = b - c NN_Mult(a, b, c, digits): tính a = b * c NN_LShift(a, b, c, digits): tính a = b * 2c NN_RShift(a, b, c, digits): tính a = b / 2c
NN_LRotate(a, b, c, digits): quay trái c bit
+ Địng nghĩa các hàm tính tốn lý thuyết số:
NN_Mod(a, b, bdigitsc, c, cdigits): tính a = a mod c NN_ModMult(a, b, c, d, digits): tính a = b * c mod d
NN_Div(a, b, c, cdigits, d, ddigits): tính a = c div d, b = c mod d NN_ModExp(a, b, c, cdigitsc, d, ddigits): tính a = bc mod d
NN_ModInv(a, b, c, digits): tính a = 1/b mod c
NN_Gcd(a, b, c, digits: tính a = gcd(b, c)
+ Định nghĩa các hàm tính tốn khác:
NN_EVEN(a, digits): trả về 1 nếu a chẵn
NN_EQUAL(a, b, digits): trả về 1 nếu a = b
NN_Zero(a, digits): trả về 1 nếu a = 0
NN_Digits(a, digits): trả về chiều dài của a bằng digits NN_Bits(a, digits): trả về chiều dài của a bằng bits
3 1.3.3 Prime.h: định nghĩa hàm R_GeneratePrime (tạo số nguyên tố).
4 1.3.4. R_random.h: định nghĩa hàm R_GenerateBytes (tạo số byte ngẫu nhiên). 1.3.5. Rsa.h: định nghĩa các hàm mật mã của RSA:
RSAPublicEncrypt: mã hĩa bằng khĩa cơng khai RSA.
RSAPrivateEncrypt: mã hĩa bằng khĩa bí mật RSA.
RSAPublicDecrypt: giải mã bẵng khĩa cơng khai RSA.
RSAPrivateEncrypt: giải mã bằng khĩa bí mật RSA. 1.3.6. Des.h:
Định nghĩa kiểu DES_CBC_CTX (chứa các khĩa DES 48 bit dùng cho các vịng lặp trong mật mã DES và vectơ khởi tạo) và các hàm mật mã DES:
DES_CBCInit: khởi tạo cấu trúc context thích hợp và nạp khĩa.
DES_CBCUpdate: mã hĩa/giải mã
DES_CBCRestart: khởi tạo lại (restart) context, reset vectơ khởi tạo. 1.3.7. Md5.h:
Định nghĩa cấu trúc MD5_CTX và các hàm MD5Init, MD5Update, MD5Final. 1.3.8. Rsatool.h:
+ Định nghĩa các hằng liên quan đến chiều dài khĩa RSA. + Định nghĩa các hằng liên quan đến các lỗi cĩ thể xảy ra. + Định nghĩa các hằng liên quan đến các cờ: IDOK=0, IDOK=1. + Định nghĩa các kiểu dữ liệu:
R_RANDOM_STRUCT: chứa trạng thái và đặc điểm của bộ tạo số random. R_RSA_PUBLIC_KEY: chứa khĩa cơng khai RSA.
R_RSA_PRIVATE_KEY: chứa khĩa bí mật RSA.
R_RSA_PROTO_KEY: cung cấp một khuơn mẫu cho bộ tạo cặp khĩa RSA.
REG_PUBLIC_KEY: chứa tên và định danh của user cho khĩa cơng khai RSA.
REG_PRIVATE_KEY: chứa tên và định danh của user cho khĩa bí mật RSA.
REG_USER_PASS: chứa tên và passord của user .
R_ENVELOPE_CTX: cung cấp một ngữ cảnh (context) cho các quá trình sealing (mã hĩa) và openning (giải mã) một envelope.
. Liên quan đến random:
R_RandomInit, R_RandomUpdate, R_RandomFinal,
R_RandomCreate, R_GenerateBytes, R_GetRandomBytesNeeded.
. Liên quan đến mật mã:
R_SealInit, R_SealUpdate, R_SealFinal, (các hàm mã hĩa) R_OpenInit, R_OpenUpdate, R_Openfinal (các hàm giải mã).
. Tạo khĩa: R_GeneratePEMKeys.
. Liên quan đến bộ nhớ (thư viện chuẩn):
R_memset, R_memcpy, R_memcmp.
+ Định nghĩa các lỗi:
RE_DATA: một lỗi xảy ra trong số các chuỗi lệnh về tốn học. Thường gây ra bởi data khơng đúng hay khơng hợp lệ.
RE_KEY: khĩa phiên liên lạc khơi phục khơng thể giải mã nội dung liên kết. RE_LEN: chiều dài khĩa phiên liên lạc ngồi vùng hay data được cung cấp trong
RSA quá lớn so với khĩa đã cung cấp.
RE_MODULUS_LEN: chiều dài modulus trong RSA khơng hợp lệ (quá dài hay quá ngắn).
RE_NEED_RANDOM: trong khi tạo data random đã sử dụng cấu trúc random khơng được khởi tạo.
RE_PRIVATE_KEY: khĩa bí mật cung cấp khơng hợp lệ hay khơng đúng. RE_PUBLIC_KEY: khĩa cơng khai cung cấp khơng hợp lệ hay khơng đúng.