Bảo vệ bản quyền phần mềm với hệ chữ kí điện tử rsa
Trang 1MỤC LỤC
CHƯƠNG 1: GIỚI THIỆU 3
1.1 MỤC ĐÍCH, YÊU CẦU 3
1.2 KHÁI NIỆM CƠ BẢN 3
CHƯƠNG 2: HỆ CHỮ KÝ ĐIỆN TỬ RSA 4
2.1 SƠ LƯỢC VỀ CHỮ KÝ ĐIỆN TỬ 4
2.2 LỊCH SỬ RA ĐỜI CỦA THUẬT TOÁN RSA 4
2.3 HOẠT ĐỘNG THUẬT TOÁN RSA 5
2.3.1 Mô tả sơ lược thuật toán RSA 5
2.3.2 Tạo khóa RSA 6
2.3.3 Mã hóa RSA 7
2.3.4 Giải mã RSA 7
2.3.5 Ví dụ đơn giản về mã hóa và giải mã RSA 8
2.4 HỆ CHỮ KÝ ĐIỆN TỬ RSA 9
2.5 ĐỘ AN TOÀN CỦA PHƯƠNG PHÁP RSA 10
CHƯƠNG 3: LẬP TRÌNH WINDOWS VỚI MFC 11
3.1 NGÔN NGỮ LẬP TRÌNH 12
3.1.1 Tại sao lựa chọn ngôn ngữ Visual C++ 12
3.1.2 Sơ đồ phân lớp các thư viện trong VC++ 13
3.2 LẬP TRÌNH WINSOCK 14
3.2.1 Tổng quan về Winsock 14
3.2.2 Tạo Socket 16
3.2.3 Tạo kết nối 18
3.2.4 Gửi và nhận thông điệp 20
3.2.5 Đóng kết nối 23
CHƯƠNG 4: THƯ VIỆN CRYPTO++ 25
4.1 CÁCH CÀI ĐẶT THƯ VIỆN CRYPTO++ 25
4.2 CÁCH BIÊN DỊCH VÀ TÍCH HỢP BỘ THƯ VIỆN CRYPTO++ TRONG VISUAL C++ 25
4.3 NỐI KẾT TĨNH 26
4.4 NỐI KÊT ĐỘNG 27
4.5 THƯ VIỆN CRYPTO++ CUNG CẤP NHƯNG GÌ 41
CHƯƠNG 5: MÔ HÌNH BÀI TOÁN BẢO VỆ BẢN QUYỀN PHẦN MỀM VỚI HỆ CHỮ KÝ ĐIỆN TỬ RSA 44
5.1 MÔ HÌNH HỆ THỐNG CUNG CẤP MÃ KHÓA SỬ DỤNG CHỮ KÝ ĐIỆN TỬ RSA 44
5.1.1 Sơ đồ tổng quan về quá trình tạo khóa 44
5.1.2 Sơ đồ luồng dữ liệu quá trình tạo khóa 46
5.2 BÀI TOÁN THỰC TẾ 60
CHƯƠNG 6: XÂY DỰNG CHƯƠNG TRÌNH 61
6.1 TỔNG QUAN CHƯƠNG TRÌNH 61
6.2 CHỨC NĂNG CHƯƠNG TRÌNH CHẠY TRÊN PHÍA SERVER 61
6.3 CHỨC NĂNG CHƯƠNG TRÌNH PHÍA CLIENT 64
6.4 KHẢ NĂNG ỨNG DỤNG CỦA CHƯƠNG TRÌNH 67
TÀI LIỆU THAM KHẢO: 68
Trang 2Lời nói đầu
Ngày nay cùng với sự phát triển vượt bậc của khoa học kỹ thuật công nghệ thông tin là một trong những lĩnh vực có nhiều đóng góp thiết thực nhất Như chúng ta đã biết bản quyền là một lĩnh vực rất nhạy cảm của ngành công nghệ thông tin, vấn đề vê phần mềm bảo vệ phần mềm đang ngày càng được chú ý Công nghệ phát triển đi đôi với thực trạng vi phạm bản quyền phần mềm dang rất phổ biến tại Viêt Nam cũng như rất nhiều nước khác trên thế giới Chính vì vậy nên lĩnh vực bảo vệ bản quyền phần mềm đang được chú ý
và phát triển không ngừng
Ngày nay, ngành tin học tại Việt Nam dang phát triển mạnh mẽ Cùng với đó là những phát triển mạnh mẽ trong lĩnh vực bảo vệ bản quyền phần mềm Sinh viên Việt Nam có thêm con đường mới để tìm hiểu và nghiện cứu
về lĩnh vực này
Với ngôn ngữ lập trình Visual C ++ em xin được giới thiệu về một ứng dụng của hệ chữ ký điện tử RSA trong việc bảo vệ bản quyền phần mềm trong đề tài tốt ngiệp lần này
Trang 3Chương 1: Giới thiệu
1.1 Mục đích, yêu cầu
Tìm hiểu bài toán bảo vệ bản quyền phần mềm, ngôn ngữ lập trình Visual C++.Tiến hành phân tích thiết kế hệ thống và xây dựng mô hình giải quyết bài toán
- Tìm hiểu ngôn ngữ lập trình Visual C++ MFC
- Xây đựng mô hình client - server dựa trên ngôn ngữ lập trình Visual C++, lập trình winsocket và bộ thư viện MFC
- Phân tích bài toán chữ ký điện tử RSA đưa vào việc bảo vệ bản quyền phần mềm
- Tìm hiểu bộ thư viện Crypto++ các thư viện cần thiết cho việc giải quyết bài toán tạo chữ ký điện tử RSA
- Xây dựng mô hình bài toán
- Hoàn thiện chương trình , tạo bộ cài đặt, tạo help
1.2 Khái niệm cơ bản
Bản quyền: Copyright (bản quyền) là thuật ngữ dùng chỉ cho quyền
phi vật thể đối với các tác phẩm trí tuệ
Mô hình trạm - chủ (Client - Server): Các máy trạm được nối với các
máy chủ, nhận quyền truy nhập mạng và tài nguyên mạng từ các máy chủ Các máy thường được tổ chức thành một domain và được quản lý bởi một máy chủ Các ứng dụng, tài nguyên mạng và cơ chế bảo mật đều do máy chủ quản lý
Trang 4Chương 2: Hệ chữ ký điện tử RSA
2.1 Sơ lược về chữ ký điện tử
Chữ ký điện tử không được sử dụng nhằm bảo mật thông tin mà nhằm bảo vệ thông tin không bị người khác cố tình thay đổi để tạo ra thông tin sai lệch Nói cách khác, chữ ký điện tử giúp xác định được người đã tạo ra hay chịu trách nhiệm đối với một thông điệp
Một phương pháp chữ ký điện tử bao gồm hai thành phần chính: thuật toán dùng để tạo ra chữ ký điện tử và thuật toán tương ứng để xác nhận chữ
- Không gian khóa K là tập hợp hữu hạn các khóa có thể sử dụng
- Với mỗi khóa k K, tồn tại thuật toán chữ ký sigkS và thuật toán xác nhận chữ ký tương ứng verk V Mỗi thuật toán sigk: P → A và verk: P×A
→ {true, false} là các hàm thỏa điều kiện:
sig(x) false if y
{
2.2 Lịch sử ra đời của thuật toán RSA
Thuật toán được Ron Rivest, Adi Shamir và Len Adleman mô tả lần đầu tiên vào năm 1977 tại Học viện Công nghệ Massachusetts (MIT) Tên của thuật toán lấy từ 3 chữ cái đầu của tên 3 tác giả
Trang 5Thuật toán RSA được MIT đăng ký bằng sáng chế tại Hoa Kỳ vào năm
1983 (Số đăng ký 4, 405, 829) Bằng sáng chế này hết hạn vào ngày 21 tháng
9 năm 2000 Tuy nhiện, do thuật toán đã được công bố trước khi có đăng ký bảo hộ nên sự bảo hộ hầu như không có giá trị bên ngoài Hoa Kỳ Ngoài ra, nếu như công trình của Clifford Cocks đã được công bố trước đó thì bằng sáng chế RSA đã không thể được đăng ký
2.3 Hoạt động thuật toán RSA
2.3.1 Mô tả sơ lược thuật toán RSA
Thuật toán RSA có hai khóa: khóa công khai (hay khóa công cộng) và khóa bí mật (hay khóa cá nhân) Mỗi khóa là những số cố định sử dụng trong quá trình mã hóa và giải mã Khóa công khai được công bố rộng rãi cho mọi người và được dùng để mã hóa Những thông tin được mã hóa bằng khóa công khai chỉ có thể được giải mã bằng khóa bí mật tương ứng Nói cách khác, mọi người đều có thể mã hóa nhưng chỉ có người biết khóa cá nhân (bí mật) mới có thể giải mã được
A có thể mô phỏng trực quan một hệ mật mã khoá công khai như sau: Bob muốn gửi cho Alice một thông tin mật mà Bob muốn duy nhất Alice có thể đọc được Để làm được điều này, Alice gửi cho Bob một chiếc hộp có khóa đã mở sẵn và giữ lại chìa khóa Bob nhận chiếc hộp, cho vào đó một tờ giấy viết thư bình thường và khóa lại (như loại khoá thông thường chỉ cần sập chốt lại, sau khi sập chốt khóa ngay cả Bob cũng không thể mở lại được- không đọc lại hay sửa thông tin trong thư được nữa) Sau đó Bob gửi chiếc hộp lại cho Alice Alice mở hộp với chìa khóa của mình và đọc thông tin trong thư Trong ví dụ này, chiếc hộp với khóa mở đóng vai trò khóa công khai, chiếc chìa khóa chính là khóa bí mật
Trang 62.3.2 Tạo khóa RSA
Chọn 2 số nguyên tố lớn p và q với p≠q, lựa chọn ngẫu nhiện và độc lập
- Các số nguyên tố thường được chọn bằng phương pháp thử xác suất
- Các bước 4 và 5 có thể được thực hiện bằng giải thuật Euclid mở rộng (xem thêm: số học môđun)
Bước 5 có thể viết cách khác: Tìm số tự nhiện x sao cho
e
q p
x
d ( 1 )( 1 ) 1
cũng là số tự nhiện Khi đó sử dụng giá trị
) 1 )(
1 mod( p q
Từ bước 3, PKCS#1 v2.1 sử dụng LCM ( p 1 , q 1 ) thay cho
) 1 )(
1
Khóa công khai bao gồm:
n, môđun, và e, số mũ công khai (cũng gọi là số mũ mã hóa)
Trang 7p and q, hai số nguyên tố chọn ban đầu, d mod (p- 1) và d mod (q- 1) (thường được gọi là dmp1 và dmq1), (1/q) mod p (thường được gọi là iqmp)
Alice gửi khóa công khai cho Bob, và giữ bí mật khóa cá nhân của mình Ở
đây, p và q giữ vai trò rất quan trọng Chúng là các phân tố của n và cho phép tính d khi biết e Nếu không sử dụng dạng sau của khóa bí mật (dạng CRT) thì
p và q sẽ được xóa ngay sau khi thực hiện xong quá trình tạo khóa
2.3.3 Mã hóa RSA
Giả sử Bob muốn gửi đoạn thông tin M cho Alice Đầu tiên Bob
chuyển M thành một số m < n theo một hàm có thể đảo ngược (từ m có thể xác định lại M) được thỏa thuận trước Quá trình này được mô tả ở phần
(Chuyển đổi văn bản rõ)
Lúc này Bob có m và biết n cũng như e do Alice gửi Bob sẽ tính c là bản mã hóa của m theo công thức:
n m
bằng (thuật toán bình phương và nhân) Cuối cùng Bob gửi c cho Alice
2.3.4 Giải mã RSA
Alice nhận c từ Bob và biết khóa bí mật d Alice có thể tìm được m từ c
theo công thức sau: m cd mod n
Biết m, Alice tìm lại M theo phương pháp đã thỏa thuận trước Quá trình
Trang 8Do p và q là hai số nguyên tố cùng nhau, áp dụng định lý số dư Trung Quốc,
2.3.5 Ví dụ đơn giản về mã hóa và giải mã RSA
Sau đây là một ví dụ với những số cụ thể Ở đây chúng ta sử dụng những số nhỏ để tiện tính toán còn trong thực tế phải dùng các số có giá trị đủ lớn.VD lấy:
p = 61 — số nguyên tố thứ nhất (giữ bí mật hoặc hủy sau khi tạo
Khóa công khai là cặp (e, n) Khóa bí mật là d
Hàm mã hóa là: encrypt(m) = m e mod n = m17 mod 3233 với m là văn bản rõ Hàm giải mã là: decrypt(c) = c d
mod n = c2753 mod 3233 với c là văn bản mã
Để mã hóa văn bản có giá trị 123, ta thực hiện phép tính:
Trang 92.4 Hệ chữ ký điện tử RSA
n = pq với p và q là hai số nguyên tố lẻ phân biệt
Cho n P=C= Znvà định nghĩa:
K = {((n, p, q, a, b): n = pq, p, q là số nguyên tố, ab ≡ 1 (mod φ(n))}
Giá trị n và b được công bố, trong khi giá trị p, q, a được giữ bí mật
Với mỗi K = (n, p, q, a, b) ∈ K, định nghĩa:
sigK(x) = xa mod n và verK(x, y) = true x ≡ yb (mod n),
với, n x y∈ Zn
Cần chú ý rằng các phương pháp chuyển đổi bản rõ (như RSA- PSS) giữ vai trò quan trọng đối với quá trình mã hóa cũng như chữ ký điện tử và không được dùng khóa chung cho đồng thời cho cả hai mục đích trên
VD:
Trang 102.5 Độ an toàn của phương pháp RSA
Bài toán RSA là bài toán tính căn bậc e môđun n (với n là hợp số): tìm
số m sao cho m e
=c mod n, trong đó (e, n) chính là khóa công khai và c là bản
mã Hiện nay phương pháp triển vọng nhất giải bài toán này là phân tích n ra
thừa số nguyên tố Khi thực hiện được điều này, hacker sẽ tìm ra số mũ bí mật
d từ khóa công khai và có thể giải mã theo đúng quy trình của thuật toán Nếu
kẻ tấn công tìm được 2 số nguyên tố p và q sao cho: n = pq thì có thể dễ dàng
tìm được giá trị (p- 1)(q- 1) và qua đó xác định d từ e Chưa có một phương
pháp nào được tìm ra trên máy tính để giải bài toán này trong thời gian đa
thức (polynomial- time) Tuy nhiện người ta cũng chưa chứng minh được điều
ngược lại (sự không tồn tại của thuật toán) Xem thêm phân tích ra thừa số nguyên tố về vấn đề này
Tại thời điểm năm 2005, số lớn nhất có thể được phân tích ra thừa số nguyên tố có độ dài 663 bít với phương pháp phân tán trong khi khóa của RSA có độ dài từ 1024 tới 2048 bít Một số chuyên gia cho rằng khóa 1024 bít có thể sớm bị phá vỡ (cũng có nhiều người phản đối việc này) Với khóa
4096 bít thì hầu như không có khả năng bị phá vỡ trong tương lai gần Do đó,
người ta thường cho rằng RSA đảm bảo an toàn với điều kiện n được chọn đủ lớn Nếu n có độ dài 256 bít hoặc ngắn hơn, nó có thể bị phân tích trong vài
giờ với máy tính cá nhân dùng các phần mềm có sẵn Nếu n có độ dài 512 bít,
nó có thể bị phân tích bởi vài trăm máy tính tại thời điểm năm 1999 Một thiết
bị lý thuyết có tên là TWIRL do Shamir và Tromer mô tả năm 2003 đã đặt ra câu hỏi về độ an toàn của khóa 1024 bít Vì vậy hiện nay người ta khuyến cáo
sử dụng khóa có độ dài tối thiểu 2048 bít
Trang 11Năm 1993, Peter Shor công bố thuật toán Shor chỉ ra rằng: máy tính lượng tử (trên lý thuyết) có thể giải bài toán phân tích ra thừa số trong thời gian đa thức Tuy nhiện hiện nay mt lượng tư chưa đáp ứng được y/c này (Theo Wikipedia)
Chương 3: Lập trình Windows với MFC
Chương trình được viết bằng ngôn ngữ C++ trên môi trưòng phát triển tích hợp (IDE – Intergrated Development Environment) Visual C++ trong bộ công cụ lập trình MS Visual Studio 6.0 Đây là một công cụ lập trình hướng đối tượng rất mạnh và phổ biến trên môi trường Windows của hãng Microsoft Visual C++ hỗ trợ rất nhiều cho việc lập trình, đặc biệt là các chương trình Windows truyền thống Nó đơn giản hoá việc lập trình bằng việc cung cấp các thư việt sẵn có, điển hình là MFC – Microsoft Foundation Classes
Visual C++ là một trong những công cụ rất mạnh Với những đoạn mã được sinh ra bởi Wizards, tự bản thân nó có thể tạo nên sườn của một ứng dụng chạy trên Windows chỉ trong vài giây, người lập trình chỉ việc đưa đoạn
mã chương trình của mình vào vị trí được chỉ ra là có một ứng dụng hoàn hảo Thư viện chứa Visual C++ MFC trở thành thư viện chuẩn cho việc phát triển phần mềm trên Windows sử dụng các trình biên dịch C++ MFC được thiết kế đặc biệt có lợi cho người lập trình trên nền Windows bằng cách cung cấp những lớp đối với hành vi (behavior) hay thuộc tính (property) Đặc điểm quan trọng của Visual C++ là tính đa dạng và tính kế thừa và các đối tượng và quan trọng nhất là lớp bởi lớp là cơ cấu để tạo nên đối tượng Ngoài ra C++ còn có một đặc điểm nữa gọi là sự đóng kín Đây là cơ chế liên kết mã và dữ liệu mà nó thao tác, giữ cho cả hai được an toàn khỏi sự can thiệp từ bên
Trang 12ngoài vào do sử dụng sai Chính vì vậy, Visual C++ là một ngôn ngữ mạnh và đáng tin cậy để lựa chọn
Ngôn ngữ lập trình C++ được biết đến như là một trong những ngôn ngữ lập trình mạnh nhất nhờ khả năng của nó trong việc triển khai phần mềm
ở các mức độ khác nhau Từ mức hệ thống đến mức ứng dụng, từ lập trình cấu trúc đến lập trình hướng đối tượng, từ lập trình dựa trên thuật giải đến lập trình trí tuệ nhân tạo, và từ lập trình cơ sở dữ liệu đến lập trình cơ sở tri thức…, bất cứ đâu, khi mà người lập trình muốn thể hiện ý tưởng khoa học và nghệ thuật của mình trên máy tính thì C++ là một điều nghĩ đến trước tiên
Microsoft Visual C++, sản phẩm của Microsoft, với khả năng biên dịch
ưu việt và lối khai thác hệ thống rộng mở nhờ tập hợp lớp thư viện MFC cho C++ có đầy đủ các tiện ích giúp chúng ta vét được mọi ngõ ngách của Windows hầu phục vụ cho ứng dụng của mình
3.1 Ngôn ngữ lập trình
Sử dụng bộ cài đặt Visual Studio 6.0 và Sử dụng công cụ lập trình Visual C++6.0 Nghiện cứu về các lớp cách thức sử dụng các thành phần điều khiển trong một ứng dụng.Nghiện cứu về MFC(Microsoft Foundation Class)
3.1.1 Tại sao lựa chọn ngôn ngữ Visual C++
Ngôn ngữ VC++ rất mạnh trong việc hỗ trợ các lớp các thư viện được dùng sẵn Có bốn cơ sở cho các ứng dụng xây dựng bằng ngôn ngữ VC++ đó là:
- Tạo một cửa ứng dụng đễ dàng
- Các lớp MFC đã cung cấp rất nhiều lớp được xây dụng sẵn trên Window
Trang 13- VC++ trên MFC giúp rút ngắn thời gian lập trình phát triển, chương trình các ứng dụng không bị làm giảm tính mêm dẻo hỗ trợ bởi các công nghệ phát triển như ActiveX hay Internet
- Hỗ trợ truy cập cơ sơ dữ liệu qua OLE DB va ADO hỗ trợ lập trình mạng qua Window socket.Cho phép tạo các thành phần giao diện như những trang thuộc tính
Khi lập trình trên VC++ với MFC ta chỉ phải xây dựng những lớp mới thừa kế từ các lớp có sẵn của MFC.Việc xử lý sẽ được ánh xạ và định nghĩa thành các phương thức của các lớp tương ứng
3.1.2 Sơ đồ phân lớp các thư viện trong VC++
Thư viện MFC của Microsoft bao gồm các lớp cơ bản, cài đặt bằng ngôn ngữ C++, hỗ trợ việc lập trình trong môi trường windows Từ các lớp này, MFC xác lập nền tảng hình thành ứng dụng của windows, bao gồm việc định nghĩa bộ khung ứng dụng, các công cụ chuẩn và phổ biến để bổ sung vào
bộ khung nói trên nhằm tạo ra ứng dụng hoàn chỉnh
Với MFC, công việc của người lập trình chỉ còn là việc lựa chọn các thành phần cần thiết, điều chỉnh và phối hợp chúng hợp lý để có được ứng dụng kết quả mong muốn Lập trình windows với MFC và MicroSoft Visual C++ 6.0 (VC) đạt được hiệu quả cao bởi không chỉ khai thác được phiện bản mới nhất của MFC mà còn nhận được nhiều tiện nghi lập trình mà VC cung
Trang 14cấp Ðây là con đường ngắn và đơn giản, đặc biệt với người tự học, để viết ứng dụng windows
3.2 Lập trình Winsock
3.2.1 Tổng quan về Winsock
Giao diện lập trình ứng dụng Windows Socket (Winsock API) là một thư viện các hàm mà chúng thực hiện giao diện socket giống như phổ cập của hãng Berkeley Software Distrisbution cho hệ điều hành UNIX Winsock được tăng thêm sức mạnh khi gắn thêm những đặc thù của hệ điều hành Window để
hỗ trợ điều khiển thông điệp Phiện bản 1.1 của Winsock tương thích với bộ giao thức TCP/IP Tuy nhiện những phiện bản mới hơn hỗ trợ cả giao thức các mạng Novell, Appletalk, và một số giao thức mạng thông dụng khác nữa
Đặc tả chồng giao thức TCP/IP cung cấp một giao diện để người lập trình ứng dụng có thể viết chương trình chạy đựoc trên bất cứ hệ thống nào tương thích với chồng giao thức TCP/IP Đây là đặc điểm trái ngược hẳn với trước kia, khi mà Winsock chưa ra đời người phát triển phải liên kết ứng dụng của mình với sản phẩm TCP/IP của bất cứ nhà cung cấp nào Điều này hạn chế số lượng hệ thống mà một ứng dụng có thể chạy trên nó, bởi vì thật khó khăn trong việc bảo trì một ứng dụng mà lại sử dụng các thực hiện khác nhau của socket Winsock đã phá bỏ rào cản đó Lập trình viên chỉ việc viết với Winsock API và liên kết ứng dụng của họ tới thư viện WINSOCK.LIB ( hay WSOCK32 cho Win32) Bây giờ ứng dụng đó có thể cài đặt trên máy tính có Winsock TCP/IP được cung cấp bởi bất cứ hãng nào, và liên kết động tới WINSOCK.DLL (hay WSOCK32.DLL) Hình sau minh hoạ cách làm việc của Winsock
Trang 15Hình A: Cách làm việc của Winsock
Một socket đơn giản là một điểm mút truyền thông Một TCP/IP socket bao gồm một địa chỉ IP và một cổng Một số cổng được sử dụng cho các dịch
vụ thông dụng, còn lại là dành cho ứng dụng Socket có thể cài đặt để cung cấp dịch vụ giao thức tin cậy hoặc không tin cậy
Socket hướng luồng tin cậy được xây dựng trên TCP Nó đòi hỏi phải thiết lập kết nối trước khi hai tiến trình có thể gửi hoặc nhận dữ liệu giữa chúng Dữ liêu gửi giữa liên kết hai tiến trình đó đơn giản là một luồng byte Không có giới hạn về kích thước bản ghi trong luồng dữ liệu Ví dụ, nếu một tiến trình gửi 100 byte, tiến trình nhận có thể nhận một bó 100 byte hay hai bó
50 byte Nếu một ứng dụng phụ thuộc vào những bản ghi thì phải cung cấp những header ở mức ứng dụng trong luồng dữ liệu TCP không bảo toàn kích thước gói dữ liệu ở bên nhận
Dịch vụ luồng hướng kết nối rất phù hợp cho mô hình client / server Thông thường, server tạo ra một socket, đưa ra một tên socket và chờ client
Trang 16kết nối tới socket đó Client tạo một socket và kết nối tới socket đã được đăng
kí đó Server socket vẫn tiếp tục lắng đợi kết nối từ client khác
Hình B: Tương tác giữa client – server
Socket phi kết nối không tin cậy được xây dựng trên giao thức UDP
Nó không đòi hỏi phải thiết lập kết nối giữa hai tiến trình Dữ liệu gửi giữa hai tiến trình bất kì là một gói đơn Bên gửi gửi một gói dữ liệu và bên nhận nhận toàn bộ gói dữ liệu đó Do đó, loại socket này thuận tiện cho việc gửi bản ghi, không đòi hỏi header tầng ứng dụng Hạn chế của dịch vụ socket này
là dữ liệu có thể không nhận được từ bền nhận, trùng dữ liệu hoặc dữ liệu nhận không đúng theo thứ tự gửi
3.2.2 Tạo Socket
Khi xây dựng ứng dụng với Visual C++, chúng ta có thể dùng lớp Winsock MFC để dễ dàng thêm các khả năng truyền thông mạng Lớp cơ sở CAsyncSocket cung cấp các truyền thông Socket điều khiển sự kiện hoàn hảo Chúng ta có thể tạo lớp Socket kế thừa để nhận và trả lời các sự kiện đó
Trang 17Chú ý: Ta cần kiểm tra tuỳ chọn AppWinzard để bổ sung hỗ trợ cho
Windows Socket
Để tạo Socket có thể dùng trong ứng dụng, đầu tiên cần khai báo biến
của lớp CAsyncSocket (hay lớp kế thừa) như lớp thành phần cho một trong
những ứng dụng chính:
class CMyDlg: public CDialog
{
private:
CAsyncSocket m_sMySocket;
};
Trước khi có thể dùng đối tượng Socket, ta phải gọi phương thức
Create Thực chất là tạo và chuẩn bị phương thức để sử dụng Cách thức gọi phương thức Create còn tuỳ thuộc vào chúng ta sử dụng Socket ra sao Nếu
muốn dùng Socket để kết nối với ứng dụng khác, như thực hiện lời gọi (máy khách), chúng ta không cần truyền bất cứ tham số nào tới phương thức
Create:
if (m_sMySocket.Create())
{
// Tiếp tục }
Else
//Xử lý lỗi tại đây
Trang 18Tuy nhiện, nếu Socket theo dõi để ứng dụng khác có thể kết nối với nó
và đợi lời gọi (máy chủ), khi đó chúng ta cần truyền số hiệu cổng Socket đang theo dõi trên đó
if (m_sMySocket.Create(4000))
{
// Tiếp tục }
else
// Xử lý lỗi tại đây
Chúng ta có thể gộp các tham số khác vào lời gọi phương thức Create, chẳng hạn như kiểu Socket cần tạo, các sự kiện Socket phải đáp lại, và địa chỉ Socket phải theo dõi (trong trường hợp máy tính có nhiều card mạng) Các tuỳ chọn trên đòi hỏi phải chúng ta phải hiểu kỹ hơn về Socket
3.2.3 Tạo kết nối
Sau khi tạo Socket, chúng ta đã sẵn sàng mở kết nối Việc mở kết nối đơn giản thường gồm ba bước Hai bước diễn ra trên máy chủ (có tác dụng liệt kê ứng dụng cho kết nối), và bước thứ ba diễn ra trên máy khách (có tác dụng tạo lời gọi)
Trên máy khách, việc mở kết nối đơn giản là gọi phương thức Connect Máy khách phải truyền hai tham số tới phương thức Connect gồm tên máy tính, hay địa chỉ mạng, và cổng ựng dụng kết nối Phương thức Connect có thể được sử dụng theo hai cách:
if (m_sMySocket.Connect("thatcomputer.com", 4000))
{
// tiếp tục
Trang 19else
// Xử lý lỗi ở đây
Khi kết nối đươc thiết lập, sự kiện được kích hoạt cho phép ứng dụng biết tình trạng kết nối (thành công hay thất bại có kèm theo lý do) Ở cuối chương sẽ trình bày hoạt động của các sự kiện này trong mục ―Sự kiện Socket‖
Đối với máy chủ, hay đầu nghe của kết nối, trước tiên ứng dụng phải báo cho Socket theo dõi việc nhận kết nối bằng cách gọi phương thức Listen Phương thức Listen chỉ sử dụng một đối và chúng ta không cần phải hỗ trợ Tham số này chỉ định nhiều kết nối chờ giải quyết có thể được xếp thành hàng đợi, chờ cho tới khi kết nối hoàn thành Giá trị mặc định là 5 đây là giá trị lớn nhất Phương thức Listen được gọi như sau:
if (m_sMySocket.Listen())
{
// Tiếp tục }
else
Trang 20// xử lý lỗi ở đây
Bất cứ khi nào ứng dụng khác cố kết nối với ứng dụng đang theo giõi,
sự kiện sẽ được kích hoạt để báo cho ứng dụng biết có yêu cầu kết nối Ứng dụng theo dõi phải chấp nhận yêu cầu kết nối bằng cách gọi phương thức Accept Phương thức này cần sử dụng biến CAsynSocket thứ hai, biến này được kết nối với ứng dụng khác Socket thứ hai này không cần phương thức Create vì bản thân phương thức Accept sẽ tạo Socket Chúng ta gọi phương thức Accept theo cách sau:
if (m_sMySocket.Accept(m_sMySecondSocket))
{
// Tiếp tục }
else
// Xử lý lỗi tại đây
Vào thời điểm này ứng dụng kết nối được kết nối với Socket thứ hai trên ứng dụng đang theo dõi
3.2.4 Gửi và nhận thông điệp
Gửi và nhận thông điệp qua Socket có phần rắc rối Vì chúng ta có thể dùng Socket để gửi bất ký loại dữ liệu nào, nên hàm nhận hay gửi dữ liệu cần được truyền con trỏ tới bộ đệm chung Để gửi dữ liệu, bộ đệm này sẽ chứa dữ liệu được gửi Để nhận dữ liệu, bộ đệm này sẽ chứa dữ liệu nhận được.Với điều kiện gửi và nhận các chuỗi hoặc văn bản, chúng ta có thể dùng những hoán đổi khá đơn giản tới và từ CString với các bộ đệm này
Để gửi thông điệp thông qua kết nối Socket, chúng ta dùng phương thức Send Phương thức cần hai tham số, và có tham số tuỳ chọn thứ ba có thể dùng để điều khiển cách thức thông điệp Tham số đầu tiên là con trỏ trỏ tới
Trang 21bộ đệm chứa dữ liệu cần gửi Nếu thông điếp là biến CString chúng ta có thể dùng toán tử LPCSTR để truyền biến CString như bộ đệm Tham số thứ hai là chiều dài bộ đệm Phương thức này trả về lượng dữ liệu được gửi đến ứng dụng khác Nếu lỗi xuất hiện, hàm Send trả về SOCKET_ERROR Chúng ta
có thể dùng phương thức Send như sau:
Trang 22Send tuy có khác nhưng không đáng kể Tham số đầu tiên là con trỏ tới bộ đệm có thể sao chép thông điệp trong đó Tham số thứ hai là kích cỡ bộ đệm, thông báo cho Socket biết có bao nhiêu dữ liệu được sao chép Giống như phương thức Send, phương thức Receive cũng trả về lượng dữ liệu được sao chép vào bộ đệm Nếu xảy ra lỗi phương thức Receive cũng trả về SOCKET_ERROR Nếu thông điệp mà ứng dụng đang nhận là thông điệp văn bản nó có thể dùng phương thức Receive như sau:
char *pBuf = new char[1025];
Trang 233.2.5 Đóng kết nối
Khi ứng dụng kết thúc tất cả truyền thông với ứng dụng khác, nó có thể đóng kết nối bằng cách gọi phương thức Close Phương thức Close không có một tham số nào:
Hàm Đặc tả sự kiện
OnAccept Hàm này được gọi trên Socket theo dõi để thông báo rằng
yêu cầu kết nối từ ứng dụng khác đang đợi được chấp nhận
OnClose
Được gọi trên Socket để thông báo rằng ứng dụng ở đầu kết nối kia đã đóng Socket hay mất kết nối Để thực hiện phải đóng Socket đã nhận thông báo này
OnConnect
Được gọi trên Socket để thông báo rằng kết nối với ứng dụng khác đã hoàn thành và ứng dụng có thể gửi nhận thông điệp qua Socket
OnReceive
Thông báo sự kiện dữ liệu đã được nhận thông qua kết nối Socket và dữ liệu đã sẵn sàng được truy nhập thông qua gọi hàm Receive
Trang 24OnSend
Hàm này được gọi để thông báo rằng Socket đã sẵn sàng gửi dữ liệu Hàm này được gọi ngay sau khi kết nối được thiết lập
Bảng các hàm thông báo sự kiện của lớp CAsyncSocket
3.2.6 Phát hiện lỗi
Khi nào các hàm thành phần CAsyncSocket trả về lỗi hay FALSE cho hầu hết các hàm hoặc SOCKET_ERROR trên hàm Send và Receive, chúng ta
có thể gọi phương thức GetLastError để tìm mã lỗi Hàm này chỉ trả về mã lỗi
và chúng ta phải tự tìm Tất cả các mã lỗi Winsock đều được định nghĩa với các hằng, do đó chúng ta có thể sủ dụng các hằng trong mã để xác định thông báo lỗi sẽ hiển thị tới người sử dụng nếu có Chúng ta có thể sử dụng hàm GetLastError như sau:
Trang 25Chương 4: Thư viện Crypto++
4.1 Cách cài đặt thư viện Crypto++
Hiện nay thư viện crypto++ là bộ thư viện miễn phí khá mạnh mẽ trong việc viết chương trình mã hóa dữ liệu hay công việc mã hóa chữ ký điện tử Thư viện Crypto++ được cho phép sử dụng miễn phí có thể download từ trang http: //www.cryptopp.com/
Khi sử dụng thư viện crypto++ cần chú ý biên dịch trong khi chạy do
bộ thư viện crypto++ không nằm trong bộ thư viện chuẩn của Microsoft
4.2 Cách biên dịch và tích hợp bộ thư viện Crypto++ trong Visual C++
Sau khi có bộ thư viện Crypto++ dưới dạng rar ta giải nén bộ thư viện.nạp bộ thư viện crypto bằng file project.Khi tích hợp bộ thư viện Crypto++ này vào VC++ bộ thư viện Crypto++ phải chạy đồng thời khi biên dịch chương trình có sử dụng Nơi lưu giữ thư viện phải được khai báo khi ta biên dich Bộ biên dịch cần phải được khai báo link tơí thư viện Crypto++ thư viện sau khi đã được biên dịch Nếu chương trình có sử dụng MFC hay ALT
ta cần phải thay đổi một số lụa chọn
Nếu bạn muốn sử dụng thư viện crypto như môt thư viện động khi chạy chương trình.ta cần chỉ rõ liên kết dạng /MD hay /MTd trong qua trình liên kết Nếu trạng thái của LINK 2005 lỗi khi liên kết thì nhất định ta phải biên dịch lại nó Bảng dưới đây là tóm tắt từ nhưng điều trên
Trang 26Project Setting Project Link
Dynamic Runtime
Rebuild Crypto++ Library
Dynamic Runtime
Dynamic (Crypto++ DLL)
Rebuild Crypto++ Library
Trang 274.4 Nối kêt động
Khi kết nối động tới thực hiện của C (/md hoặc /mDd), thư viện Crypto++ phải được xây dựng lại sử dụng cùng nhữnh cài đặt kết nối là sự án chính mở dự án Crypto++ và thay đổi những cài đặt của dự dán crypto++ cho
cả CryptDll và Cryptlib những cài đặt nên thay đôit thành /Md hoặc /MDd cách tốt là cài đặt cũng nên được thay đốiang Cryptest
Xung đột thư viện thực hiện và Crypto++ DLl/fips Dll
Kết nối bộc lộ hai tình huống khó với tác giả phần mềm thứ nhất là mong muốn kết nối động dựa vào thư viện của C khi sử dụng FLIPS DLL vấn đề bắt nguồn như sau: kết nối thực hiện động của C được sử dụng bởi (/MD hoặc /MDd) ứng dụng, nhưng mà Flip DLl phân tán lại tĩnh (/Mt hoặc /MTd) giải pháp tốt nhấ là sử dụng switch /NODEFAULTTIB và hy ọng rằng khôn có thực hiện nào diễn ra trong tình huống này sẽ gây ra khó khăn
để theo dõi và tìm ra những lỗi thực hiện và nó sẽ nhận ra những lỗi sinh ra khi khởi chạy cần phải chú ý rằng xây dựng lại DLL sử dụng kết nối thực hiện động không còn có thể dung được vì bạn đang sử dụng FIPS DLL tình huống thứ hai xảy ra khi sử dụng thêm thành phần của hãng thứ ba việc này bao gồm cả MFC và ATL giả sử rằng bạn cần sử dụng FIPS DLL
Bạn thay đổi những cài đặt của project để sử dụng phiện bản tĩnh để thực hiện và kết nối sử dụng FIPS DLL kế đó, thêm vào thành phần của hãng thứ ba mà những thành phần này chỉ đưa ra những kết nối động dựa vào C
Và bây giờ ta có tình huống mà đã được mô tả trước kia Công việc đưa ra xung quanh cái đó là liên hệ với đại lý của hãng thứ ba và tìm được một thư viện mà nó sử dụng cung một cài đặt thực hiện như Project và Crypto++ của mình
Trang 28Biên dịch Crypto++
Hãy ghe thăm Crypto++ Homepage và lấy về những phiện bản download bài báo này dựa trên version 5.2.1, nhưng bất khì bản nào cũng có thể được Khi sử dụng visual studio 6.0 thì Microsoft's Processor Pack được khuyến cáo là dùng cho Crypto++5.1 và những phiện bản sớm hơn và nó được yêu cầu cho Crypto++5.2 và những phiện bản muộn hơn
Tạo một thư mục trên ổ cứng để phân tán Crypto++ đã download, định
vị file Cryptest.dsw và mở nó trong ví dụ này, file zip được giải nén vào thư mục C: \CryptoPP 5.2.1\
Từ menu Build chọn Batch Build
Trang 29Tích hợp Crypto++ vào trong môi trường Visual C++
Tài liệu này sẽ thêm thư viện vào môi trường Visual studio chứ không phải vào môi trường dự án Điều nàu có nghĩa là những cài đặt sẽ có ảnh hưởng tới hết mọi dự án, không phải chỉ có dự án Crypto++ Khi việc xây
dựng hoàn tất hãy vào trong thư mục the C: \CryptoPP 5.2.1\Debug\ thay tên
thư viện từ cryptlib.lib sang cryptlibd.lib (chú ý ta thêm vào từ d ở cuối là
dùng cho việc gỡ lỗi)
Chuyển thư viện Debug sang tới vị trí của file Header và Source Trong
ví dụ này vị trí là C: \CryptoPP 5.2.1\ đồng thời chuyển (mà không đổi tên
phiện bản Release tới cung một thư mục
Trang 30Tích hợp dự án
Thêm vị trí của file header, source và libraries vào trong dự án của VC++
Trang 31Bước này sữ cho phép bạn include #include"ecp.h", và chỉ định đường dẫn đầy đủ hay tương đối đồng thời vì thư viện cũng nằm trên đường dẫn (được đặt một cái tên thích hợp) bây giờ có thể đưa #pragma để thêm vào đường link tới thư mục thích hợp
Trang 32Kiểm tra xem mã nguốn chính xác chưa
Kiểm tra config.h (xem ở dưới)
Sắp lại các Disable Precompiled Headers
Cập nhật thư viện
Cập nhật trình biên
Post tới Crypto++ Newsgroup
Liên hệ với Microsoft Support
Kiểm lại config.h
Tùy thuộc vào phiện bản của Visual Studio, một vài lần biên dịch thay đổi là xảy ra Và lờ đi không chú ý tới _MSC_VER < 1300 nếu sử dụng Visual Studio 7.1 hay cao hơn, thay đổi những thứ sau đây có thể sẽ tốt
Collapse
// how to declare class constants
#if defined(_MSC_VER) && _MSC_VER <= 1300
# define CRYPTOPP_CONSTANT(x) enum {x};
Trang 34Lỗi biên dịch 1189
Nếu không hợp giữa C Runtime và MFC (VD: MFC như là một DLL, Crypto++ và C Runtime như là Static Library), thì lỗi COMPILE 1189 (C1189sẽ được hiển thị như sau:
Cảnh báo biên dịch 4530
Nếu nhận được cảnh báo biên dịch COMPILE 4530 (C4530) (như sau)