TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN MẠNG VÀ TRUYỀN THÔNG
ĐỒ ÁN LẬP TRÌNH MẠNG
NGÀNH CÔNG NGHỆ THÔNG TIN
ĐỀ TÀI :
XÂY DỰNG ỨNG DỤNG MÃ HÓA MD5 & 3DES
TRAO ĐỔI THÔNG TIN TRÊN MẠNG
Sinh viên : Trần Văn Huynh
: Trần Văn Nghĩa
Lớp : 11TLT.CNTT
Cán bộ hướng dẫn : ThS. Mai Văn Hà
Đà Nẵng 03/2013
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
Đề cương chi tiết
I.1. Mục tiêu của đề tài 4
I.2. Hướng giải quyết 4
I.3. Triển khai 4
CHƯƠNG II. CƠ SỞ LÝ THUYẾT 4
I Khái niệm về mã hóa và giải mã 5
I.1. Giới thiệu 5
I.2. Các nguyên lý cơ bản của quá trình bảo mật và mã hóa 5
I.3. Khái niệm về chìa khoá 6
I.4. Thuật toán mã hóa 6
I.5. Hàm hash 7
II. Tổng quan về lập trình mạng 8
II.1. Mô hình Client-Server 8
II.1.1. Dựa vào chức năng có thể chia thành các loại server như sau 9
II.1.2. Ưu điểm và nhược điểm của mô hình Client-Server 9
II.2. Kiến trúc mô hình Client-Server 10
II.2.1. Các chế độ giao tiếp 10
II.3. Socket 11
II.3.1. Khái niệm Sockets 11
II.3.2. Phân loại Sockets 12
II.4. Giao Thức TCP 12
II.4.1. Đặc điểm của giao thức TCP( có kết nối) 12
II.4.2. Hoạt động của giao thức TCP 13
II.4.3. Thiết lập kết nối 13
II.4.4. Truyền dữ liệu 13
II.4.5. Kết thúc kết nối 14
II.4.6. Cấu trúc gói tin TCP 14
III. Thuật toán mã hóa MD5 15
III.1. Giới thiệu 15
III.2. Mô tả thuật toán MD5 16
III.3. Các bước mã hóa thông điệp 18
III.4. Ứng dụng của MD5 Trong thực tế 19
III.5. Tổng kết 19
IV. Thuật toán mã hóa 3DES 19
IV.1. Giới thiệu 19
VI.2. Các mẫu hoạt động của 3DES 20
VI.3. Ưu và nhược điểm của 3DES 20
VI.4. Ứng dụng của thuật toán DES trong thực tế 20
CHƯƠNG III. XÂY DỰNG CHƯƠNG TRÌNH 20
CHƯƠNG IV. KẾT QUẢ 21
CHƯƠNG V. KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
21
CHƯƠNG I TỔNG QUAN VỀ ĐỀ TÀI
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 3
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
I.1. Mục tiêu của đề tài
- Xây dựng được một chương trình mã hóa MD5 và 3DES
- Tìm hiểu về bảo mật trong java.
- Tìm hiểu các hàm băm.
- Tìm hiểu gói java lập trình mạng.
I.2. Hướng giải quyết
- Tìm hiểu cơ chế hoạt động của thuật toán MD5 và 3DES
- Xây dựng chương trình bằng ngôn ngữ java
- Cài đặt các công cụ cần thiết hỗ trợ chương trình.
- Từ đó tìm ra hướng giải quyết và viết chương trình mô phỏng cho bài toán.
I.3. Triển khai
Chương trình mô phỏng mã hóa và giả mã hai thuật toán MD5 và 3DES trong mô hình
Client – Server.
CHƯƠNG II. CƠ SỞ LÝ THUYẾT
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 4
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
I Khái niệm về mã hóa và giải mã
I.1. Giới thiệu
Mật mã và bảo mật trong hệ thống viễn thông là một lĩnh vực có nhiều thuật ngữ có thể
làm cho nhiều người "ngơ ngác": như "hash function", "one-time pad" hay Rijndael Thread
này nhằm giải thích các khái niệm thường dùng trong ngành mật mã học (cryptography) với
hy vọng có thể giúp ích cho những ai mong muốn tìm hiểu về lĩnh vực này.
Trước tiên mật mã học (crypto) là một nghệ thuật nhằm giấu thông tin, bằng cách chuyển
đổi (encrypt) thông tin thành dạng thông tin không đọc được (cipher text). Chỉ có những
người giữ chìa khóa (key) bí mật mới có thể giải mã (decrypt) thông tin thành dạng thông tin
có thể hiểu được (plain text). Thông tin đôi khi bị giải mã mà không cần biết khóa bí mật.
Ngành học nghiên cứu về việc bẻ khóa (attack/crack/hack) này còn gọi là cryptanalysis.
Hình 1:Sơ đồ mã hóa và giải mã.
I.2. Các nguyên lý cơ bản của quá trình bảo mật và mã hóa
Tính bí mật (confidentiality/privacy): tính chất này đảm bảo thông tin chỉ được
hiểu bởi những ai biết chìa khóa bí mật.
Tính toàn vẹn (integrity): tính chất này đảm bảo thông tin không thể bị thay đổi
mà không bị phát hiện. Tính chất này không đảm bảo thông tin không bị thay đổi,
nhưng một khi nó bị nghe lén hoặc thay đổi thì người nhận được thông tin có thể
biết được là thông tin đã bị nghe lén hoặc thay đổi. Các hàm một chiều (one-way
function) như MD5, SHA-1, MAC được dùng để đảm bảo tính toàn vẹn cho
thông tin.
Tính xác thực (authentication): người gửi (hoặc người nhận) có thể chứng minh
đúng . Người ta có thể dụng một password, một challenge dựa trên một thuật
toán mã hóa hoặc một bí mật chia sẻ giữa hai người để xác thực. Sự xác thực này
có thể thực hiện một chiều (one-way) hoặc hai chiều (multual authentication).
Tính không chối bỏ (non-repudiation): người gửi hoặc nhận sau này không thể
chối bỏ việc đã gửi hoặc nhận thông tin. Thông thường điều này được thực hiện
thông qua một chữ ký điện tử (electronic signature).
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 5
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
Tính nhận dạng (identification): người dùng của một hệ thống, một tài nguyên
sở hữu một chứng minh thư (identity) như là một chìa khóa ban đầu (primary
key). identity này sẽ xác định những chức năng của người dùng, giới hạn cho
phép của người dùng cũng như các thuộc tính liên quan (thường gọi chung là
credential). Identity có thể là login, dấu vân tay, ADN, giản đồ võng mạc mắt,
âm thanh
I.3. Khái niệm về chìa khoá
Password: mật khẩu, là một hay nhiều từ mà người dùng phải biết để được cấp
quyền truy cập. Trong thực tế, mật khẩu do người dùng tạo ra thường không đủ độ
an toàn để được dùng trực tiếp trong thuật toán. Vì vậy, trong bất cứ hệ thống mã
hóa dữ liệu nghiêm túc nào cũng phải có bước chuyển đổi mật khẩu ban đầu thành
chìa khóa có độ an toàn thích hợp. Bước tạo chìa khóa này thường được gọi là key
derivation, key stretching hay key initialization.
Key Derivation Function: là một hàm hash (sẽ giải thích rõ hơn ở phần sau) được
thiết kế sao cho chìa an toàn hơn đối với tấn công kiểu brute-force hay cổ điển.
Hàm này được thực hiện lại nhiều lần trên mật khẩu ban đầu cùng với một số
ngẫu nhiên để tạo ra một chìa khóa có độ an toàn cao hơn. Số ngẫu nhiên này gọi
là salt, còn số lần lặp lại là iteration.
Keylength (Keysize): Độ dài (hay độ lớn) của chìa khóa. Nói một chìa khóa có độ
dài 128 bit có nghĩa chìa đó là một số nhị phân có độ dài 128 chữ số. Một thuật
toán có chìa khóa càng dài thì càng có nhiều khả năng chống lại tấn công kiểu
brute-force.
Brute-force attack: (exhaustive key search): phương pháp tấn công bằng cách thử
tất cả những chìa khóa có thể có. Đây là phương pháp tấn công thô sơ nhất và
cũng khó khăn nhất. Theo lý thuyết, tất cả các thuật toán hiện đại đều có thể bị
đánh bại bởi brute-force nhưng trong thực tiễn việc này chỉ có thể thực hiện được
trong thời gian dài. Vì thế có thể coi một thuật toán là an toàn nếu như không còn
cách nào khác để tấn công nó dễ hơn là brute-force. Ngoài ra để chống lại tấn
công này, chìa khóa bị mật được thay đổi một cách thường xuyên hơn.
I.4. Thuật toán mã hóa
Cổ điển(cái này ngày nay vẫn hay dùng trong trò chơi tìm mật thư).
• Substitution (thay thế): phương pháp mã hóa trong đó từng kí tự (hoặc từng
nhóm kí tự) của văn bản ban đầu được thay thế bằng một (hay một nhóm) kí
tự khác. Tuy không còn được sử dụng nhưng ý tưởng của phương pháp này
vẫn được tiếp tục trong những thuật toán hiện đại
• Transposition (hoán vị): phương pháp mã hóa trong đó các kí tự trong văn bản
ban đầu chỉ thay đổi vị trí cho nhau còn bản thân các kí tự không hề bị biến
đổi.
Hiện đại
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 6
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
• Symmetric cryptography (mã hóa đối xứng): Tức là cả hai quá trình mã hóa và
giải mã đều dùng một chìa khóa. Để đảm bảo tính an toàn, chìa khóa này phải
được giữ bí mật. Vì thế các thuật toán loại này còn có tên gọi khác là secret
key cryptography (hay private key cryptography), tức là thuật toán mã hóa
dùng chìa khóa riêng (hay bí mật). Các thuật toán loại này lý tưởng cho mục
đích mã hóa dữ liệu của cá nhân hay tổ chức đơn lẻ nhưng bộc lộ hạn chế khi
thông tin đó phải được chia sẻ với một bên thứ hai.
• Block ciphers (thuật toán khối): Trong đó từng khối dữ liệu trong văn bản ban
đầu được thay thế bằng một khối dữ liệu khác có cùng độ dài. Độ dài mỗi khối
gọi là block size, thường được tính bằng đơn vị bit. Ví dụ thuật toán 3-Way có
kích thước khối bằng 96 bit. Một số thuật toán khối thông dụng là: DES,
3DES, RC5, RC6, 3-Way, CAST, Camelia, Blowfish, MARS, Serpent,
Twofish, GOST
Stream ciphers (thuật toán dòng): trong đó dữ liệu đầu vào được mã hóa từng bit
một. Các thuật toán dòng có tốc độ nhanh hơn các thuật toán khối, được dùng khi
khối lượng dữ liệu cần mã hóa chưa được biết trước, ví dụ trong kết nối không
dây. Có thể coi thuật toán dòng là thuật toán khối với kích thước mỗi khối là 1 bit.
Một số thuật toán dòng thông dụng: RC4, A5/1, A5/2, Chameleon.
Mã hóa bất đối xứng(Asymmetric cryptography)
• Sử dụng một cặp chìa khóa có liên quan với nhau về mặt toán học, một chìa
công khai dùng để mã hoá (public key) và một chìa bí mật dùng để giải mã
(private key). Một thông điệp sau khi được mã hóa bởi chìa công khai sẽ chỉ
có thể được giải mã với chìa bí mật tương ứng. Do các thuật toán loại này sử
dụng một chìa khóa công khai (không bí mật) nên còn có tên gọi khác là
public-key cryptography (thuật toán mã hóa dùng chìa khóa công khai). Một số
thuật toán bất đối xứng thông dụng là : RSA, Elliptic Curve, ElGamal, Diffie
Hellman
• Một trong những hạn chế của các thuật toán mã hóa bất đối xứng là tốc độ
chậm, do đó trong thực tế người ta thường sử dụng một hệ thống lai tạp trong
đó dữ liệu được mã hóa bởi một thuật toán đối xứng, chỉ có chìa dùng để thực
hiện việc mã hóa này mới được mã hóa bằng thuật toán bất đối xứng. Hay nói
một cách khác là người ta dùng thuật toán bất đối xứng để chia sẻ chìa khóa bí
mật rồi sau đó dùng thuật toán đối xứng với chìa khóa bí mật trên để truyền
thông tin.
I.5. Hàm hash
Hàm hash (hash function): là hàm một chiều mà nếu đưa một lượng dữ liệu bất kì
qua hàm này sẽ cho ra một chuỗi có độ dài cố định ở đầu ra.
Hai tính chất quan trọng của hàm này là:
• Tính một chiều: không thể suy ra dữ liệu ban đầu từ kết quả, điều này tương
tự như việc bạn không thể chỉ dựa vào một dấu vân tay lạ mà suy ra ai là chủ
của nó được.
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 7
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
• Tính duy nhất: xác suất để có một vụ va chạm (hash collision), tức là hai
thông điệp khác nhau có cùng một kết quả hash, là cực kì nhỏ.
Một số ứng dụng của hàm hash:
• Chống và phát hiện xâm nhập: chương trình chống xâm nhập so sánh giá trị
hash của một file với giá trị trước đó để kiểm tra xem file đó có bị ai đó thay
đổi hay không.
• Bảo vệ tính toàn vẹn của thông điệp được gửi qua mạng: Bằng cách kiểm tra
giá trị hash của thông điệp trước và sau khi gửi nhằm phát hiện những thay đổi
cho dù là nhỏ nhất.
• Tạo chìa khóa từ mật khẩu.
• Tạo chữ kí điện tử.
II. Tổng quan về lập trình mạng
II.1. Mô hình Client-Server
Client-server là mô hình mạng trên đó có các máy chủ (server) và máy khách (client) giao
tiếp với nhau theo 1 hoặc nhiều dịch vụ. Ý tưởng của mô hình này là máy con (đóng vài trò
là máy khách) gửi một yêu cầu (request) để máy chủ (đóng vai trò người cung ứng dịch vụ),
máy chủ sẽ xử lý và trả kết quả về cho máy khách.
Hình 2: Mô hình client – server
Trong mô hình mạng khách-chủ có một hệ thống máy tính cung cấp các tài nguyên và
dịch vụ cho cả hệ thống mạng sử dụng gọi là các máy chủ (server). Một hệ thống máy tính
sử dụng các tài nguyên và dịch vụ này được gọi là máy khách (client). Chương trình server
và client nói chuyện với nhau bằng các thông điệp (messages) thông qua một cổng truyền
thông liên tác IPC (Interprocess Communication). Thực tế trong các ứng dụng của mô hình
client/server, các chức năng hoạt động chính là sự kết hợp giữa client và server với sự chia
sẻ tài nguyên, dữ liệu trên cả 2 máy Vai trò của client Trong mô hình client/server, client
được coi như là người sử dụng các dịch vụ trên mạng do một hoặc nhiều máy chủ cung cấp
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 8
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
và server được coi như là người cung cấp dịch vụ để trả lời các yêu cầu của các clients. Điều
quan trọng là phải hiểu được vai trò hoạt động của nó trong một mô hình cụ thể, một máy
client trong mô hình này lại có thể là server trong một mô hình khác. Máy client có thể sử
dụng các hệ điều hành bình thường như Win9x, DOS, OS/2 Các server thường có cấu
hình mạnh (tốc độ xử lý nhanh, kích thước lưu trữ lớn) hoặc là các máy chuyên dụng nên nó
hoạt động sẽ tốt hơn nếu hệ điều hành của nó là đa nhiệm với các tính năng hoạt động độc
lập song song với nhau như hệ điều hành UNIX, WINDOWS
II.1.1. Dựa vào chức năng có thể chia thành các loại server như sau
File Server: phục vụ các yêu cầu hệ thống tập tin trong mạng.
Print Server: phục vụ các yêu cầu in ấn trong mạng.
Application Server: cho phép các ứng dụng chạy trên các server và trả về kết quả
cho client.
Mail Server: cung cấp các dịch vụ về gởi nhận e-mail.
Web Server: cung cấp các dịch vụ về web.
Database Server: cung cấp các dịch vụ về lưu trữ, tìm kiếm thông tin.
Communication Server: quản lý các kết nối từ xa.
II.1.2. Ưu điểm và nhược điểm của mô hình Client-Server
Ưu điểm :
• Với mô hình client-server thì mọi thứ dường như đều nằm trên bàn của người
sử dụng, nó có thể truy cập dữ liệu từ xa (bao gồm các công việc như gửi và
nhận file, tìm kiếm thông tin, ) với nhiều dịch vụ đa dạng mà mô hình cũ
không thể làm được.
• Có nhiều loại server như Mail Server, File Server, Web Server nên dữ liệu
được phân tán rõ ràng và dễ quản lý hơn.
• Dữ liệu được lưu trữ tập trung nên dễ dàng bổ sung hoặc nâng cấp server.
• Tất cả các dữ liệu đều nằm trên máy chủ nên việc bảo mật được tốt hơn (máy
chủ thường được bảo mật tốt hơn máy khách). Máy chủ có thể kiểm soát truy
cập tài nguyên để đảm bảo rằng chỉ những máy khách được cho phép mới có
quyền truy cập và thay đổi dữ liệu.
• Mô hình client/server cung cấp một nền tảng lý tưởng cho phép tích hợp các
kỹ thuật hiện đại như mô hình thiết kế hướng đối tượng, hệ chuyên gia, hệ
thông tin địa lý (GIS)
• Nhược điểm :
• Client-Server không phải là mô hình dữ liệu dùng chung nên các hệ thống con
có thể sử dụng các tổ chức dữ liệu khác nhau. Do đó, việc trao đổi dữ liệu có
thể không hiệu quả.
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 9
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
• Các server chuyên dụng rất đắt tiền, và dữ liệu tập trung trên máy chủ nên cần
được bảo mật, do đó: phải có nhà quản trị cho hệ thống.
• Một khi số lượng các máy khách truy cập đồng thời quá nhiều, máy chủ có thể
trở nên quá tải ảnh hưởng đến việc truy cập dữ liệu.
• Do phải trao đổi dữ liệu giữa 2 máy ở 2 khu vực khác nhau cho nên dễ dàng
xảy ra hiện tượng thông tin truyền trên mạng bị lộ.
II.2. Kiến trúc mô hình Client-Server
Client/Server là mô hình tổng quát nhất, trên thực tế thì một server có thể được nối tới
nhiều server khác nhằm làm việc hiệu quả và nhanh hơn. Đầu tiên, client sẽ gởi một thông
điệp yêu cầu (Request Message) mô tả về công việc muốn server thực hiện. Khi nhận được 1
yêu cầu từ client, server tiến hành phân tích để xác định công việc cần phải thực thi. Nếu
việc thực hiện yêu cầu này có sinh ra kết quả trả về, server sẽ gởi nó cho client trong một
thông điệp trả lời (Reply Message). Nếu không được thì server này có thể gửi tiếp yêu cầu
vừa nhận được cho server khác để xử lý rồi trả kêt quả về cho client. Dạng thức (format) và
ý nghĩa của các thông điệp trao đổi giữa client và server được qui định rõ bởi giao thức
(protocol) của ứng dụng.
II.2.1.
Các chế
độ giao tiếp
Quá trình giao tiếp giữa
client và server có thể
diễn ra theo hai chế độ là
nghẽn (blocked)
hay không nghẽn (Non
blocked).
Chế độ
nghẽn:
Trong chế độ
này, khi quá
trình client
hay server
phát ra lệnh
gởi dữ liệu,
(thông thường bằng lệnh send) , sự thực thi của nó sẽ bị tạm dừng cho đến khi quá
trình nhận phát ra lệnh nhận số dữ liệu đó (thường là lệnh receive).
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 10
Hình 3:quá trình yêu cầu và trả lời thông điệp
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
Hình 4: Chế độ ngẽn.
Tương tự cho trường hợp nhận dữ liệu, nếu quá trình nào đó, client hay server, phát ra
lệnh nhận dữ liệu, mà ở thời điểm đó chưa có dữ liệu gởi đến, sự thực thi của nó cũng tạm
dừng cho đến khi có dữ liệu gởi đến.
Chế độ không nghẽn
Hình 5: Chế độ không ngẽn.
II.3. Socket
II.3.1. Khái niệm Sockets
Socket là một giao diện lập trình ứng dụng (API) mạng, thông qua giao diện này
chúng ta có thể lập trình điều khiển việc truyền thông giữa hai máy sử dụng các
giao thức mức thấp là TCP, UDP…
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 11
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
Socket là sự trừu tượng hoá ở mức cao, có thể tưởng tượng nó như là thiết bị
truyền thông hai chiều gửi – nhận dữ liệu giữa hai máy tính với nhau.
II.3.2. Phân loại Sockets
Stream socket: Sử dụng giao thức TCP có thiết lập kết nối giữa hai máy trước khi
trao đổi dữ liệu. Stream socket cung cấp cơ chế trao đổi dữ liệu theo 2 chiều, bảo
đảm tính tin cậy, có thứ tự, không lặp.
Datagram socket: Sử dụng với giao thức UDP, không thiết lập kết nối giữa 2
máy trước khi trao đổi dữ liệu. Việc định vị Server và client thông qua điạ chỉ
đích trong gói tin.
Raw socket: Cung cấp sự truy xuất vào các giao thức giao tiếp nền có hỗ trợ
socket. Raw socket chỉ dành cho người muốn phát triển các giao tiếp giao
thức mới hoặc muốn truy xuất sâu vào các tiện ích bí mật của giao thức đó.
Hình 6: Các loại Socket.
II.4. Giao Thức TCP
II.4.1. Đặc điểm của giao thức TCP( có kết nối)
Có 1 đường kết nối ảo giữa 2 tiến trình
Một trong 2 tiến trình phải đợi tiến trình kia yêu cầu kết nối.
Có thể sử dụng để liên lạc theo mô hình Client/Server
Trong mô hình Client/Server thì Server lắng nghe và chấp nhận một yêu cầu kết
nối
Mỗi thông điệp gửi đều có xác nhận trở về
Các gói tin chuyển đi tuần tự
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 12
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
II.4.2. Hoạt động của giao thức TCP
TCP đòi hỏi thiết lập kết nối trước khi bắt đầu gửi dữ liệu và kết thúc kết nối khi việc gửi
dữ liệu hoàn tất. Cụ thể, các kết nối TCP có ba pha:
Thiết lập kết nối
Truyền dữ liệu
Kết thúc kết nối
II.4.3. Thiết lập kết nối
Để thiết lập một kết nối, TCP sử dụng một quy trình bắt tay 3 bước (3-way handshake)
Trước khi client thử kết nối với một server, server phải đăng ký một cổng và mở cổng đó
cho các kết nối, đây được gọi là mở bị động. Một khi mở bị động đã được thiết lập thì một
client có thể bắt đầu mở chủ động. Để thiết lập một kết nối, quy trình bắt tay 3 bước xảy ra
như sau:
Client yêu cầu mở cổng dịch vụ bằng cách gửi gói tin SYN (gói tin TCP) tới
server, trong gói tin này, tham số sequence number được gán cho một giá trị ngẫu
nhiên X.
Client yêu cầu mở cổng dịch vụ bằng cách gửi gói tin SYN (gói tin TCP) tới
server, trong gói tin này, tham số sequence number được gán cho một giá trị ngẫu
nhiên X.
Server hồi đáp bằng cách gửi lại phía client bản tin SYN-ACK, trong gói tin này,
tham số acknowledgment number được gán giá trị bằng X + 1, tham số sequence
number được gán ngẫu nhiên một giá trị Y.
Để hoàn tất quá trình bắt tay ba bước, client tiếp tục gửi tới server bản tin ACK,
trong bản tin này, tham số sequence number được gán cho giá trị bằng X + 1 còn
tham số acknowledgment number được gán giá trị bằng Y + 1
Tại thời điểm này, cả client và server đều được xác nhận rằng, một kết nối đã được thiết
lập.
II.4.4. Truyền dữ liệu
Một số đặc điểm cơ bản về truyền dữ liệu của TCP để phân biệt với UDP:
Truyền dữ liệu không lỗi (do có cơ chế sửa lỗi/truyền lại)
Truyền các gói dữ liệu theo đúng thứ tự
Truyền lại các gói dữ liệu mất trên đường truyền
Loại bỏ các gói dữ liệu trùng lặp
Cơ chế hạn chế tắc nghẽn đường truyền
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 13
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
Ở hai bước đầu tiên trong ba bước bắt tay, hai máy tính trao đổi một số thứ tự gói ban
đầu (Initial Sequence Number -ISN). Số này có thể chọn một cách ngẫu nhiên. Số thứ tự này
được dùng để đánh dấu các khối dữ liệu gửi từ mỗi máy tính. Sau mỗi byte được truyền đi,
số này lại được tăng lên. Nhờ vậy ta có thể sắp xếp lại chúng khi tới máy tính kia bất kể các
gói tới nơi theo thứ tự thế nào.
Trên lý thuyết, mỗi byte gửi đi đều có một số thứ tự và khi nhận được thì máy tính nhận
gửi lại tin báo nhận (ACK). Trong thực tế thì chỉ có byte dữ liệu đầu tiên được gán số thứ tự
trong trường số thứ tự của gói tin và bên nhận sẽ gửi tin báo nhận bằng cách gửi số thứ tự
của byte đang chờ.
II.4.5. Kết thúc kết nối
Để kết thúc kết nối hai bên sử dụng quá trình bắt tay 4 bước và chiều của kết nối kết thúc
độc lập với nhau. Khi một bên muốn kết thúc, nó gửi đi một gói tin FIN và bên kia gửi lại
tin báo nhận ACK. Vì vậy, một quá trình kết thúc tiêu biểu sẽ có 2 cặp gói tin trao đổi. Một
kết nối có thể tồn tại ở dạng "nửa mở": một bên đã kết thúc gửi dữ liệu nên chỉ nhận thông
tin, bên kia vẫn tiếp tục gửi.
II.4.6. Cấu trúc gói tin TCP
Một gói tin TCP bao gồm 2 phần:
header
dữ liệu
Phần header có 11 trường trong đó 10 trường bắt buộc. Trường thứ 11 là tùy chọn (trong
bảng)có tên là: options.
Hình 7: Cấu trúc gói tin TCP
Source port : Số hiệu của cổng tại máy tính gửi.
Destination port : Số hiệu của cổng tại máy tính nhận.
Sequence number :Trường này có 2 nhiệm vụ. Nếu cờ SYN bật thì nó là số thứ
tự gói ban đầu và byte đầu tiên được gửi có số thứ tự này cộng thêm 1. Nếu
không có cờ SYN thì đây là số thứ tự của byte đầu tiên.
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 14
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
Acknowledgement number: Nếu cờ ACK bật thì giá trị của trường chính là số
thứ tự gói tin tiếp theo mà bên nhận cần.
Data offset : Trường có độ dài 4 bít qui định độ dài của phần header (tính theo
đơn vị từ 32 bít). Phần header có độ dài tối thiểu là 5 từ (160 bit) và tối đa là
15 từ (480 bít).
Reserved : Dành cho tương lai và có giá trị là 0.
Flags (hay Control bits) Bao gồm 6 cờ:
• URG Cờ cho trường Urgent pointer
• ACK Cờ cho trường Acknowledgement
• PSH Hàm Push
• RST Thiết lập lại đường truyền
• SYN Đồng bộ lại số thứ tự
• FIN Không gửi thêm số liệu
Window : Số byte có thể nhận bắt đầu từ giá trị của trường báo nhận (ACK)
Checksum 16 bít kiểm tra cho cả phần header và dữ liệu. Phương pháp sử
dụng được mô tả trong RFC 793: 16 bít của trường kiểm tra là bổ sung của
tổng tất cả các từ 16 bít trong gói tin. Trong trường hợp số octet (khối 8 bít)
của header và dữ liệu là lẻ thì octet cuối được bổ sung với các bít 0. Các bít
này không được truyền. Khi tính tổng, giá trị của trường kiểm tra được thay
thế bằng 0, Nói một cách khác, tất cả các từ 16 bít được cộng với nhau. Kết
quả thu được sau khi đảo giá trị từng bít được điền vào trường kiểm tra. Về
mặt thuật toán, quá trình này giống với IPv4.
Dữ liệu : Trường cuối cùng không thuộc về header. Giá trị của trường này là
thông tin dành cho các tầng trên (trong mô hình 7 lớp OSI). Thông tin về giao
thức của tầng trên không được chỉ rõ trong phần header mà phụ thuộc vào
cổng được chọn.
III. Thuật toán mã hóa MD5
III.1. Giới thiệu
Thuật toán nhận vào 1 thông điệp độ dài tùy ý và tạo ra một số 128 bit, là một dạng “vân
tay “ hay “mã số thông điệp” ( message digest ) của đầu vào. Người ta cho rằng sẽ không
khả thi về mặt tính toán để tạo ra 2 thông điệp có cùng mã số thông điệp, hoặc tạo ra một
thông điệp với mã số cho trước.Thuật toán MD5 được dự tính áp dụng cho những ứng dụng
chữ ký điện tử, ở đó một file lớn phải được “nén“ một cách an toàn trước khi mã hóa với
một khóa cá nhân ( private key ) dưới một hệ mã hóa công khai như RSA. Thuật toán MD5
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 15
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
được thiết kế để chạy tương đối nhanh trên các máy 32 bit, có thể được thực hiện một cách
khá gọn. Thuật toán MD5 là sự mở rộng của thuật toán MD4. MD5 chậm hơn một chút so
với MD4 nhưng an toàn hơn. MD5 được thiết kế vì người ta cảm thấy có thể MD4 đã được
chấp nhận trong sử dụng quá nhanh so với sự đánh giá nó. MD4 được thiết kế để chạy rất
nhanh, nó đã “nằm trên ranh giới“ theo cách nói về nguy cơ của sự thành công trong việc
phá mã. MD5 đã lùi lại một chút, từ bỏ một chút tốc độ cho sự bảo mật. Nó kết hợp một số
ý kiến góp ý của các chuyên gia, thuật toán MD5 hiện đang được đánh giá và có thể được
chấp nhận như một chuẩn.
Hình 8: Xử lý MD5
III.2. Mô tả thuật toán MD5
Giả sử chúng ta có thông điệp b bit ở đầu vào, và ta muốn tìm mã số của thông điệp. Ở
đây b là số không âm bất kỳ, b có thể bằng 0 và không cần chia hết cho 8, độ lớn có thể bất
kỳ. Tưởng tượng rằng các bit của thông điệp được viết như sau :
m_0 m_1 m_2 … m_{b-1} Đầu vào là những khối 512 bit, được chia cho 16 khối con 32
bit. Đầu ra của thuật toán là một thiết lập của 4 khối 32 bit để tạo thành một hàm Băm 128
bit duy nhất.
Đầu tiên, ta chia bức điện thành các khối 512 bit, với khối cuối cùng (đặt là x và x <
512bit) của bức điện, chúng ta cộng thêm một bit 1 vào cuối của x, theo sau đó là các bit 0
để được độ dài cần thiết (512 bit). Kết quả là bức điện vào là một chuỗi M có độ dài chia hết
cho 512, vì vậy ta có thể chia M ra thành các N khối con 32 bit (N khối này sẽ chia hết cho
16).
Bây giờ, ta bắt đầu tìm cốt của bức điện với 4 khối 32 bit A, B, C và D (được xem như
thanh ghi) :
A = 0x01234567
B = 0x89abcdef
C = 0xfedcba98
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 16
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
D = 0x76543210.
Người ta thường gọi A, B, C, D là các chuỗi biến số (chaining variables).
Bức điện được chia ra thành nhiều khối 512 bit, mỗi khối 512 bit lại được chia ra 16 khối
32 bit đi vào bốn vòng lặp của MD5. Giả sử ta đặt a, b, c và d thay cho A, B, C và D đối
với khối 512 bit đầu tiên của bức điện. Bốn vòng lặp trong MD5 đều có cấu trúc giống nhau.
Mỗi vòng thực hiện 16 lần biến đổi: thực hiện với một hàm phi tuyến của 3 trong 4 giá trị a,
b, c và d; sau đó nó cộng kết quả đến giá trị thứ 4, tiếp đó cộng với một khối con 32 bit và
một hằng số. Sau đó, nó dịch trái một lượng bit thay đổi và cộng kết quả vào một trong 4 giá
trị a, b, c hay d. Kết quả cuối cùng là một giá trị mới được thay thế một trong 4 giá trị a, b, c
hay d.
Hình 9: Sơ đồ vòng lặp chính của MD5
Có bốn hàm phi tuyến, mỗi hàm này được sử dụng cho mỗi vòng:
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 17
Khối của bức điện
Vòng
1
Vòng
2
Vòng
3
Vòng
4
A
B
C
D
A
B
C
D
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
F(X,Y,Z ) = (X and Y) or ((not X) and Z)
G(X,Y,Z ) = ((X and Z) or (Y and (not Z)))
H(X,Y,Z ) = X xor Y xor Z
I(X,Y,Z ) = Y xor (X or (not Z)).
Những hàm này được thiết kế sao cho các bit tương ứng của X, Y và Z là độc lập và không
ưu tiên, và mỗi bit của kết quả cũng độc lập và ngang bằng nhau.
Nếu Mj là một biểu diễn của khối con thứ j (j = 16) và <<<s là phép dịch trái của s bit, thì
các vòng lặp có thể biểu diễn như sau:
FF(a,b,c,d,Mj,s,ti) được biểu diễn a = b + ((a + F(b,c,d) + Mj + ti) <<< s)
GG(a,b,c,d,Mj,s,ti) được biểu diễn a = b + ((a + G(b,c,d) + Mj + ti) <<< s)
HH(a,b,c,d,Mj,s,ti) được biểu diễn a = b + ((a + H(b,c,d) + Mj + ti) <<< s)
II(a,b,c,d,Mj,s,ti) được biểu diễn a = b + ((a + I(b,c,d) + Mj + ti) <<< s).
Bốn vòng (64 bước) sẽ được thực hiện.
III.3. Các bước mã hóa thông điệp
Các bit gắn thêm
Thông điệp được mở rộng, thêm bit vào phía sau sao cho độ dài của nó ( tính theo bit )
đồng dư với 448 theo môđun 512. Nghĩa là thông điệp được mở rộng sao cho nó còn thiếu
64 bit nữa thì sẽ có một độ dài chia hết cho 512. Việc này luông được thực hiện ngay cả khi
bản thân độ dài thông điệp đã đồng dư với 448 theo môđun 512.
Việc thêm bit này thực hiện như sau : một bit “1“ được thêm vào sau thông điệp, sau đó các
bit “0“ được thêm vào để có một độ dài đồng dư với 448 môđun 512. Trong tất cả các
trường hợp, có ít nhất 1 và nhiều nhất 512 bit được thêm vào.
Gắn thêm độ dài
Dạng biểu diễn 64 bit độ dài b của chuỗi ban đầu được thêm vào phía sau kết quả của
bước 1. Trong trường hợp b lớn hơn 2^64 thì chỉ có 64 bit thấp của b được sử dụng.
Khởi tạo bộ đệm MD
Một bộ đệm 4 word (A,B,C,D) được dùng để tính mã số thông điệp. Ở đây mỗi A,B,C,D
là một thanh ghi 32 bit. Những thanh ghi này được khởi tạo theo những giá trị hex sau ( các
byte thấp trước )
word A : 01 23 45 67
word B : 89 ab cd ef
word C : fe dc ba 98
word D : 76 54 32 10
Xử lý thông điệp theo từng khối 16 word
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 18
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
Trước hết ta định nghĩa các hàm phụ, các hàm này nhận đầu vào là 3 word 32 bit và tạo
ra một word 32 bit.
F(X,Y,Z) = XY v not(X) Z
G(X,Y,Z)= XZ v Y not(Z)
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X v not(Z))
Với mỗi bit, F hoạt động như một điều kiện : nếu X thì Y nếu không thì Z. Hàm F có thể
định nghĩa bằng phép + thay vì v bởi vì XY và not(X)Z không bao giờ có “1“ ở cùng 1 vị trí
bit.Các hàm G,H và I tương tự như F, ở chỗ chúng tác động theo từng bit tương ứng để tạo
ra kết quả từ các bit của X,Y và Z. Bước này sử dụng một bảng 64 giá trị T[1 64] được tạo
ra từ hàm sin. Gọi T là phần tử thứ i của bảng, thì T[i]là phần nguyên của 4294967296*|
sin(i)| , i được tính theo radian.
In ra
Mã số thông điệp được tạo ra là A,B,C,D. Nghĩa là chúng ta bắt đầu từ byte thấp của A, kết
thúc với byte cao của D.
III.4. Ứng dụng của MD5 Trong thực tế
Chính các đặc điểm của MD5 làm cho nó thường được ứng dụng trong một số trường hợp
như sau: Nó thường được dùng để checksum toàn bộ file. Các nhà phát triển ứng dụng
thường dùng MD5 trong việc cho phép download file trên NET. Họ sẽ cho “xuất bản” một
tín hiệu md của file download. Khi chúng ta tải file về , thì file chúng ta vừa download sẽ có
một tín hiệu md, nếu tín hiệu này khớp với tín hiệu các nhà phát triển ứng dụng đã “xuất
bản” ở trên. Thì OK, không có vấn đề. Nếu hai tín hiệu md này khác nhau, có thể có trong
file download có virut hay cái gì đó tương tự. Một ứng dụng thường được dùng nữa là hash
một password. Được dùng cho việc bảo mật một ứng dụng, hay những gì tương tự …
III.5. Tổng kết
Thuật toán số hóa thông điệp MD5 khá đơn giản để thực hiện, cung cấp một dạng “vân
tay“ hay mã số của thông điệp với độ dài tùy ý. Người ta cho rằng độ khó để tìm được 2
thông điệp có cùng mã số là khoảng 2^64 bước tính, và độ khó để tim được một thông điệp
với mã số cho trước là 2^128 bước tính. Thuật toán MD5 đã được dò tìm điểm yếu một cách
cẩn thận. Tuy nhiên đây là một thuật toán tương đối mới và việc phân tích cẩn thận về sự
an toàn là cần thiết.
IV. Thuật toán mã hóa 3DES
IV.1. Giới thiệu
Thuật toán mã hoá 3DES là một biến thể phụ của DES, như ta đã biết DES vẫn tồn tại
nhiều nhược điểm như: Có thể bẽ gãy bằng những máy có mục đích đặc biệt để tìm ra khóa .
Thuật toán mã hoá 3DES gồm 3 chìa khoá 64 bit, tức là toàn bộ chiều dài khoá là 192
bit. Trong khi mã hoá riên tư, chúng ta đơn giản là nhập toàn bộ 192 bit khoá đơn là
vào mỗi 3 chìa khoá cá nhân.
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 19
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
Hình 10: Mô tả 3DES
Thủ tục mã hoá cũng tương tự DES nhưng nó được lặp lại 3 lần tức là tăng lên 3 lần DES.
Dữ liệu được mã hoá với chìa khoá đầu tiên, và được giải mã với chìa khoá 2, sau đó mã
hoá lần nữa với chìa khoá thứ 3 để thu được dữ liệu mã hoá cuối cùng.
VI.2. Các mẫu hoạt động của 3DES
Triple ECB (Triple Electronic Code Book): Sách mã hoá điện tử.
Triple CBC (Triple Cipher Chaining): Móc nối khối ký số.
VI.3. Ưu và nhược điểm của 3DES
Ưu điểm: Khác với DES, thuật toán mã hoá 3DES được mã hoá 3 lần DES với kích
cỡ không gian khoá 168 bit cho nên an toàn hơn rất nhiều so với DES.
Nhược điểm: Vì 3DES sử dụng 3 lần mã hoá DES cho nên tốc độ mã hoá sẽ chậm
hơn rất nhiều so với DES. Phần mềm ứng dụng tỏ ra rất chậm đối với hình ảnh số và
một số ứng dụng dữ liệu tốc độ cao vì kích thước khối 64 bit vẫn còn là một nhược
điểm đối với những hệ có tốc độ của thế kỷ 21.
VI.4. Ứng dụng của thuật toán DES trong thực tế
Một ứng dụng rất quan trọng của DES là ứng dụng cho các văn bản trong giao dịch ngân
hang sử dụng các tiêu chuẩn được hiệp hội các ngân hang Mỹ phát triển. DES được sử dụng
để mã hoá các số nhận dạng cá nhân (Pins) và các văn bản về tài khoản được máy thu ngân
tự động thực hiện (ATMs)…
CHƯƠNG III. XÂY DỰNG CHƯƠNG TRÌNH
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 20
Báo cáo Đồ án- Lập Trình Mạng GVHD: Th.S Mai Văn Hà
CHƯƠNG IV. KẾT QUẢ
CHƯƠNG V. KẾT LUẬN VÀ HƯỚNG PHÁT
TRIỂN
SVTH: Trần Văn Huynh – Trần Văn Nghĩa Trang: 21