Tìm hiểu lý thuyết về mật mã hoá thông tin, xây dựng server tạo khóa cho user trong vấn đề bảo mật dữ liệu

Lời Nói Đầu Thế giới của chúng ta luôn sôi sục trong muôn vàn biến động được tạo ra bởi con người. Và trong thế kỷ 20 này, máy tính là một trong những sản phẩm vĩ đại nhất. Cùng với thời gian, người ta không muốn sử dụng một máy tính đơn lẻ nữa mà sẽ kết nối các máy này lại thành một mạng máy tính nhằm tăng khả năng làm việc, hiểu biết, trao đổi, cập nhật các thông tin Mạng Internet là xu hướng phát triển của thế giới ngày nay. Hiện nay, Internet đã trở nên rất phổ biến trên toàn thế giới. Thông qua mạng Internet mọi người có thể trao đổi thông tin với nhau một cách nhanh chóng thuận tiện. Những công ty phát triển và kinh doanh trên môi trường Intranet/Internet họ phải đối diện với khó khăn lớn là làm thế nào để bảo vệ những dữ liệu quan trọng, ngăn chặn những hình thức tấn công, truy xuất dữ liệu bất hợp pháp từ bên trong (Intranet), lẫn cả bên ngoài (Internet). Khi một người muốn trao đổi thông tin với một người hay một tổ chức nào đó thông qua mạng máy tính thì yêu cầu quan trọng là làm sao để đảm bảo thông tin không bị sai lệch hoặc bị lộ do sự xâm nhập của kẻ thứ ba. Trước các yêu cầu cần thiết đó, một số giải thuật mã hóa đã dược xây dựng nhằm đảm bảo tính an toàn dữ liệu tại nơi lưu trữ cũng như khi dữ liệu được truyền trên mạng, như các giải thuật mã hóa đối xứng (DES), giải thuật mã hóa công khai, . Việc tìm hiểu và xây dựng chương trình các giải thuật này cũng không nằm ngoài mục đích của bản luận văn này. Luận văn có nhiệm vụ'' Tìm hiểu lý thuyết về mật mã hoá thông tin, xây dựng server tạo khóa cho user trong vấn đề bảo mật dữ liệu.'' Do thời gian và khả năng có hạn, trong khi phạm vi đề tài lại rộng, những người thực hiện chỉ có thể tìm hiểu được một số giải thuật chính như : DES, ECB, CBC, RSA, MD5 và qua đó đưa ra mô hình server tạo khóa cho các user, cụ thể là làm thế nào để quản lý và phân phối khóa một cách an toàn, hiệu quả. Chắc chắn rằng tập thuyết minh này sẽ không tránh khỏi những thiếu sót, người thực hiện mong nhận được sự góp ý, chỉ dẫn thêm của các Thầy Cô, bạn bè để bản thuyết minh được hoàn thiện hơn. Chúng tôi xin chân thành cảm ơn Thầy hướng dẫn, các Thầy Cô trong khoa đã tạo điều kiện thuận lợi để bản thuyết minh này có thể hoàn thành đúng thời hạn.

doc96 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2451 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Tìm hiểu lý thuyết về mật mã hoá thông tin, xây dựng server tạo khóa cho user trong vấn đề bảo mật dữ liệu, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
caëp khaùc. - Taát caû söï chöùng thöïc cuûa CA bôûi CA naøy caàn xuaát hieän trong thö muïc vaø user caàn bieát laøm sao ñeå lieân keát chuùng theo moät ñöôøng daãn tôùi söï chöùng thöïc khoùa coâng khai cuûa user khaùc. X.509 ñeà nghò chuùng ñöôïc toå chöùc theo thöù töï phaân caáp. Ví duï: U> V> U V > Y > V> W> V W> X> Y > Z > W Y X Z C A B Z> X> X> Ñöôøng noái caùc voøng troøn chæ moái quan heä phaân caáp giöõa caùc CA, caùc hoäp vuoâng chæ ra caùc chöùng thöïc ñaõ duy trì trong thö muïc cho moãi CA. Moãi CA X bao goàm hai kieåu chöùng thöïc: . Chöùng thöïc veà phía tröôùc: chöùng thöïc cuûa X ñöôïc taïo ra bôûi CA khaùc. . Chöùng thöïc ñaûo ngöôïc (quay lui): chöùng thöïc cuûa CA khaùc ñöôïc taïo ra bôûi X. Trong ví duï naøy user A coù theå yeâu caàu söï chöùng thöïc sau töø thö muïc ñeå thieát laäp moät ñöôøng daãn tôùi B: X > W > V > Y > Z > Khi ñoù A coù theå bieát ñöôïc khoùa coâng khai cuûa B. Töông töï khi B caàn bieát khoùa coâng khai cuûa A: Z > Y > V > W > X > 3.2.3. Huûy boû söï chöùng thöïc: - Vì moãi chöùng thöïc chæ coù moät thôøi gian hôïp leä neân moät chöùng thöïc môùi seõ ñöôïc taïo ra ñuùng khi chöùng thöïc cuõ heát haïn. Ngoaøi ra, ngöôøi ta mong muoán coù dòp ñeå huûy boû chöùng thöïc tröôùc khi noù heát haïn vì moät trong caùc lí do sau: . Khoùa bí maät cuûa user ñöôïc giaû thieát laø ñaõ ñöôïc thoûa hieäp. . Moät thôøi gian daøi user khoâng ñöôïc chöùng thöïc bôûi CA naøy. . Khoùa bí maät cuûa CA ñöôïc giaû thieát laø ñaõ ñöôïc thoûa hieäp. - Moãi CA phaûi duy trì moät danh saùch bao goàm taát caû caùc chöùng thöïc bò huûy nhöng chöa heát haïn tôùi caùc user vaø caùc CA khaùc. Danh saùch naøy cuõng neân ñöôïc gôûi neân thö muïc. Moãi danh saùch huûy boû chöùng thöïc ñaõ gôûi tôùi thö muïc ñöôïc kyù nhaän bôûi issuer vaø bao goàm caû teân cuûa issuer, ngaøy thaùng danh saùch ñaõ ñöôïc taïo vaø moät muïc töø (entry) cho moãi chöùng thöïc bò huûy. Moãi entry bao goàm serial number cuûa chöùng thöïc vaø ngaøy thaùng huûy boû chöùng thöïc ñoù. - Khi user nhaän ñöôïc chöùng thöïc trong ñoaïn tin thì user phaûi xaùc ñònh coù bò huûy chöa. User coù theå kieåm tra thö muïc moãi laàn nhaän ñöôïc chöùng thöïc. Ñeå traùnh söï trì hoaõn vaø caùc chi phí coù theå lieân quan ñeán thö muïc tìm kieám, thaät laø toát neáu user duy trì moät boä nhôù (cache) cuïc boä veà caùc chöùng thöïc vaø danh saùch caùc chöùng thöïc ñaõ huûy. 3.2.4. Caùc thuû tuïc chöùng thöïc: X.509 bao goàm ba thuû tuïc chöùng thöïc khaùc nhau cho caùc uùng duïng khaùc nhau. Taát caû caùc thuû tuïc naøy ñeàu söû duïng chöõ kyù khoùa coâng khai. Noù ñöôïc giaû thieát raèng hai ngöôøi tham gia phaûi bieát khoùa coâng khai laãn nhau hoaëc baèng caùch ñöa ra chöùng thöïc laãn nhau töø thö muïc hoaëc chöùng thöïc ñöôïc bao goàm trong ñoaïn tin khôûi taïo töø moãi phía. - Chöùng thöïc moät phía (one-way): (h.a) Ñaây laø söï truyeàn thoâng ñôn thoâng tin töø user A ñeán user B vaø thieát laäp caùc vieäc sau: Ñònh danh cuûa A vaø ñoaïn tin ñöôïc taïo bôûi A. Ñoaïn tin döï kieán cho B. Söï töôøng minh vaø nguoàn goác cuûa ñoaïn tin. ÔÛ möùc toái thieåi ñoaïn tin bao goàm: timestamp tA (goàm coù thôøi gian taïo vaø thôøi gian heát haïn), nonce rA, ñònh danh cuûa B, sgnData (chöõ kyù), Kab (khoùa phieân lieân laïc ñöôïc maõ hoùa baèng khoùa coâng khai cuûa B). Giaù trò rA laø duy nhaát trong thôøi gian hôïp leä cuûa ñoaïn tin, noù ñöôïc söû duïng ñeå choáng laïi caùc cuoäc taán coâng laëp laïi vaø noù ñöôïc löu tröõ ôû B cho ñeán khi heát haïn, B seõ khoâng nhaän baát kyø ñoaïn tin môùi naøo coù rA töông töï. - Chöùng thöïc hai phía (two-way): (h.b) Ngoaøi ba phaàn töû ôû chöùng thöïc moät phía thì chöùng thöïc hai phía coøn thieát laäp theâm caùc phaàn töû sau: Ñònh danh cuûa B vaø ñoaïn tin ñaùp laïi ñöôïc taïo ra bôûi B. Ñoaïn tin döï kieán cho A. Tính töôøng minh vaø nguoàn goác cuûa söï hoài aâm. Chöùng thöïc hai phía cho pheùp caû hai ñoái taùc truyeàn thoâng laøm roû ñònh danh laã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 coù theâm söï ñaùp laïi rB töø A tôùi B. Vôùi kieåu thieát keá naøy thì timestamp khoâng caàn thieát phaûi ñöôïc kieåm tra bôûi vì moãi nonce ñeàu ñöôïc quay laïi phía gôûi, neân moãi phía coù theå kieåm tra nonce quay veà ñeå doø caùc cuoäc taán coâng laëp laïi. Caùch tieáp caän naøy thì caàn thieát khi ñoàng hoà ñoàng boä khoâng coù saün. 1. A |tA, rA, B, sgnData, EKUb|Kab|| A B (h.a) 1. A |tA, rA, B, sgnData, EKUb|Kab|| B A 2. B |tB, rB, A, sgnData, EKUa|Kba|| Chöông 4: Thuyeát minh chöông trình 1.1. Giôùi thieäu: - Nhö ñaõ trình baøy trong phaàn lyù thuyeát, chuùng ta coù theå ruùt ra moät soá keát luaän trong vaán ñeà baûo maät döõ lieäu nhö sau: + Khi maõ hoùa: . Duøng khoùa DES (KS) ñeå maõ hoùa data (M): EKs (M). . Duøng khoùa coâng khai RSA (KU) ñeå maõ hoùa khoùa DES: EKU (KS). + Khi giaûi maõ: . Duøng khoùa bí maät RSA (KR) ñeå giaûi maõ khoùa DES: DKR (EKU (KS)) = KS. . Duøng khoùa DES (KS) ñeå giaûi maõ data (M): DKs (EKs (M)) = M. Vaán ñeà quan troïng laø phaûi ñaûm baûo tính xaùc thöïc cuûa caëp khoùa RSA (ñaëc bieät laø khoùa coâng khai) nghóa laø khi ngöôøi gôûi söû duïng khoùa coâng khai KU cuûa moät ngöôøi naøo ñoù thì phaûi ñaûm baûo khoùa coâng khai ñoù laø cuûa chính ngöôøi ñoù chöù khoâng phaûi cuûa moät ngöôøi naøo khaùc (ngöôøi muoán giaû daïng). Chöông trình naøy cuõng khoâng ngoaøi muïc ñích ñoù, xaây döïng server taïo khoùa cho user, thoâng qua web server user coù theå xem khoùa coâng khai cuûa caùc user khaùc thoâng qua thö muïc khoùa coâng khai vaø neáu coù yeâu caàu thì server seõ taïo caëp khoùa RSA cho user. Khoùa coâng khai ñöôïc caäp nhaät vaøo thö muïc khoùa coâng khai, coøn khoùa bí maät thì ñöôïc maõ hoùa baèng khoùa DES maø caû server laãn user cuøng söû duïng (moät caùch ñôn giaûn laø söû duïng password cuûa user) vaø ñöôïc gôûi trôû veà cho user (user seõ söû duïng password cuûa mình ñeå giaûi maõ, tìm ñöôïc khoùa bí maät RSA). Trang web server cô baûn nhö sau: Taïo khoùa coâng khai Thö muïc khoùa coâng khai + Thö muïc khoùa coâng khai: yeâu caàu user nhaäp vaøo password. Neáu ñuùng thì lieân keát ñeán phaàn töû (thö muïc khoùa coâng khai, tìm kieám, caäp nhaät…), neáu sai thì yeâu caàu nhaäp laïi: OK Password: …………………………………… Cancel Password confirm: …………………… OK Danh saùch caùc khoùa coâng khai Cancel Caäp nhaät Tìm kieám Danh saùch khoùa coâng khai KeyID Bits Type UserID 399c57aa 1024 e Tien1024Encrypt 7dc3fb84 1024 s Tien1024Sign + Taïo khoùa coâng khai: Neáu baïn laø user môùi thì kích nuùt Next, neáu khoâng thì kích vaøo nuùt Form ñeå ñaêng kyù Cancel Next Form Form Name : Addr. : Email : Passsword: Other infor.: OK Cancel Key length o 512 o 1024 o 2048 User name o Curren Login User o Other user Other User Name Enter Password Reenter Password OK Cancel - Chöông trình ñöôïc vieát baèng ngoân ngöõ C vaø ñöôïc bieân dòch trong TC3. Chöông trình goàm coù: + Caùc taäp tin ñaàu (*.h): global, nn, prime, r_random, md5, des, rsa, rsatool. + Caùc taäp tin nguoàn (*.c): nn, prime, r_random, r_stdlib, md5, desc, rsa, r_keygen, r_enhanc. + Caùc taäp tin demo (*.c): rsagen, pubfind, pubdir. + Thö muïc khoùa coâng khai default laø: keypub. + Thö muïc chöùa thoâng tin cuûa user default laø: usrpass. 1.2. Caùc haèng: . Lieân quan ñeán soá DIGIT: NN_DIGIT_BITS = 32 (soá bít cuûa soá digit). NN_HALF_DIGIT_BITS = 16 (soá bít cuûa moät nöûa soá digit). NN_DIGIT_LEN = NN_DIGIT_BITS / 8 (soá byte cuûa soá digit). MAX_NN_DIGIT = 0xffffffff (soá byte toái ña cuûa soá digit). MAX_NN_HALF_DIGIT = 0xffff (soá byte toái ña cuûa nöûa soá digit). NN_LT = -1 (giaù trò nhoû hôn). NN_EQ = 0 (giaù trò baèng nhau). NN_GT = 1 (giaù trò lôùn hôn). . Lieân quan ñeán khoùa RSA: MIN_RSA_MODULUS_BITS = 145 (soá bít toái thieåu cuûa modulus). MAX_RSA_MODULUS_BITS = 512 (soá bít toái ña cuûa modulus). MAX_RSA_MODULUS_LEN = (MAX_RSA_MODULUS_BITS + 7) / 8 (soá byte toái ña cuûa modulus). MAX_RSA_PRIME_BITS = (MAX_RSA_MODULUS_BITS + 1) / 2 (soá bít toái ña cuûa soá nguyeân toá). MAX_RSA_PRIME_LEN = (MAX_RSA_MODULUS_BITS + 7) / 8 (soá byte toái ña cuûa soá nguyeân toá). MAX_NN_DIGITS = (MAX_RSA_MODULUS_LEN+ NN_DIGIT_LEN –1) /(NN_DIGIT_LEN + 1) (soá chöõ soá digit toái ña). MAX_ENCRYPTED_KEY_LEN = MAX_RSA_MODULUS_LEN (chieàu daøi toái ña cuûa khoùa maõ hoùa khoùa). RANDOM_BYTES_RQ = 256 (soá byte random yeâu caàu ñeå seed caáu truùc random ñaàu tieân ñeå söû duïng). RANDOM_BYTES_RQINT = 512 (soá byte random töø haøm thôøi gian ANSI yeâu caàu ñeå seed caáu truùc random ñaàu tieân ñeå söû duïng). MAX_NN_DIGITS thì ñuû daøi ñeå chöùa baát kyø modulus RSA. Taát caû caùc soá töï nhieân (DIGIT) coù nhieàu nhaát MAX_NN_DIGITS chöõ soá, ngoaïi tröø caùc giaù trò trung gian coù chieàu daøi gaáp ñoâi trong NN_Mult(t), NN_ModMult(t), NN_ModInv(w), NN_ModDiv(c). .3. Caùc taäp tin ñaàu (*.h): Global.h: ñònh nghóa caùc kieåu data cô sôû nhö: unsigned char * POINTER, BYTE; unsigned long int UINT4; unsigned short int UNIT2; PROTO_LIST (list) = list (traû veà moät danh saùch) hoaëc PROTO_LIST(list) = () (traû veà moät danh saùch roãng). NN.h: + Ñònh nghóa caùc haèng lieân quan ñeán DIGIT + Ñònh nghóa caùc haøm bieán ñoåi data: töø xaâu sang soá DIGIT vaø ngöôïc laïi: NN_Decode(a, digits, b, len): bieán ñoåi xaâu coù chieàu daøi len thaønh soá DIGIT a coù chieàu daøi digits. NN_Decode(b, len, a, digits): bieán ñoåi soá DIGIT a coù chieàu daøi digits thaønh xaâu b coù chieàu daøi len. + Ñònh nghóa caùc haøm thieát laä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 caùc haøm tính toaùn soá hoï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 traùi c bit + Ñòng nghóa caùc haøm tính toaùn lyù thuyeát soá: 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 caùc haøm tính toaùn khaùc: NN_EVEN(a, digits): traû veà 1 neáu a chaün NN_EQUAL(a, b, digits): traû veà 1 neáu a = b NN_Zero(a, digits): traû veà 1 neáu a = 0 NN_Cmp(a, b, digits): traû veà 1 neáu a > b, 0 : a = b, -1 : a<b NN_Digits(a, digits): traû veà chieàu daøi cuûa a baèng digits NN_Bits(a, digits): traû veà chieàu daøi cuûa a baèng bits 1.3.3 Prime.h: ñònh nghóa haøm R_GeneratePrime (taïo soá nguyeân toá). 1.3.4. R_random.h: ñònh nghóa haøm R_GenerateBytes (taïo soá byte ngaãu nhieân). Rsa.h: ñònh nghóa caùc haøm maät maõ cuûa RSA: RSAPublicEncrypt: maõ hoùa baèng khoùa coâng khai RSA. RSAPrivateEncrypt: maõ hoùa baèng khoùa bí maät RSA. RSAPublicDecrypt: giaûi maõ baüng khoùa coâng khai RSA. RSAPrivateEncrypt: giaûi maõ baèng khoùa bí maät RSA. 1.3.6. Des.h: Ñònh nghóa kieåu DES_CBC_CTX (chöùa caùc khoùa DES 48 bit duøng cho caùc voøng laëp trong maät maõ DES vaø vectô khôûi taïo) vaø caùc haøm maät maõ DES: DES_CBCInit: khôûi taïo caáu truùc context thích hôïp vaø naïp khoùa. DES_CBCUpdate: maõ hoùa/giaûi maõ DES_CBCRestart: khôûi taïo laïi (restart) context, reset vectô khôûi taïo. 1.3.7. Md5.h: Ñònh nghóa caáu truùc MD5_CTX vaø caùc haøm MD5Init, MD5Update, MD5Final. 1.3.8. Rsatool.h: + Ñònh nghóa caùc haèng lieân quan ñeán chieàu daøi khoùa RSA. + Ñònh nghóa caùc haèng lieân quan ñeán caùc loãi coù theå xaûy ra. + Ñònh nghóa caùc haèng lieân quan ñeán caùc côø: IDOK=0, IDOK=1. + Ñònh nghóa caùc kieåu döõ lieäu: R_RANDOM_STRUCT: chöùa traïng thaùi vaø ñaëc ñieåm cuûa boä taïo soá random. R_RSA_PUBLIC_KEY: chöùa khoùa coâng khai RSA. R_RSA_PRIVATE_KEY: chöùa khoùa bí maät RSA. R_RSA_PROTO_KEY: cung caáp moät khuoân maãu cho boä taïo caëp khoùa RSA. REG_PUBLIC_KEY: chöùa teân vaø ñònh danh cuûa user cho khoùa coâng khai RSA. REG_PRIVATE_KEY: chöùa teân vaø ñònh danh cuûa user cho khoùa bí maät RSA. REG_USER_PASS: chöùa teân vaø passord cuûa user . R_ENVELOPE_CTX: cung caáp moät ngöõ caûnh (context) cho caùc quaù trình sealing (maõ hoùa) vaø openning (giaûi maõ) moät envelope. + Ñònh nghóa caùc haøm: . Lieân quan ñeán random: R_RandomInit, R_RandomUpdate, R_RandomFinal, R_RandomCreate, R_GenerateBytes, R_GetRandomBytesNeeded. . Lieân quan ñeán maät maõ: R_SealInit, R_SealUpdate, R_SealFinal, (caùc haøm maõ hoùa) R_OpenInit, R_OpenUpdate, R_Openfinal (caùc haøm giaûi maõ). . Taïo khoùa: R_GeneratePEMKeys. . Lieân quan ñeán boä nhôù (thö vieän chuaån): R_memset, R_memcpy, R_memcmp. + Ñònh nghóa caùc loãi: RE_DATA: moät loãi xaûy ra trong soá caùc chuoãi leänh veà toaùn hoïc. Thöôøng gaây ra bôûi data khoâng ñuùng hay khoâng hôïp leä. RE_KEY: khoùa phieân lieân laïc khoâi phuïc khoâng theå giaûi maõ noäi dung lieân keát. RE_LEN: chieàu daøi khoùa phieân lieân laïc ngoaøi vuøng hay data ñöôïc cung caáp trong RSA quaù lôùn so vôùi khoùa ñaõ cung caáp. RE_MODULUS_LEN: chieàu daøi modulus trong RSA khoâng hôïp leä (quaù daøi hay quaù ngaén). RE_NEED_RANDOM: trong khi taïo data random ñaõ söû duïng caáu truùc random khoâng ñöôïc khôûi taïo. RE_PRIVATE_KEY: khoùa bí maät cung caáp khoâng hôïp leä hay khoâng ñuùng. RE_PUBLIC_KEY: khoùa coâng khai cung caáp khoâng hôïp leä hay khoâng ñuùng. 1.4. Caùc taäp tin nguoàn (*.c): 1.4.1. R_random.c - Giôùi thieäu: Caùc haøm khaùc nhau trong RSATOOL yeâu caàu data ngaãu nhieân (cô baûn ñeå taïo khoùa). Moät doøng dta ngaãu nhieân (random data stream) ñöôïc taïo söû duïng giaûi thuaät chöõ kyù MD5 vaø giaù trò “seed” ñöôïc cung caáp trong form cuûa caáu truùc random. Tröôùc khi söû duïng, caáu truùc random phaûi ñöôïc khôûi taïo vaø chính baûn thaân noù phaûi ñöôïc seed baèng caùch troân vaøo moät löôïng ngaãu nhieân thaät. Thuû tuïc ñeå chuaån bò moät caáu truùc random môùi nhö sau: Ñeå daønh (reserve) sizeof (R_RANDOM_STRUCT) boä nhôù. Khôûi taïo caáu truùc môùi söû duïng R_RandomInit. Thieát laäp random -> bytesNeeded, soá byte ngaãu nhieân yeâu caàu ñeå seed caáu truùc tröôùc khi söû duïng, ñeå RANDOM_BYTES_RQ vaø zero data. Troän moät löôïng data random thích hôïp söû duïng R_RandomUpdate. Noù laáy moät khoái data ñöôïc cung caáp bôûi ngöôøi goïi vaø keát hôïp noù vôùi caáu truùc random coù saün MD5. Ñoàng thôøi noù cuõng giaûm random -> butesNeeded maø chæ ra löôïng data random coøn yeâu caàu (haøm R_GetRandomBytesNeeded vaø traû veà trò bytesNeeded cuûa caáu truùc random ñaõ cho). R_RandomUpdate seõ ñöôïc laëp laïi cho ñeán khi R_GetRandomBytesNeeded traû veà 0. R_RandomUpdate: coù theå ñöôïc goïi moät khi caáu truùc caáu truùc ñaõ ñöôïc khôûi taïo (VD: bytesNeeded = 0). RANDOM_BYTES_RQ seõ ñöôïc ñieàu chænh theo "purity" cuûa nguoàn data random. R_RandomCreate: taïo vaø khôûi taïo moät caáu truùc random töôi (fresh) söû duïng data töø ñoàng hoà heä thoáng hieän taïi, thoâng qua haøm gmtime cuûa ANSI (haøm naøy chuû yeáu söû duïng bieán taùch bieät RANDOM_BYTES_INT ñeå chæ löôïng byte toång hôïp, hieän taïi thieát laäp ôû 512). Treân heä thoáng töông thích ANSI, R_RandomCreate coù theå ñöôïc söû duïng nhö cöûa haøng moät traïm (one_stop) cho vieäc taïo moät caáu truùc random deã daøng ñeå söû duïng. Caùc nguoàn data random khaùc nhö soá laàn goõ baøn phím, soá laàn truy xuaát ñóa,… Moät khi caáu truùc random ñaõ ñöôïc khôûi taïo, vieäc khôûi taïo vaø seed noù coù theå ñöôïc söû duïng bôûi R_GenerateBytes ñeå taïo ra doøng data random giaû. R_GenerateBytes traû veà moät loãi neáu caáu truùc random khoâng hôïp leä (khoâng ñöôïc seed) ñöôïc tham khaûo. Haøm R_RandomMix: söû duïng haøm ñoàng hoà vaø thôøi gian ANSI ñeå laáy ngaãu nhieân traïng thaùi hieän taïi cuûa caáu truùc random coù saün, ñaõ ñöôïc khôûi taïo. Sau ñoù, laáy ñi output naøo ñang chôø töø traïng thaùi output. Haøm R_RandomFinal: xoùa caáu truùc random. - Caùc haøm random: R_RandomInit Int R_RandomInit(random) R_RANDOM_STRUCT *random; Khôûi taïo moät caáu truùc random môùi. Zero vuøng data vaø thieát laäp random -> bytesNeeded tôùi default cuûa heä thoáng (RANDOM_BYTES_RQ). Lu6n traû veà IDOK (=0). R_RandomUpdate Int R_RandomUpdate(random, block, len) R_RANDOM_STRUCT *random; unsigned char *block; unsigned int len; Caäp nhaät caáu truùc random ñaõ ñöôïc khôûi taïo tröôùc ñaây baèng caùch troän khoái data ñöôïc cung caáp bôûi ngöôøi goïi (söû duïng MD5). Caäp nhaät random -> bytesNeeded khi thích hôïp. Luoân traû veà IDOK. R_GetRandomBytesNeeded Int R_GetRandomBytesNeeded(bytesNeeded, random) R_RANDOM_STRUCT *random; Unsigned int bytesNeeded; (soá byte troän caàn thieát) Traû veà soá byte seed vaãn coøn yeâu caàu cho caáu truùc random. Khi thoaùt, bytesNeeded chöùa soá byte yeâu caàu bôûi caáu truùc random. Luoân traû veà IDOK. R_GenerateBytes Int R_GenerateBytes(block, len, random) unsigned char *block; (khoái data) unsigned int len; (chieàu daøi khoái) Taïo khoái data caàn thieát vôùi chieà daøi soá byte giaû random (len) daãn xuaát töø random söû duïng MD5. Traû veà RE_NEED_RANDOM neáu random khoâng ñöôïc khôûi taïo moät caùch ñaày ñuû, ngöôïc laïi traû veà IDOK. R_RandomFinal void R_RandomFinal(random) R_RANDOM_STRUCT *random; Xoùa caáu truùc random, thieát laäp taát caû giaù trò vaø data baèng zero. R_RandomCreate void R_RandomCreate(random) R_RANDOM_STRUCT *random; Khôûi taïo caáu truùc random vaø seed noù vôùi data ñöôïc daãn xuaát töø vieäc söû duïng haøm gmtime vaø clock cuûa ANSI. Löôïng data seed ñöôïc xaùc ñònh bôûi RANDOM_BYTES_RQINT. R_RandomMix void R_RandomMix(random) R_RANDOM_STRUCT *random Ngaãu nhieân hoùa (randomises) traïng thaùi beân trong cuûa caáu truùc random ñöôïc cung caáp, söû duïng data töø caùc haøm clock vaø time cuûa ANSI, sau ñoù laáy ñi baát kyø output chôø. 1.4.2. NN.c - Giôùi thieäu: taäp tin naøy chöùa caùc giaûi thuaät lieân quan ñeán soá töï nhieân (soá kieåu NN_DIGIT: 4 byte) ñaõ ñònh nghóa trong nn.h ñöôïc söû duïng bôûi caùc haøm khaùc nhau trong RSATOOL. - Caùc haøm: NN_Decode Void NN_Decode (a, digits, b, len) NN_DIGIT *a; Unsigned char *b; Unsigned int digits, len; Bieán ñoåi xaâu b coù chieàu daøi len thaønh soá töï nhieân a coù chieàu daøi digits. Digits phaûi ñuû lôùn ñeå chöùa len byte bieán ñoåi, neáu digits nhoû thì caùc byte MSB cuûa soá seõ bò caét. Caùc pheùp toaùn thöïc hieän vieäc bieán ñoåi laø: pheùp toaùn and vaø pheùp toaùn dòch traùi. NN_Encode Void NN_Encode (b, len, a, digits) NN_DIGIT *a; Unsigned char *b; Unsigned int digits, len; Bieán ñoåi soá töï nhieân a coù chieàu daøi digits thaønh xaâu b coù chieàu daøi len. Len phaûi ñuû lôùn ñeå chöùa digits bieán ñoåi töø a, neáu len nhoû thì caùc byte MSB cuûa soá seõ bò caét. Caùc pheùp toaùn thöïc hieän vieäc bieán ñoåi laø: pheùp toaùn and vaø pheùp toaùn dòch phaûi. NN_Assign Void NN_Assign (b, a, digits) NN_DIGIT *a, *b; Unsigned int digits; Thieát laäp a = b (a, b laø caùc soá töï nhieân). Neáu a > b (NNDigits(a) > NNDigits(b)) thì digits MSB cuûa a seõ bò xoùa. NN_AssignZero Void NN_AssignZero (a, digits) NN_DIGIT *a; Unsigned int digits; Zero caùc chöõ soá (digits) cuûa soá töï nhieân a: a = 0. NN_Assign2Exp Void NN_Assign2Exp (a, b, digits) NN_DIGIT *a; Unsigned int b, digits; Thieát laäp a = 2b vôùi a laø soá töï nhieân coù chieàu daøi digits vaø b soá muõ nguyeân baèng caùch dòch 1 qua traùi b mod 32 bít. Keát quaû seõ khoâng xaùc ñònh neáu b > digits*32. NN_Add NN_DIGIT NN_Add (a, b, c, digits) NN_DIGIT *a, *b, *c; Unsigned int digits; Tính a = b + c vaø traû veà carry. a, b, c vaø giaù trò traû veà laø caùc soá töï nhieân, taát caû coù chieàu daøi digits. NN_Sub NN_DIGIT NN_Sub (a, b, c, digits) NN_DIGIT *a, *b, *c; Unsigned int digits; Tính a = b – c vaø traû veà borrow. a, b, c vaø giaù trò traû veà laø caùc soá töï nhieân, taát caû coù chieàu daøi digits. NN_Mult Void NN_Mult (a, b, c, digits) NN_DIGIT *a, *b, *c; Unsigned int digits; Tính a = b * c. a, b, c vaø giaù trò traû veà laø caùc soá töï nhieân, taát caû coù chieàu daøi digits. Keát quaû khoâng xaùc ñònh neáu digits > MAX_NN_DIGITS. NN_LShift NN_DIGIT NN_LShift (a, b, c, digits) NN_DIGIT *a, *b; Unsigned int c, digits; Tính a = b * 2c (dòch b qua traùi c bít, keát quaû traû veà trong a). a, b, c vaø giaù trò traû veà laø caùc soá töï nhieân, taát caû coù chieàu daøi digits. Keát quaû khoâng xaùc ñònh neáu c > 32. NN_RShift NN_DIGIT NN_RShift (a, b, c, digits) NN_DIGIT *a, *b; Unsigned int c, digits; Tính a = b div 2c (dòch b qua phaûi c bít, keát quaû traû veà trong a). a, b, c vaø giaù trò traû veà laø caùc soá töï nhieân, taát caû coù chieàu daøi digits. Keát quaû khoâng xaùc ñònh neáu c > 32. NN_Div Void NN_Div (a, b, c, cDigits, d, dDigits) NN_DIGIT *a, *b, *c, *d; Unsigned int cDigits, dDigits; Tính a = c div d vaø b = c mod d. a, b, c vaø d laø caùc soá töï nhieân, a vaø c coù chieàu daøi cDigits, coøn b vaø d coù chieàu daøi dDigits. Keát quaû khoâng xaùc ñònh neáu d = 0, cDigits > = 2*MAX_NN_DIGITS hay dDigits > MAX_NN_DIGITS. NN_Mod Void NN_Mod (a, b, bDigits, c, cDigits) NN_DIGIT *a, *b, *c; Unsigned int bDigits, cDigits; Tính a = b mod c. a, b vaø c laø caùc soá töï nhieân, a vaø c coù chieàu daøi cDigits, coøn b coù chieàu daøi bDigits. Keát quaû khoâng xaùc ñònh neáu c = 0, bDigits > = 2*MAX_NN_DIGITS hay cDigits > MAX_NN_DIGITS. NN_ModMult Void NN_ModMult (a, b, c, d, digits) NN_DIGIT *a, *b, *c, *d; Unsigned int digits; Tính a = b*c mod d. a, b, c vaø d laø caùc soá töï nhieân, taát caû coù chieàu daøi digits. Keát quaû khoâng xaùc ñònh neáu d = 0 hay digits > MAX_NN_DIGITS. NN_ModExp Void NN_ModExp (a, b, c, cDigits, d, dDigits) NN_DIGIT *a, *b, *c, *d; Unsigned int cDigits, dDigits; Tính a = bc mod d. a, b, c vaø d laø caùc soá töï nhieân, a, b vaø d coù chieàu daøi dDigits, coøn c coù chieàu daøi cDigits. Keát quaû khoâng xaùc ñònh neáu d = 0, cDigits = 0 hay dDigits > MAX_NN_DIGITS. NN_ModInv Void NN_ModInv (a, b, c, digits) NN_DIGIT *a, *b, *c; Unsigned int digits; Tính a = b-1 mod c. a, b vaø c laø caùc soá töï nhieân, taát caû coù chieàu daøi digits. Keát quaû khoâng xaùc ñònh neáu b vaø c khoâng coù quan heä nguyeân toá (gcd(b, c) khaùc 1) hay digits > MAX_NN_DIGITS. NN_Gcd Void NN_Gcd (a, b, c, digits) NN_DIGIT *a, *b, *c; Unsigned int digits; Tính öôùc soá chung lôùn nhaát cuûa b vaø c, keát quaû traû veà trong a. a, b vaø c laø caùc soá töï nhieân, taát caû coù chieàu daøi digits. Keát quaû khoâng xaùc ñònh neáu c MAX_NN_DIGITS. NN_Cmp Int NN_Cmp (a, b, digits) NN_DIGIT *a, *b; Unsigned int digits; So saùnh a vaø b. a, b laø caùc soá töï nhieân, taát caû coù chieàu daøi digits. Keát quaû traû veà 1 neáu a > b, 0 neáu a = b, -1 neáu a < b. NN_Zero Int NN_Zero (a, digits) NN_DIGIT *a; Unsigned int digits; Traû veà 1 neáu a = 0 ngöôïc laïi traû veà 0. a laø caùc soá töï nhieân, coù chieàu daøi digits. NN_Digits Unsigned int NN_Digits (a, digits) NN_DIGIT *a; Unsigned int digits; Traû veà chieàu daøi (baèng digits) thaät söï cuûa a (boû caùc digits daãn ñaàu baèng 0). a laø caùc soá töï nhieân, coù chieàu daøi digits. NN_Bits Unsigned int NN_Bits (a, digits) NN_DIGIT *a; Unsigned int digits; Traû veà chieàu daøi (baèng bít) cuûa a (boû caùc bít daãn ñaàu baèng 0). a laø caùc soá töï nhieân, coù chieàu daøi digits. 1.4.3. R_stdlib.c - Giôùi thieäu: chöùa caùc giaûi thuaät veà caùc thao taùc boä nhôù ñöôïc söû duïng trong RSATOOL nhö: R_memset: thieát laäp moät vuøng boä nhôù tôùi moät giaù trò ñaëc taû. R_memcpy: copy khoái boä nhôù tôùi moät ñòa chæ khaùc. R_memcmp: so saùnh hai khoái boä nhôù. - Caùc haøm: R_memset Void R_memset (output, value, len) POINTER output; Int value; Unsigned int len; Thieát laäp len byte ôû output tôùi giaù trò value. R_memcpy Void R_memcpy (output, input, len) POINTER output; POINTER input; Unsigned int len; Copy len byte töø input vaøo output. R_memcmp Void R_memcmp (Block1, Block2, len) POINTER Block1; POINTER Block2; Unsigned int len; So saùnh len byte ôû Block1 so vôùi Block2. Traû veà zero neáu hai khoái gioáng nhau, coøn neáu hai khoái khaùc nhau thì traû veà söï khaùc nhau giöõa hai byte khaùc nhau ñaàu tieân (traû veà Block1[dif] – Block2[dif], vôùi dif laø offset cuûa byte khaùc nhau ñaàu tieân). 1.4.4. Prime.c - Giôùi thieäu: taäp tin naøy chöùa caùc giaûi thuaät lieân quan ñeán soá nguyeân toá nhö kieåm tra soá nguyeân toá (probableprime), taïo soá nguyeân toá (generatePrime). . - Caùc haøm: GeneratePrime Int GeneratePrime (a, b, c, d, digits, randomStruct) NN_DIGIT *a, *b, *c, *d; Unsigned int digits; R_RANDOM_STRUCT * randomStruct; Taïo soá ngaãu nhieân a coù chieàu daøi digits töø caáu truùc randomStruct (söû duïng haøm R_GenerateBytes) vaø bieán ñoåi ñeå a thoûa ñieàu kieän: b =< a <= c vaø (a-1) mod d = 0 (a, b, c, d laø caùc soá coù cuøng chieàu daøi digits). Sau ñoù kieåm tra xem a coù phaûi laø nguyeân toá hay khoâng (söû duïng haøm probableprime) . Khi thoaùt, traû veà IDOK (0) neáu thaønh coâng, vaø RE_DATA neáu thaát baïi hoaëc traû veà RE_NEED_RANDOM neáu caáu truùc randomStruct khoâng ñöôïc khôûi taïo ñaày ñuû. Probableprime Static int probableprime (a, adigits) NN_DIGIT *a; Unsigned int aDigits; Kieåm tra xem soá a coù chieàu daøi adigits coù phaûi laø soá nguyeân toá hay khoâng: neáu a nhoû (chaúng haïn a < 9000) thì xem a coù naèm trong baûng chöùa caùc soá nguyeân toá hay khoâng, ngöôïc laïi neáu a lôùn thì ta söû duïng ñònh lyù Fermat ñeå kieåm tra khaû naêng nguyeân toá cuûa a. Khi thoaùt, traû veà 1 neáu thaønh coâng, 0 neáu thaát baïi. 1.4.5. R_keygen.c - Giôùi thieäu: taäp tin naøy chöùa giaûi thuaät taïo caëp khoùa RSA (R_GeneratePEMKeys). - Caùc haøm: R_GeneratePEMKeys Int R_GeneratePEMKeys (publicKey, privateKey, protoKey, randomStruct) R_RSA_PUBLIC_KEY *publicKey; (khoùa coâng khai RSA môùi) R_RSA_PRIVATE_KEY *privateKey; (khoùa bí maät RSA môùi) R_RSA_PROTO_KEY *protoKey; (khoùa prototype RSA) R_RANDOM_STRUCT *randomStruct; (caáu truùc random) Taïo caëp khoùa RSA (publicKey, privateKey) vôùi chieàu daøi modulus vaø soá muõ coâng khai e ñöôïc cho trong protoKey. Giaûi thuaät ñöôïc toùm taét nhö sau: + Neáu soá bít modulus (protoKey.bits) nhoû hôn MIN_RSA_MODULUS_LEN hay lôùn hôn MAX_RSA_MODULUS_LEN thì baùo loãi RE_MODULUS_LEN. + Tính: nDigits = (protoKey.bits + 3) / 4; pDigits = (nDigits + 1) / 2; pBits = (protoKey.bits + 1) / 2; qBits = protoKey.bits – pBits; + Neáu protoKey.useFermat = 1 thì e = 65537 Neáu protoKey.useFermat = 0 thì e = 3 + Laëp Taïo soá nguyeân toá p (q) thoûa: 3*2pBits – 2 < p (q) < 2pBits – 1 Söû duïng haøm GeneratePrime vôùi a = p (q), b = 3*2pBits – 2, c = 2pBits – 1, d = 2 Cho ñeán khi GCD (p-1, e) = 1 (söû duïng haøm RSAFilter) + Tính: n = pq; d= e-1 mod (p-1)(q-1); qInv = q-1 mod p; dP = d mod (p-1); dQ = d mod (q-1); + Chuyeån caùc keát quaû treân vaøo publicKey vaø privateKey (söû duïng caùc haøm NN_Encode vaø R_memcpy). + Xoùa caùc keát quaû treân khoûi boä nhôù (söû duïng haøm R_memset). Khi thoaùt, traû veà 0 neáu thaønh coâng, 1 neáu thaát baïi. RSA_Filter Static int RSA_Filter (a, aDigits, b, bDigits) NN_DIGIT *a, *b; Unsigned int aDigits, bDigits; Tính öôùc soá chung lôùn nhaát giöõa a – 1 vaø b (a coù chieàu daøi aDigits vaø b coù chieàu daøi bDigits): söû duïng haøm NN_Gcd trong NN.c. Khi thoaùt, traû veà 1 neáu Gcd(a-1, b) = 1 hoaëc traû veà 0 neáu Gcd(a-1, b) khaùc 1. 1.4.6. MD5.c MD5Init Void MD5Init (context) MD5_CTX *context; Khôûi taïo MD5. Baét ñaàu moät taùc vuï MD5, ghi moät context môùi, khôûi taïo a, b, c, d. MD5Update Void MD5Update (context, input, inputLen) MD5_CTX *context; Unsigned char *input; Unsigned int inputLen; Caäp nhaät khoái MD5. Tieáp tuïc taùc vuï message_digest MD5, xöû lyù khoái message khaùc (coù chieàu daøi lôùn hôn 448 bít) vaø caäp nhaät context. MD5Final Void MD5Final (digest, context) Unsigned char digest[16]; MD5_CTX *context; Cuoái taùc vuï message_digest MD5 (khoái message coù chieàu daøi nhoû hôn 448 bít). Theâm vaøo message phaàn padding ñeå ñuû 448 bít. Sau ñoù ghi message_digest vaø zero context. MD5Transform Static void MD5Tansform (state, block) UINT4 state[4]; Unsigned char block[64]; Söï chuyeån ñoåi cô baûn cuûa moät giai ñoaïn MD5. Chuyeån ñoåi state (a, b, c, d) döïa treân khoái 512 bít. Thöïc hieän 4 voøng bieán ñoåi trong moãi giai ñoaïn MD5. 1.4.7. RSA.c Phaàn naøy moâ taû caùc haøm maõ hoùa vaø giaûi maõ trong RSA theo chuaån PKCS#1: RSAPrivateEncrypt: maõ hoùa khoái data söû duïng khoùa bí maät RSA. RSAPrivateDecrypt: giaûi maõ khoái data söû duïng khoùa bí maät RSA. RSAPublicEncrypt: maõ hoùa khoái data söû duïng khoùa coâng khai RSA. RSAPublicDecrypt: giaûi maõ khoái data söû duïng khoùa coâng khai RSA. Vaø caùc haøm maõ hoùa RSA thoâ (raw): RSAPublicFunc: maõ hoùa/giaûi maõ data söû duïng khoùa coâng khai RSA. RSAPrivateFunc: maõ hoùa/giaûi maõ khoái data söû duïng khoùa bí maät RSA. RSAPrivateEncrypt Int RSAPrivateEncrypt (output, outputLen, input, inputLen, privateKey) Unsigned char *output; Unsigned int *outputLen; Unsigned char *input; Unsigned int inputLen; R_RSA_PRIVATE_KEY *privateKey; Thöïc hieän vieäc maõ hoùa khoái input coù chieàu daøi inputLen baèng khoùa bí maät RSA töông thích vôùi chuaån PKCS#1 vaø keát quaû traû veà output vôùi chieàu daøi outputLen. Output phaûi ñuû lôùn ñeå chöùa keát quaû tính toaùn, lôùn hôn khoùa bí maät moät byte (nhöng khoâng lôùn hôn MAX_RSA_MODULUS_LEN + 1). InputLen phaûi nhoû hôn kích thöôùc modulus ít nhaát 11 byte (yeâu caàu cuûa chuaån PKCS#1). Khi thoaùt soá byte outputLen cuûa data ñaõ maõ hoùa ñöôïc traû veà trong output. Traû veà RE_LEN neáu khoái nhaäp quaù lôùn (so vôùi khoùa RSA ñaõ cung caáp), ngöôïc laïi traû veà IDOK. RSAPrivateDecrypt Int RSAPrivateDecrypt (output, outputLen, input, inputLen, privateKey) Unsigned char *output; Unsigned int *outputLen; Unsigned char *input; Unsigned int inputLen; R_RSA_PRIVATE_KEY *privateKey; Thöïc hieän vieäc giaûi maõ khoái input coù chieàu daøi inputLen baèng khoùa bí maät RSA töông thích vôùi chuaån PKCS#1 vaø keát quaû traû veà output vôùi chieàu daøi outputLen. OutputLen phaûi ñuû lôùn ñeå chöùa keát quaû tính toaùn, lôùn hôn khoùa bí maät moät byte (nhöng khoâng lôùn hôn MAX_RSA_MODULUS_LEN + 1). Khi thoaùt soá byte outputLen cuûa data ñaõ giaûi maõ ñöôïc traû veà trong output. Traû veà RE_LEN neáu khoái nhaäp quaù lôùn (so vôùi khoùa RSA ñaõ cung caáp), RE_DATA neáu data ñaõ giaûi maõ khoâng hôïp so vôùi khoái data PKCS#1, ngöôïc laïi traû veà IDOK. RSAPublicEncrypt Int RSAPublicEncrypt (output, outputLen, input, inputLen, publicKey, randomStruct) Unsigned char *output; Unsigned int *outputLen; Unsigned char *input; Unsigned int inputLen; R_RSA_PUBLIC_KEY *publicKey; R_RANDOM_STRUCT *randomStruct; Thöïc hieän vieäc maõ hoùa khoái input coù chieàu daøi inputLen baèng khoùa coâng khai RSA töông thích vôùi chuaån PKCS#1 vaø keát quaû traû veà output vôùi chieàu daøi outputLen. Output phaûi ñuû lôùn ñeå chöùa keát quaû tính toaùn, lôùn hôn khoùa coâng khai moät byte (nhöng khoâng lôùn hôn MAX_RSA_MODULUS_LEN + 1). InputLen phaûi nhoû hôn kích thöôùc modulus ít nhaát 11 byte (yeâu caàu cuûa chuaån PKCS#1). Khi thoaùt soá byte outputLen cuûa data ñaõ maõ hoùa ñöôïc traû veà trong output. Traû veà RE_LEN neáu khoái nhaäp quaù lôùn (so vôùi khoùa RSA ñaõ cung caáp), ngöôïc laïi traû veà IDOK. RSAPublicDecrypt Int RSAPublicDecrypt (output, outputLen, input, inputLen, publicKey) Unsigned char *output; Unsigned int *outputLen; Unsigned char *input; Unsigned int inputLen; R_RSA_PUBLIC_KEY *publicKey; Thöïc hieän vieäc giaûi maõ khoái input coù chieàu daøi inputLen baèng khoùa coâng khai RSA töông thích vôùi chuaån PKCS#1 vaø keát quaû traû veà output vôùi chieàu daøi outputLen. OutputLen phaûi ñuû lôùn ñeå chöùa keát quaû tính toaùn, lôùn hôn khoùa coâng khai moät byte (nhöng khoâng lôùn hôn MAX_RSA_MODULUS_LEN + 1). Khi thoaùt soá byte outputLen cuûa data ñaõ giaûi maõ ñöôïc traû veà trong output. Traû veà RE_LEN neáu khoái nhaäp quaù lôùn (so vôùi khoùa RSA ñaõ cung caáp), RE_DATA neáu data ñaõ giaûi maõ khoâng hôïp so vôùi khoái data PKCS#1, ngöôïc laïi traû veà IDOK. RSAPublicFunc Int RSAPublicFunc (output, outputLen, input, inputLen, publicKey) Unsigned char *output; Unsigned int *outputLen; Unsigned char *input; Unsigned int inputLen; R_RSA_PUBLIC_KEY *publicKey; Thöïc hieän vieäc maõ hoùa khoái input (m) coù chieàu daøi inputLen baèng khoùa coâng khai RSA publicKey (n, e) vaø keát quaû traû veà output (c) vôùi chieàu daøi outputLen: c = me mod n Ñieàu kieän: output coù cuøng chieàu daøi vôùi modulus vaø input phaûi nhoû hôn modulus. RSAPrivateFunc Int RSAPrivateFunc (output, outputLen, input, inputLen, privateKey) Unsigned char *output; Unsigned int *outputLen; Unsigned char *input; Unsigned int inputLen; R_RSA_PUBLIC_KEY *privateKey; Thöïc hieän vieäc giaûi maõ khoái input (c) coù chieàu daøi inputLen baèng khoùa bí maät RSA privateKey (n, p, q, dP, dQ, qInv) vaø keát quaû traû veà output (m) vôùi chieàu daøi outputLen: mP = cPdP mod p mQ = cQdQ mod q m = ((((mP – mQ) mod p) * qInv) mod p) * q + mQ Ñieàu kieän: output coù cuøng chieàu daøi vôùi modulus vaø input phaûi nhoû hôn modulus. 1.4.8. DES.c - Vieäc maõ hoùa vaø giaûi maõ DES theo mode CBC bao goàm caùc taùc vuï cô baûn sau: . Init: khôûi taïo caáu truùc context thích hôïp vaø naïp khoùa. . Update: xöû lyù khoái input söû duïng context ñaõ khôûi taïo (maõ hoùa hoaëc giaûi maõ). . Restart: khôûi ñoäng laïi context, reset vectô khôûi taïo, cho pheùp taùi söû duïng cuøng moät khoùa cho caùc taùc vuï xa hôn. - Caùc haøm phuï trôï cho caùc taùc vuï treân: . DesKey: tính caùc khoùa con cho maät maõ DES. . DesFunc: haøm maät maõ DES. . Scrunch: bieán ñoåi xaâu thaønh soá DIGIT. . Unscrunch: bieán ñoåi soá DIGIT thaønh xaâu. DES_CBC_Init Void DES_CBC_Init (context, key, iv, encrypt) DES_CBC_CTX *context; Unsigned char * key; /* khoùa DES */ Unsigned char * iv; /* vectô khôûi taïo */ Int encrypt; /* côø encrypt=1: maõ hoùa; encrypt=0: giaû maõ */ Khôûi taïo context, naïp context vôùi caùc khoùa con, context laø moät caáu truùc DES_CBC_CTX roãng, caû key laãn iv ñeàu coù chieàu daøi 64 bít. Khi thoaùt, context chöùa khoùa ñaõ cung caáp vaø neân ñöôïc xöû lyù nhö laø data coù tính baûo maät. Ñoù laø traùch nhieäm cuûa ngöôøi nhaän khi moät taùc vuï maõ hoùa hay giaûi maõ hoaøn thaønh. DES_CBC_Update Int DES_CBC_Update (context, output, input, len) DES_CBC_CTX *context; Unsigned char * output; /* data xuaát */ Unsigned char * input; /* data nhaäp */ Unsigned int len; /* soá byte input */ Tieáp tuïc taùc vuï DES_CBC_Init, maõ hoùa soá byte len töø input söû duïng context ñaõ cung caáp, ñaët keát quaû vaøo output. Context phaûi laø caáu truùc DES_CBC_CTX maø ñaõ ñöôïc khôûi taïo trong DES_CBC_Init, len phaûi laø boäi soá cuûa 8 (byte), output phaûi coù chieàu daøi ít nhaát laø len. Khi thoaùt, output chöùa len byte data ñaõ maõ hoùa. Traû veà RE_LEN neáu len khoâng laø boäi soá cuûa 8, ngöôïc laïi traû veà IDOK. DES_CBC_Restart Void DES_CBC_Restart (context) DES_CBC_CTX *context; Khôûi ñoäng laïi context ñaõ cung caáp, reset vectô khôûi taïo tôùi giaù trò ban ñaàu, cho pheùp söû duïng cuøng context (cuøng khoùa DES) cho moät khoái data môùi. Caàn chuù yù laø thoâng tin cuûa khoùa khoâng bò xoùa vì vaäy noù neân ñöôïc xöû lyù nhö laø data tin caäy coù tính baûo maät. Scrunch Static void scrunch (into, out of) UINT4 *into; Unsigned char *out of; Bieán ñoåi xaâu outof thaønh soá DIGIT into baèng pheùp toaùn and vaø dòch traùi. Unscrunch Static void unscrunch (into, out of) UINT4 *out of; Unsigned char *into; Bieán ñoåi soá DIGIT outof thaønh xaâu into baèng pheùp toaùn and vaø dòch phaûi. Deskey Static void deskey (subkeys, key, encrypt) UINT4 subkeys[32]; Unsigned char key[8]; Int encrypt; Haøm taïo caùc khoùa con subkeys töø khoùa chính key cho taùc vuï maõ hoùa hay giaûi maõ (encrypt = 0 hay =1). Desfunc void desfunc (block, ks) UINT4 *block; (khoái data) UINT4 *ks; (ñònh thì khoùa) Thöïc hieän maät maõ DES cho khoái data block vaø khoùa ks. 1.4.9. R_enhanc.c - Giôùi thieäu: RSATOOL söû duïng khaùi nieäm “digital envelope” cho vieäc xöû lyù data maõ hoùa. Ñaàu tieân data M ñöôïc maõ hoùa baèng khoùa bí maät (khoùa phieân lieân laïc ngaãu nhieân Ks), sau ñoù khoùa phieân lieân laïc ñöôïc maõ hoùa baèng khoùa coâng khai KU cuûa ñoái taùc tham döï. Digital envelope = EKs [M] + EKU [Ks] Vieäc môû digital envelope ñoøi hoûi söï giaûi maõ khoùa phieân lieân laïc baèng caùch söû duïng khoùa bí maät KR cuûa ñoái taùc, sau ñoù söû duïng khoùa phieân lieân laïc ñeå giaûi maõ ñoaïn tin: Ks = DKR [EKU [Ks]] M = DKs [EKs[M]] RSATOOL söû duïng giaûi thuaät maõ hoùa khoùa bí maät DES ôû mode CBC. - Maõ hoùa (sealing) data trong digital envelope: Thuû tuïc ñeå sealing data trong digital envelope nhö sau: Khôûi taïo ngöõ caûnh (context) envelope baèng caùch goïi haøm R_SealInit R_SealInit taïo khoùa phieân lieân laïc ngaãu nhieân vaø traû veà khoùa coâng khai ñaõ maõ hoùa khoùa phieân lieân laïc (baûn thaân khoùa phieân lieân laïc cuøng vôùi data trung gian khaùc ñöôïc löu tröõ trong context). Xöû lyù data nguoàn moãi khoái ôû moät thôøi ñieåm söû duïng R_SealUpdate. Ñoùng envelope söû duïng R_SealFinal vaø xoùa context maõ hoùa. - Môû (giaûi maõ) digital envelope: Khôûi taïo moät context envelope môùi söû duïng haøm R_OpenInit. Söï giaûi maõ khoùa phieân lieân laïc naøy söû duïng khoùa bí maät cuûa ñoái taùc vaø thieát laäp context saün saøng cho vieäc giaûi maõ ñoaïn tin chính. Xöû lyù data ñaõ hoùa moät khoái ôû moät thôøi ñieåm söû duïng R_OpenUpdate. Xöû lyù khoái data ñaõ maõ hoùa cuoái cuøng söû duïng R_OpenFinal vaø ñoàng thôøi cuõng xoùa baát kyø data theâm vaøo (padding data). - Caùc haøm: R_SealInit Int R_SealInit(context, encryptedKeys, encryptedKeyLens, iv, publicKeyCount, publicKeys, randomStruct) R_ENVELOPE_CFX *context; unsigned char **encryptedKeys; unsigned int *encryptedKeyLens; unsigned char iv[8]; unsigned int publicKeyCount; R_RSA_PUBLIC_KEY **publicKeys; R_RANDOM_STRUCT *randomStruct; Khôûi taïo moät taùc vuï sealing envelope. Context chæ tôùi moät caáu truùc R_ENVELOPE_CTX troáng ñaõ ñònh vò vaø randomstruct chæ tôùi moät caáu truùc R_RANDOM_STRUCT ñaõ khôûi taïo tröôùc. R_SealInit söû duïng caáu truùc random ñeå taïo khoùa phieân lieân laïc vaø vectô khôûi taïo cho giaûi thuaät maõ hoùa DES. Khoùa coâng khai cuûa ñoái taùc tham döï ñöôïc ñaët trong daõy publicKeys vôùi toång soá khoùa coâng khai ñöôïc chæ bôûi publicKeyCount (ít nhaát moät khoùa coâng khai phaûi ñöôïc cung caáp). Khoùa coâng khai khoâng hôïp leä seõ daãn ñeán keát quaû loãi RE_PUBLIC_KEY vaø khoâng coù khoùa theâm naøo seõ ñöôïc xöû lyù. Khi thaønh coâng traû veà 0, daõy encryptedKeys chöùa khoùa coâng khai ñaõ maõ hoùa khoùa phieân lieân laïc (cho moãi khoùa coâng khai ñöôïc cung caáp) vaø encryptedKeyLens chöùa chieàu daøi khoùa maõ hoùa töông öùng, iv chöùa vectô khôûi taïo cuûa DES. Neáu randomStruct khoâng ñöôïc khôûi taïo thì baùo loãi RE_NEED_RANDOM. R_SealUpdate Int R_SealUpdate(context, partOut, partOutLen, partIn, partInLen) R_ENVELOPE_CTX *context; Unsigned char *partOut; Unsigned int *partOutLen; Unsigned char *partInt; Unsigned int *partIntLen; Tieáp tuïc taùc vuï sealing, maõ hoùa khoái data söû duïng context ñaõ cung caáp (khôûi taïo thaønh coâng trong R_SealInit). Do vieâc theâm data padding, söï giaõn nôû coù theå xaûy ra vì theá partOut neân lôùn hôn partIn ít nhaát 8 byte. Luoân traû veà IDOK. R_SealFinal Int R_SealFinal(context, partOut, partOutLen) R_ENVELOPE_CTX *context; Unsigned char *partOut; Unsigned int *partOutLen; Cuoái cuøng cuûa taùc vuï sealing, laøm saïch boä ñeäm context vaø reset context. Khi thoaùt partOut chöùa soá byte partOutLen seõ ñöôïc noái tôùi data maõ hoùa (noäi dung cuûa boä ñeäm context). PartOutLen seõ khoâng lôùn hôn 8. Luoân traû veà IDOK. R_OpenInit Int R_OpenInit(context, encryptedKeys, encryptedKeyLens, iv, privateKey) R_ENVELOPE_CFX *context; unsigned char **encryptedKeys; unsigned int *encryptedKeyLens; unsigned char iv[8]; R_RSA_PUBLIC_KEY **privateKey; Khôûi taïo moät context envelope saün saøng cho taùc vuï môû evelope (giaûi maõ). Khoùa phieân lieân laïc ñaõ maõ hoùa ñöôïc giaûi maõ baèng khoùa bí maät privateKey vaø ñöôïc ñaët trong context. Sau ñoù context ñöôïc khôûi taïo vôùi vectô khôûi taïo (ñöôïc cung caáp ôû daïng roû trong evelope vaø ñöôïc truyeàn tôùi R_OpenInit nhö laø iv) saün saøng cho vieäc giaûi maõ. Khi thaønh coâng traû veà 0. Khi coù loãi, traû veà RE_LEN neáu khoùa encryptedKey quaù daøi (encryptedKeyLens > MAX_ENCRYPTED_KEY_LEN), hoaëc loãi RE_PRIVATE_KEY neáu khoùa bí maät laø khoâng hôïp leä. R_OpenUpdate Int R_OpenUpdate(context, partOut, partOutLen, partIn, partInLen) R_ENVELOPE_CTX *context; Unsigned char *partOut; Unsigned int *partOutLen; Unsigned char *partInt; Unsigned int *partIntLen; Tieáp tuïc taùc vuï môû, giaûi maõ khoái data söû duïng context ñaõ cung caáp (khôûi taïo thaønh coâng trong R_OpenInit). Do vieâc theâm data padding, söï giaõn nôû coù theå xaûy ra vì theá partOut neân lôùn hôn partIn ít nhaát 8 byte. Luoân traû veà IDOK. R_OpenFinal Int R_OpenFinal(context, partOut, partOutLen) R_ENVELOPE_CTX *context; Unsigned char *partOut; Unsigned int *partOutLen; Cuoái cuøng cuûa taùc vuï môû, laøm saïch boä ñeäm context vaø reset context. Khi thoaùt partOut chöùa soá byte partOutLen seõ ñöôïc noái tôùi data giaûi maõ (noäi dung cuûa boä ñeäm context). PartOutLen seõ khoâng lôùn hôn 8. Luoân traû veà IDOK. 1.5. Caùc taäp tin demo (*.c): 1.5.1. Rsagen.c - Ñaây laø chöông trình demo taïo caëp khoùa coâng khai RSA. Sau khi user nhaäp caùc thoâng tin veà baûn thaân (ví duï: teân, ñònh danh, ñòa chæ, passsword, chieàu daøi khoùa…) thì chöông trình seõ löu thoâng tin cuûa user vaøo thö muïc (default laø usrpass) vaø taïo caëp khoùa RSA: ñoái vôùi user môùi thì khoùa coâng khai ñöôïc caäp nhaät vaøo thö muïc khoùa coâng khai (default laø keypub), khoùa bí maät ñöôïc maõ hoùa baèng khoùa DES (password cuûa user) vaø ñöôïc löu vaøo file, coøn ñoái vôùi user cuõ thì tìm trong thö muïc xem ñaõ coù khoùa coâng khai ñoù chöa, neáu chöa coù thì caäp nhaät vaøo, ngöôïc laïi baùo cho user bieát laø trong thö muïc ñaõ toàn taïi khoùa coâng khai ñoù roài. - Caùc haøm chính duøng trong chöông trình: InitRandomStruct: khôûi taïo ñoái töôïng random cho haøm taïo khoùa. R_RandomCreate: taïo random cho haøm taïo khoùa. DoGenerateKeys: taïo caëp khoùa RSA. Des_EncodePri: maõ hoùa khoùa bí maät baèng khoùa DES (password cuûa user). WriteUserPass: löu teân, password cuûa user vaøo thö muïc (default = usrpass). WritePublicKey: löu teân, ñònh danh vaø khoùa coâng khai cuûa user vaøo thö muïc khoùa coâng khai (default = keypub). WritePrivateKey: löu teân, ñònh danh vaø khoùa bí maät cuûa user vaøo file (default = keypri). 1.5.2. PubDir.c - Ñaây laø chöông trình demo xem thö muïc khoùa coâng khai RSA. Sau khi user nhaäp caùc thoâng tin veà baûn thaân (ví duï: teân, ñònh danh, ñòa chæ, passsword, user môùi hay cuõ, chieàu daøi khoùa…), neáu laø user cuõ thì chöông trình seõ tìm trong thö muïc usrpass xem coù user naøy khoâng, neáu coù thì tieáp tuïc, ngöôïc laïi thì yeâu caàu user nhaäp laïi thoâng tin, coøn neáu laø user môùi thì caäp nhaät vaøo thö muïc usrpass vaø tieáp tuïc. Cuoái cuøng in ra danh saùch caùc khoùa coâng khai coù trong thö muïc khoùa coâng khai. - Caùc haøm chính duøng trong chöông trình: DoKeysDir: thö muïc khoùa coâng khai RSA. GetPublic: in khoùa coâng khai, duøng trong haøm DoKeysDir. Search_Usr: tìm user trong thö muïc usrpass duøng trong haøm DoKeysDir. WriteUserPass: ghi thoâng tin user môùi vaøo thö muïc usrpass. 1.5.3. PubFind.c - Ñaây laø chöông trình demo tìm khoùa coâng khai trong thö muïc khoùa coâng khai RSA. Sau khi user nhaäp caùc thoâng tin veà baûn thaân (ví duï: teân, ñònh danh, ñòa chæ, passsword, user môùi hay cuõ, chieàu daøi khoùa…), neáu laø user cuõ thì chöông trình seõ tìm trong thö muïc usrpass xem coù user naøy khoâng, neáu coù thì tieáp tuïc, ngöôïc laïi thì yeâu caàu user nhaäp laïi thoâng tin, coøn neáu laø user môùi thì caäp nhaät vaøo thö muïc usrpass vaø tieáp tuïc. Sau ñoù yeâu caàu user nhaäp vaøo user muoán tìm, neáu user naøy coù trong thö muïc khoùa coâng khai thì in ra khoùa coâng khai cuûa user naøy, ngöôïc laïi baùo “khoâng coù khoùa coâng khai naøy, nhaäp laïi thoâng tin caàn tìm”. - Caùc haøm chính duøng trong chöông trình: GetPublic: in khoùa coâng khai. Search_Usr: tìm user trong thö muïc usrpass. WriteUserPass: ghi thoâng tin user môùi vaøo thö muïc usrpass. Search_key: tìm khoùa coâng khai trong thö muïc khoùa coâng khai. Keát Luaän * Nhöõng coâng vieäc ñaõ thöïc hieän: 1. Trình baøy lyù thuyeát veà maät maõ hoùa thoâng tin: + Caùc giaûi thuaät DES, RSA, MD5. + Vaán ñeà quaûn lyù vaø phaân boá caùc khoùa. + Vaán ñeà baûo maät caùc khoùa. + Caùc tieâu chuaån PKCS, X.509. 2. Xaây döïng caùc chöông trình nguoàn vaø caùc chöông trình demo. + Chöông trình nguoàn: . Maät maõ RSA theo chuaån PKCS. . Maät maõ DES. . Giaûi thuaät baêm MD5. . Caùc chöông trình phuï trôï nhö taïo khoùa, kieåm tra soá nguyeân toá, .... + Chöông trình demo: . Taïo khoùa RSA cho user. . Xem thö muïc khoùa coâng khai. . Tìm khoùa coâng khai trong thö muïc khoùa coâng khai. * Nhöõng coâng vieäc caàn thöïc hieän tieáp: 1. Hoaøn chænh trang Web server. 2. Ñeå taêng tính baûo maät thì khoùa duøng chung giöõa server vaø user khoâng laø password cuûa user maø laø khoùa chuû cuûa user (KMT). Khoùa naøy ôû server ñöôïc maõ hoùa baèng khoùa bí maät cuûa server, khi coù nhu caàu söû duïng, server seõ giaûi maõ khoùa naøy baèng khoùa bí maät cuûa mình. 3. Xaây döïng theâm caùc chöông trình demo nhö huûy boû khoùa coâng khai trong thö muïc khoùa coâng khai, chöõ kyù soá,.... Taøi Lieäu Tham Khaûo [1] Ph.D William Stallings. “Network and Internetwork Security Principles and Practice“. PRENTICE HALL - 1995. [2] Douglas R. stinson. “Cryptography_ Theory and Practice”. CRC Press - 1995. [3] Man Young Rhee, Hanyang University. “ Cryptography and Secure Communications “. McGRAW – HILL BOOK CO. - 1994. [4] Netscape Navigator, IavaScript Guide – 1996. [5] Iohn J.Valley, QUE, 1991. “UNIX Programming’s Reference”. [6] Turbo C. [7] Caùc ñòa chæ treân Internet: Muïc Luïc Lôøi noùi ñaàu Phaàn I: Lyù thuyeát Chöông 1: Caùc heä maät maõ 1. Heä maät maõ ñoái xöùng trang 1 Giôùi thieäu Giaûi thuaät DES 2. Heä maät maõ baát ñoái xöùng trang 10 Giôùi thieäu trang 10 Lyù thuyeát veà maät maõ khoùa coâng khai trang 10 ÖÙng duïng cuûa maät maõ khoùa coâng khai trang 15 Caùc yeâu caàu cuûa maät maõ khoùa coâng khai trang 15 Giaûi thuaät RSA 2.5.1. Moâ taû giaûi thuaät trang 16 2.5.2. Tính baûo maät cuûa giaûi thuaät RSA trang 19 2.5.2.1. Phöông phaùp p-1 2.5.2.2. Beû khoùa khi bieát soá muõ d cuûa haøm giaûi maõ 2.5.2.3. Pgöông phaùp laëp laïi 2.5.3. Sö ïche daáu thoâng tin trong heä thoáng RSA trang 22 2.5.4. Caùc giaûi thuaät toaùn hoïc ñöôïc söû duïng trong RSA trang 22 3. Giaûi thuaät baêm MD5 trang 24 Chöông 2: Phaân boá vaø quaûn lyù khoùa 1. Toång quan veà maõ hoùa vaø moät soá khaùi nieäm trang 30 2. Phaân phoái caùc khoùa bí maät trang 34 2.1. Söï tieàn phaân boá khoùa 2.1.1. Sô ñoà cuûa Blom trang 34 2.1.2. Diffie_Hellman trang 36 2.2. Heä phaân boá khoùa Kerberos trang 38 2.3. Trao ñoåi khoùa Diffie_Hellman trang 39 2.3.1. Giao thöùc station_station trang 40 2.3.2. Giao thöùc ñoàng yù khoùa MTI trang 42 2.3.3. Söï ñoàng yù khoùa söû duïng chöùng thöïc baûn thaân trang 43 2.4. Phaân boá khoùa coâng khai trang 46 3. Quaûn lyù khoùa 3.1. Quaûn lyù caùc khoùa coâng khai trang 46 3.2. Quaûn lyù caùc khoùa bí maät trang 46 3.2.1. Baûo veä caùc khoùa “master key” trang 48 3.2.2. Baûo veä caùc khoùa chính trang 49 3.3. Caùc taùc vuï baûo maät cuûa heä thoáng chuû 3.3.1. Baûo maät lieân laïc ñôn vuøng duøng caùc khoùa chính ñaõ ñöôïc taïo tröôùc trang 49 3.3.2. Baûo maät lieân laïc ñôn vuøng duøng caùc khoùa chính ñaõ ñöôïc taïo moät caùch ñoäng trang 50 3.3.3. Baûo maät lieân laïc ñôn vuøng vaø baûo maät taäp tin duøng caùc khoùa chính ñaõ ñöôïc taïo tröôùc trang 50 Chöông 3: Caùc tieâu chuaån 3.1. Tieâu chuaån heä maät maõ khoùa coâng khai trang 52 3.2. Tieâu chuaån chöùng thöïc khoùa coâng khai X.509 trang 55 3.2.1. Söï chöùng thöïc trang 56 3.2.2. Ñöa ra chöùng thöïc cuûa user trang 58 3.2.3. Huûy boû söï chöùng thöïc trang 60 3.2.4. Caùc thuû tuïc chöùng thöïc trang 60 Phaàn II: Chöông trình Chöông1: Thuyeát minh chöông trình 1.1. Giôùi thieäu trang 62 1.2. Caùc haèng trang 65 1.3. Caùc taäp tin ñaàu trang 66 1.4. Caùc taäp tin nguoàn trang 69 Chöông 2: Chöông trình nguoàn trang 88 Keát luaän Taøi lieäu tham khaûo

Các file đính kèm theo tài liệu này:

  • dockey.doc
  • rarBao mat du lieu.rar
  • pdfkey.pdf