Tải bản đầy đủ (.pdf) (68 trang)

Bảo vệ bản quyền phần mềm với hệ chữ kí điện tử rsa

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.58 MB, 68 trang )

MỤC LỤC

CHƢƠNG 1: GIỚI THIỆU .................................................................................................. 3
1.1.
1.2.

MỤC ĐÍCH, YÊU CẦU ............................................................................................... 3
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.
4.2.
4.3.
4.4.
4.5.

CÁCH CÀI ĐẶT THƢ VIỆN CRYPTO++ ....................................................................... 25
CÁCH BIÊN DỊCH VÀ TÍCH HỢP BỘ THƢ VIỆN CRYPTO++ TRONG VISUAL C++ ................ 25
NỐI KẾT TĨNH ..................................................................................................... 26
NỐI KÊT ĐỘNG .................................................................................................... 27
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.
6.2.
6.3.
6.4.


TỔNG QUAN CHƢƠNG TRÌNH .................................................................................. 61
CHỨC NĂNG CHƢƠNG TRÌNH CHẠY TRÊN PHÍA SERVER ................................................ 61
CHỨC NĂNG CHƢƠNG TRÌNH PHÍA CLIENT ................................................................ 64
KHẢ NĂNG ỨNG DỤNG CỦA CHƢƠNG TRÌNH ............................................................ 67

TÀI LIỆU THAM KHẢO: ................................................................................................... 68

Trang 1


Lờ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 2



Chươ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 3


Chươ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ữ
ký điện tử.
Một phương pháp chữ ký điện tử được định nghĩa là một bộ năm (P, A, K, S,
V) thỏa các điều kiện sau:
- P là tập hợp hữu hạn các thông điệp.
- A là tập hợp hữu hạn các chữ ký có thể được sử dụng.
- 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ý sigk  S 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:

true if y sig(x)
{
x  P, y  A : ver( x, y)  false if y sig(x)

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 4



Thuậ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 đượckhô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 5



2.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.
Tính: n=pq.
Tính: giá trị hàm số Ơle.

 (n)  ( p  1)(q  1)

Chọn một số tự nhiện e sao cho 1với  (n) .
Tính: d sao cho: de ≡ 1(mod (n))
Một số lưu ý:
- 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

d 

x( p  1)(q  1)  1
cũng là số tự nhiện. Khi đó sử dụng giá trị
e

d mod( p  1)(q  1) .
Từ bước 3, PKCS#1 v2.1 sử dụng 

 LCM ( p 1, q 1)

thay cho


  ( p  1)(q  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).
Khóa bí mật bao gồm:
n, môđun, xuất hiện cả trong khóa công khai và khóa bí mật, và d, số mũ bí
mật (cũng gọi là số mũ giải mã).
Một dạng khác của khóa bí mật bao gồm:

Trang 6


p 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:

c  me mod n
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  c

d

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
giải mã hoạt động vì ta có

c d ≡ (m e ) d ≡ m ed (mod n)
Do ed ≡ 1 (mod p- 1) và ed ≡ 1 (mod q- 1), (theo Định lý Fecmat ≡nhỏ) nên:

med ≡ m(mod p)
ed

Và m



m(modq)

Trang 7


Do p và q là hai số nguyên tố cùng nhau, áp dụng định lý số dư Trung Quốc,
ta có:

med ≡ m(mod pq)

hay:

cd



m(mod n)

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
q = 53
n = pq =
3233

— số nguyên tố thứ nhất (giữ bí mật hoặc hủy sau khi tạo
khóa)
— số nguyên tố thứ hai (giữ bí mật hoặc hủy sau khi tạo khóa)
— môđun (công bố công khai)

e = 17

— số mũ công khai

d = 2753

— số mũ bí mật


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) = me mod n = m17 mod 3233 với m là văn bản rõ.
Hàm giải mã là: decrypt(c) = cd 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:
encrypt(123) = 12317 mod 3233 = 855
Để giải mã văn bản có giá trị 855, ta thực hiện phép tính:
decrypt(855) = 8552753 mod 3233 = 123
Cả hai phép tính trên đều có thể được thực hiện hiệu quả nhờ giải thuật bình
phương và nhân.
Trang 8


2.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= Z n và đị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) =
với, n x y∈

xa

mod n và verK(x, y) = true  x ≡

y b (mod n),

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 9


2.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 me=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 10


Nă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 11


ngoà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 12


- 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 13



cấ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 14



Hì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 15


kế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 16


Chú ý: 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 17


Tuy 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 18


}
else
// Xử lý lỗi ở đây
Cách thứ hai là:
if (m_sMySocket.Connect("178.1.25.82", 4000))
{
// Tiếp tục
}
else
// 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 19


// 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 20


bộ đệ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:
CString strMyMessage;
int iLen;
int iAmtSent;
.
.
.
iLen = strMyMessage.GetLength();
iAmtSent = m_sMySocket.Send(LPCTSTR(strMyMessage), iLen);
if (iAmtSent == SOCKET_ERROR)
{
// Xử lý một lỗi nào đó ở đây
}
else
{
// Mọi việc đều tốt đẹp
}
Khi dữ liệu sẵn sàng nhận từ ứng dụng khác, một sự kiện được kích
hoạt trên ứng dụng nhận. Điều này cho phép ứng dụng biết rằng nó có thể
nhận và xử lý thông điệp. Để nhận thông điệp, Phương thức Receive phải

được gọi. Phương thức này sử dụng các tham số tương tự như phương thức
Trang 21


Send 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];
int iBufSize = 1024;
int iRcvd;
CString strRecvd;
iRcvd = m_sMySocket.Receive(pBuf, iBufSize);
if (iRcvd == SOCKET_ERROR)
{
// Xử lý một lỗi nào đó ở đây
}
else
{
pBuf[iRcvd] = NULL;
strRecvd = pBuf;
// Tiếp tục xử lý thông điệp
}

Trang 22



3.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:
m_sMySocket. Close();
Sự kiện Socket:
Nguyên nhân chính của việc tạo lớp kế thừa CAsyncSocket là chúng ta
muốn xử lý sự kiện được kích hoạt khi nhận thông điệp, hoàn thành kết nối,
… Lớp CAsyncSocket có một loạt hàm được gọi cho từng sự kiện. Tất cả các
hàm này đều dùng cùng một định nghĩa, chỉ có tên hàm là khác, và chúng bị
phủ trong các lớp kế thừa. Tất cả các hàm này đều có một tham số nguyên,
đây là mã báo lỗi phải được kiểm tra để chắc chắn rằng không xuất hiện lỗi.
Hàm

OnAccept

Đặc tả sự kiện
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.
Được gọi trên Socket để thông báo rằng ứng dụng ở đầu kết

OnClose

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.
Được gọi trên Socket để thông báo rằng kết nối với ứng

OnConnect

dụng khác đã hoàn thành và ứng dụng có thể gửi nhận

thông điệp qua Socket.
Thông báo sự kiện dữ liệu đã được nhận thông qua kết nối

OnReceive

Socket và dữ liệu đã sẵn sàng được truy nhập thông qua gọi
hàm Receive

Trang 23


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

OnSend

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:
int iErrCode;
iErrCode = m_sMySocket.GetLastError();
switch (iErrCode)
{

case WASNOTINITIALISED:
...
...
...
}

Trang 24


Chươ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 25


×