1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Viết chương trình trò chuyện đơn giản bằng ngôn ngữ lập trình c

55 14 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Viết chương trình trò chuyện đơn giản bằng ngôn ngữ lập trình c#
Tác giả Nguyễn Văn Xuân
Người hướng dẫn Th.S Ngô Đình Thưởng
Trường học Đại Học Đà Nẵng
Chuyên ngành Khoa Tin Học
Thể loại Khóa luận tốt nghiệp
Thành phố Đà Nẵng
Định dạng
Số trang 55
Dung lượng 1,56 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Cấu trúc

  • Chương 1: CƠ SỞ LÝ THUYẾT VÀ ỨNG DỤNG (8)
    • 1.1. Sơ lƣợc về lập trình Socket (0)
      • 1.1.1. Khái niệm IPAddress và Port (8)
      • 1.1.2. Lớp IPAddress (8)
      • 1.1.3. Lớp IPEndPoint (9)
      • 1.1.4. Lập trình Socket hướng kết nối(TCP) (9)
      • 1.1.5. Lập trình Socket phi kết nối(UDP) (10)
      • 1.1.6. Lớp Helper của C# Socker (11)
    • 1.2. Xử lý tiến trình trong lập trình đa luồng (15)
      • 1.2.1. Khái niệm luồng (15)
      • 1.2.2. Khảo sát namespace System.Threading (16)
    • 1.3. Đồng bộ và bất đồng bộ trong lập trình đa luồng (19)
    • 1.4. Hệ mã hóa công khai RSA (22)
      • 1.4.1. Khái niệm mã hóa (22)
      • 1.4.2. Hệ mã khóa (24)
      • 1.4.3. Thuật toán mã hóa RSA (25)
  • Chương 2: PHÂN TÍCH VÀ THIẾT KẾ CHƯƠNG TRÌNH (30)
    • 2.1. Phân tích (30)
      • 2.1.1. Phân tích nhu cầu thực tiễn (30)
      • 2.1.2. Yêu cầu đề ra (30)
      • 2.1.3. Phân tích các thành phần xử lý (30)
      • 2.1.4. Quá trình xử lý của chương trình (39)
    • 2.2. Thiết kế (45)
      • 2.2.1. Thiết kế Server (45)
      • 2.2.2. Thiết kế Client (48)
    • 2.3. Cài đặt và sử dụng chương trình (52)
  • KẾT LUẬN (54)

Nội dung

CƠ SỞ LÝ THUYẾT VÀ ỨNG DỤNG

Xử lý tiến trình trong lập trình đa luồng

Một luồng (Thread) trong C# là chuỗi thực thi liên tiếp bắt đầu từ phương thức main() và kéo dài cho đến khi hàm này kết thúc Cấu trúc này phù hợp cho các chương trình thực hiện nhiệm vụ liên tiếp, nhưng thường thì chương trình cần xử lý nhiều công việc đồng thời Chẳng hạn, khi tải một trang web trên Internet Explorer, người dùng có thể nhấn nút quay lại hoặc chọn một liên kết khác, yêu cầu trình duyệt thực hiện ít nhất ba công việc cùng lúc.

 Lấy dữ liệu được trả về từ Internet cùng với các tập tin đi kèm

 Xem người dùng có nhập để làm thứ gì khác không Để đơn giản vấn đề này ta giả sử Internet Explorer chỉ làm hai công việc:

 Xem người dùng có nhập để làm thứ gì khác không

Để kiểm tra xem người dùng có nhập liệu hay không, chúng ta sẽ viết một phương thức để lấy và trình bày trang Web Do thời gian trình bày có thể kéo dài do thực thi JavaScript hoặc hiệu ứng, phương thức này sẽ kiểm tra hoạt động nhập liệu sau mỗi 1/12 giây Nếu có dữ liệu nhập vào, nó sẽ được xử lý, còn nếu không, trang sẽ tiếp tục được trình bày Việc viết phương thức này khá phức tạp, vì vậy chúng ta sẽ sử dụng kiến trúc sự kiện trong Window, cho phép hệ thống thông báo cho ứng dụng khi có sự kiện nhập liệu xảy ra.

 Ta sẽ viết một bộ xử lí event để đáp ứng đối với việc nhập của người dùng

 Ta sẽ viết một phương thức để lấy và trình bày dữ liệu Phương thức này được thực thi khi ta không làm bất cứ điều gì khác

Phương thức lấy và trình bày trang web làm việc tự định thời gian, khiến máy tính không thể đáp ứng việc nhập của người dùng trong khi chạy Do đó, nó cần định thời gian để kiểm tra việc nhập, đồng thời lưu trữ trạng thái trước khi gọi phương thức khác, để có thể quay lại đúng vị trí sau khi phương thức hoàn tất Vào thời Windows 3.1, đây là cách duy nhất để xử lý tình huống này Tuy nhiên, với NT3.1 và Windows 95 trở đi, việc xử lý đa luồng đã giúp giải quyết vấn đề này một cách tiện lợi hơn Bài viết sẽ khám phá một số lớp cơ bản trong ngôn ngữ lập trình C# và vấn đề đồng bộ hóa trong lập trình đa luồng.

1.2.2 Khảo sát namespace System.Threading

Namespace System.Threading cung cấp các kiểu dữ liệu cần thiết cho lập trình đa luồng, bao gồm các lớp quản lý collection luồng (ThreadPool), lớp Timer đơn giản không dựa vào GUI, và các lớp hỗ trợ truy cập đồng bộ vào dữ liệu chia sẻ.

Một số lớp của namespace System.Threading:

Các lớp thành viên Mô tả

Interlocked Lớp này dùng cung cấp truy cập đồng bộ hóa vào dữ liệu được chia sẽ sử dụng (shared data).

Moniter Lớp này cung cấp việc đồng bộ hóa các đối tượng luồng sử dụng khóa chốt (lock) và tín hiệu chờ (wait signal).

Mutex Lớp này cung cấp việc đồng bộ hóa sơ đẳng có thể được dùng đối với inter process synchronization.

Lớp Thread đại diện cho một luồng thực thi trong Common Language Runtime, cho phép bạn tạo và quản lý các luồng khác trong cùng một ứng dụng.

ThreadPool Lớp này quản lý những luồng có liên hệ với nhau trong cùng một Process nào đó.

Timer Cho biết một delegate có thể được triệu gọi vào một lúc được khai báo nào đó Tác vụ wait được thi hành bởi luồng trong thread pool.

WaitHandle Lớp này tượng trưng cho tất cả các đối tượng đồng bộ hóa (cho phép multiple wait) vào lúc chạy.

ThreadStart Lớp này là một delegate chỉ về hàm hành sự nào đó phải được thi hành đầu tiên khi một luồng bắt đầu.

TimerCallBack Delegate đối với Timer.

WaitCallBack Lớp này là một delegate định nghĩa hàm hành sự kêu gọi lại (callback) đối với ThreadPool user work item.

Lớp Thread trong Namespace System.Threading là lớp đơn giản nhất, đại diện cho một vỏ bọc hướng đối tượng xung quanh một lộ trình thi hành trong AppDomain Lớp này cung cấp các hàm thực thi, bao gồm cả static và shared, cho phép người dùng tạo mới luồng từ luồng hiện tại, cũng như thực hiện các thao tác như Sleep, Stop hoặc Kill một luồng cụ thể.

Các thành phần static của lớp Thread:

Các thành phần Static Mô tả

CurrentThread Thuộc tính read-only này trả về một quy chiếu về luồng hiện đang chạy.

GetData() Đi lấy vị trí từ slot được khai báo trên luồng hiện hành đối với domain hiện hành trong luồng.

SetData() Cho đặt để trị lên slot được khai báo trên luồng hiện hành đối với domain hiện hành trong luồng

GetDomainID() Đi lấy một qui chiếu về AppDomain hiện hành (hoặc mã nhận diện ID của domain này) mà luồng hiện đang chạy trên đó.

Sleep() Cho ngưng luồng hiện hành trong một thời gian nhất định được khai báo.

Ngoài ra lớp Thread cũng hổ trợ các thành viên cấp đối tượng.

Các lớp thành viên Mô tả

IsAlive Thuộc tính này trả về một trị boolean cho biết liệu xem luồng đã khởi đông hay chưa.

IsBackground Đi lấy hoặc đặt để giá trị cho biết liệu xem luồng là một luồng nền hay không.

Name Thuộc tính này cho phép bạn thiết lập một tên văn bản mang tính thân thiện đối với luồng.

Priority Đi lấy hoặc đặt để ưu tiên của một luồng Có thể được gán một trị lấy từ enumeration ThreadPriority (chẳng hạn Normal, Lowest, Highest, BelowNormal, AboveNormal).

ThreadState Đi lấy hoặc đặt để tình trạng của luồng Có thế được gán từ enumeration ThreadState (chẳng hạn

Interrup() Cho ngưng chạy luồng hiện hành.

Join() Yêu cầu luồng chờ đối với luồng bị ngưng chạy.

Resume() Tiếp tục lại đối với một luồng bị ngưng chạy.

Start() Cho bắt đầu thi hành luồng được khai báo bởi delegate

Suspend() Cho ngưng chạy một luồng Nếu luồng đã bị ngưng rồi, một triệu gọi hàm Suspend() sẽ không có tác dụng.

Abort() Kết thúc một tiểu trình bằng cách nén ngoại lệ

System.Threading.ThreadAbortException trong mã lệnh đang được chạy

Mã lệnh của tiểu trình bị hủy có thể tắt ngoại lệ ThreadAbortException để thực hiện dọn dẹp, nhưng bộ thực thi sẽ tự động nén ngoại lệ này để đảm bảo tiểu trình kết thúc, trừ khi có lệnh ResetAbort được gọi.

Đồng bộ và bất đồng bộ trong lập trình đa luồng

Đôi khi, bạn cần kiểm soát quyền truy cập vào các thuộc tính hoặc hàm của một đối tượng, đảm bảo chỉ một mạch trình được phép thay đổi hoặc sử dụng nguồn lực đó Đồng bộ hóa được thực hiện thông qua một khóa trên đối tượng, ngăn chặn luồng khác truy cập khi mạch trình hiện tại chưa hoàn thành công việc.

Trong phần này, chúng ta sẽ tìm hiểu về cơ chế đồng bộ hóa mà Common Language Runtime cung cấp thông qua lệnh lock Để minh họa, chúng ta sẽ sử dụng một biến số nguyên đơn giản làm nguồn lực chia sẻ, cụ thể là biến đếm counter Đầu tiên, chúng ta khai báo biến thành viên và khởi gán giá trị ban đầu là zero: int counter = 0;

Bài toán đặt ra là hai luồng thực hiện việc đọc và tăng giá trị của biến counter Luồng thứ nhất đọc giá trị counter (0), gán cho biến trung gian temp, tăng temp, và sau đó ngủ một khoảng thời gian Khi luồng thứ nhất hoàn thành, nó gán giá trị temp trở lại counter và hiển thị kết quả Trong khi đó, luồng thứ hai thực hiện tương tự Quá trình này được lặp lại 1000 lần với mong đợi rằng biến counter sẽ tăng lần lượt và hiển thị kết quả 1, 2, 3, 4,… Tuy nhiên, kết quả thực tế lại khác với mong đợi, như sẽ thấy trong đoạn chương trình dưới đây.

{ private int counter = 0; static void Main(string[] args)

Thread t1 = new Thread(new ThreadStart(Incrementer)); t1.IsBackground = true; t1.Name = "Thread One"; t1.Start();

Console.WriteLine("Start thread {0}", t1.Name);

Thread t2 = new Thread(new ThreadStart(Incrementer)); t2.IsBackground = true; t2.Name = "Thread Two"; t2.Start();

Console.WriteLine("Start thread {0}", t2.Name); t1.Join(); t2.Join();

Console.WriteLine("All my threads are done.");

Incrementer: {1}", Thread.CurrentThread.Name, counter); }

{ Console.WriteLine("Thread {0} interrupted! Cleaning up ", Thread.CurrentThread.Name); } finally

{ Console.WriteLine("Thread {0} Existing.", Thread.CurrentThread.Name);

Kết quả đạt được là :

Hình 1.3 Kết quả chương trình đồng bộ hóa

Để đồng bộ hóa việc truy cập đối tượng counter trong C#, ta cần sử dụng đối tượng Lock Lock đánh dấu một critical section trong mã và cung cấp sự đồng bộ hóa cho đối tượng được chỉ định Cú pháp sử dụng Lock yêu cầu khóa một đối tượng, thực thi một câu lệnh hoặc khối lệnh, và sau đó mở khóa ở cuối C# hỗ trợ việc khóa chặt thông qua từ khóa lock, với cú pháp là lock(expression) statement-block.

Trong ví dụ trên, để có được kết quả như mong muốn, ta sẽ sửa hàm

Incrementer lại như sau: try

Kết quả thu được sẽ là:

Hệ mã hóa công khai RSA

Trong mọi lĩnh vực như kinh tế, chính trị, xã hội và quân sự, việc trao đổi thông tin giữa cá nhân, công ty, tổ chức và quốc gia là rất cần thiết Với sự phát triển mạnh mẽ của công nghệ thông tin, đặc biệt là internet, việc truyền tải thông tin đã trở nên dễ dàng và nhanh chóng hơn bao giờ hết.

Tính bảo mật trong quá trình truyền tải thông tin là cực kỳ quan trọng, đặc biệt đối với các thông tin liên quan đến chính trị, quân sự và hợp đồng kinh tế Do đó, ngành khoa học nghiên cứu về mã hóa thông tin đã được phát triển mạnh mẽ Mã hóa giúp biến đổi thông tin sang một dạng khác, chỉ có bên gửi và bên nhận mới có khả năng đọc được, trong khi những người bên ngoài dù có nhận được thông tin cũng không thể hiểu được nội dung.

Hình 1.6 Mã hóa và giải mã thông tin được truyền đi

Như chúng ta thấy ở mô hình 1.5 : Việc trao đổi thông tin được thực hiện qua các bước sau:

 Tạo ra thông tin cần gởi đi

 Gởi thông tin này cho đối tác Ở mô hình 1.6: Việc trao đổi thông tin được thực hiện:

 Tạo thông tin cần gởi

 Mã hóa và gởi thông tin đã được mã hóa đi

 Đối tác nhận và giải mã thông tin

 Đối tác có được thông tin ban đầu của người gởi.

Với 2 thao tác mã hóa và giải mã ta đã đảm bảo thông tin được gửi an toàn và chính xác

Chúng ta có nhiều phương pháp để mã hóa thông tin: Ở đây ta tìm hiểu về hệ mã hóa công khai RSA

Mã khóa bí mật là phương pháp mã hóa thông tin dựa trên một key, được sử dụng để mã hóa và giải mã dữ liệu Việc giữ bí mật cho key là rất quan trọng, vì chỉ có người lập mã và người nhận mới biết đến nó Nếu key bị lộ, thông tin sẽ dễ dàng bị giải mã và đọc bởi những người không được phép.

Hình 1.7 Mã hóa bí mật

Mã khóa công khai: sử dụng 2 key public key- private key

Khóa công khai được sử dụng để mã hóa thông tin mà bạn muốn chia sẻ với bất kỳ ai Do đó, bạn có thể tự do phát tán nó cho những người cần nhận thông tin ở dạng mã hóa.

Khóa riêng tư, đúng như tên gọi, là tài sản cá nhân của bạn (đối với khóa công khai) và được sử dụng để giải mã thông tin Chỉ có bạn mới sở hữu khóa này, vì vậy nó không nên và không được phép chia sẻ với bất kỳ ai khác.

Nghĩa là mỗi người sẽ giữ 2 key 1 dùng để mã hóa key này được công bố rộng rãi, 1 dùng để giải mã key này giữ kín

Khi ai đó muốn trao đổi thông tin với bạn, họ sẽ sử dụng khóa công khai (public key) mà bạn đã công bố để mã hóa thông tin và gửi đến bạn Khi bạn nhận được thông tin, bạn sẽ dùng khóa riêng (private key) của mình để giải mã Những người khác, dù có nhận được thông tin, nhưng không có khóa riêng, sẽ không thể giải mã và đọc được nội dung.

Hình 1.8 Mã hóa công khai

1.4.3 Thuật toán mã hóa RSA

Thuật toán RSA sử dụng hai loại khóa: khóa công khai và khóa bí mật Khóa công khai được phát tán rộng rãi và dùng để mã hóa thông tin, trong khi khóa bí mật chỉ được giữ bởi người sở hữu, cho phép họ giải mã thông tin đã được mã hóa Điều này có nghĩa là bất kỳ ai cũng có thể mã hóa dữ liệu, nhưng chỉ những người nắm giữ khóa bí mật mới có khả năng giải mã chúng.

Ta có thể mô phỏng trực quan một hệ mật mã khoá công khai như sau :

B muốn gửi thông tin mật cho A, vì vậy A đã gửi cho B một chiếc hộp có khóa mở sẵn để B có thể bảo mật nội dung B nhận hộp, cho vào một tờ giấy và khóa lại, khiến cho ngay cả B cũng không thể mở lại để đọc hay sửa thông tin Sau đó, B gửi hộp trở lại cho A, người dùng chìa khóa của mình để mở và đọc thông tin trong thư Trong trường hợp này, chiếc hộp với khóa mở là khóa công khai, trong khi chìa khóa của A là khóa bí mật.

Để A và B có thể trao đổi thông tin bí mật qua kênh không an toàn như Internet, thuật toán RSA được sử dụng Đầu tiên, A cần tạo cặp khóa công khai và khóa bí mật bằng cách chọn hai số nguyên tố lớn p và q khác nhau, sau đó tính n = pq và giá trị hàm số (n) = (p-1)(q-1) Tiếp theo, A chọn một số tự nhiên e sao cho 1 < e < (n) và e phải nguyên tố cùng nhau với (n) Cuối cùng, A tính d sao cho de ≡ 1 (mod (n)) và công bố cặp khóa (n, e).

 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 Euclide mở rộng

 Bước 5 có thể viết cách khác: Tìm số tự nhiên x sao cho d = cũng là số tự nhiên

 Khi đó sử dụng giá trị d=mod(p-1)(q-1)

 Từ bước 3 sử dụng =LCM(p-1,q-1) thay cho  (n)=(p-1)(q-1)

Khóa công khai bao gồm:

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

 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 )

Dạng này sử dụng định lý số dư Trung Quốc (CRT) để tăng tốc độ giải mã và ký Để đảm bảo an toàn, tất cả các thành phần của khóa bí mật cần được giữ kín.

A gửi khóa công khai cho B và giữ bí mật khóa cá nhân của mình Trong quá trình này, p và q đóng vai trò quan trọng, vì chúng là các phân tố của n và giúp tính toán d khi biết e Nếu không áp dụng dạng CRT cho khóa bí mật, p và q sẽ bị xóa ngay sau khi quá trình tạo khóa hoàn tất.

Trong quá trình gửi thông tin, B muốn truyền đạt đoạn thông tin M cho A bằng cách chuyển đổi M thành một số m nhỏ hơn n thông qua một hàm

Hàm trên có thể tính dễ dàng sử dụng phương pháp tính hàm mũ (theo môđun) bằng (thuật toán bình phương và nhân) Cuối cùng B gửi c cho A

A 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: c≡c d mod n

Biết m, A 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ý Fermat nhỏ) nên: m ed  m (mod p) và m ed  m (mod q)

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ó: m ed  m (mod pq) hay: c d  m (mod n)

Dưới đây là một ví dụ cụ thể với các số liệu nhỏ để thuận tiện cho việc tính toán; tuy nhiên, trong thực tế, cần sử dụng các số có giá trị lớn hơn để đạt được kết quả chính xác hơn.

Để tạo khóa mã hóa, ta sử dụng hai số nguyên tố: p = 61 và q = 53, giữ bí mật hoặc hủy sau khi tạo khóa Môđun n được tính bằng tích của p và q, n = pq = 3233, và được công bố công khai Số mũ công khai e là 17, trong khi số mũ bí mật d là 2753.

Khóa công khai được định nghĩa là cặp (e, n) với e = 17 và n = 3233, trong khi khóa bí mật là d = 2753 Hàm mã hóa được sử dụng là encrypt(m) = m^e mod n, với m là văn bản rõ Cụ thể, để mã hóa văn bản có giá trị 123, ta thực hiện phép tính: encrypt(123) = 123^17 mod 3233 = 855 Để giải mã văn bản có giá trị 855, ta áp dụng hàm giải mã: decrypt(c) = c^d mod n, và kết quả là decrypt(855) = 855^2753 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

Chuyển đổi văn bản rõ

PHÂN TÍCH VÀ THIẾT KẾ CHƯƠNG TRÌNH

Phân tích

2.1.1 Phân tích nhu cầu thực tiễn

Với sự phát triển mạnh mẽ của Internet, nhu cầu trao đổi thông tin và trò chuyện ngày càng trở nên cần thiết Hiện tại, nhiều phần mềm chat như Yahoo, Skype, Sococo, và ZingChat đã đáp ứng nhu cầu này Tuy nhiên, việc phát triển một chương trình chat riêng sẽ mang lại sự đa dạng và phong phú hơn cho các hình thức giao tiếp.

2.1.2 Yêu cầu đề ra Để xây dựng thành công một chương trình Chat cần phải đáp ứng được nhưng tính năng sau:

 Gởi tin nhắn riêng tư giữa 2 người với nhau

 Có thể chat trong một nhóm người

 Tùy chọn để mã hóa tin nhắn trước khi truyền đi để đảm bảo tính riêng tư và bảo mật thông tin

Đảm bảo tính chính xác và toàn vẹn dữ liệu là yếu tố quan trọng trong quá trình gửi và nhận tin nhắn giữa mọi người Hệ thống cần có thao tác linh hoạt, nhanh chóng và dễ sử dụng để mang lại trải nghiệm tốt nhất cho người dùng.

2.1.3 Phân tích các thành phần xử lý

Khi có một người muốn đăng nhập vào hệ thống họ phải nhập một Username để kết nối đến Server Trong quá trình đăng nhập sẽ gởi một request

Khi thực hiện lệnh “CONNECT” đến Server, quá trình lắng nghe các kết nối sẽ giúp Server xác định đối tượng vừa đăng nhập Thông tin này sau đó được đưa vào danh sách Client để quản lý hiệu quả về thông tin và kết nối.

Khi một Client kết nối thành công, Server sẽ thông báo cho các Client khác về sự kết nối mới và đồng thời cập nhật danh sách bạn bè (Friendlist) cho tất cả Client còn lại.

Hình 2.1 Sơ đồ xử lý đăng nhập

When a user wishes to log out of the system, they send a "DISCONNECT" request to initiate the logout process, while simultaneously sending a "REQUESTUSER" request to update their friend list on the server.

Khi nhận yêu cầu đăng xuất từ người dùng, server sẽ ngắt kết nối với người dùng đó và thông báo cho các người dùng khác về việc đăng xuất Đồng thời, server cũng sẽ cập nhật lại danh sách bạn bè cho tất cả người dùng.

Gởi Ursername, Connect và yêu cầu gởi FriendList

Chấp nhận kết nối và gởi FriendList

Thông báo có người online

Hình 2.2 Sơ đồ xử lý đăng xuất

2.1.3.3 Xử lý gởi tin nhắn

Người dùng có thể nhập tin nhắn và chọn người gửi, bao gồm cả tin nhắn riêng tư và công khai Chương trình sẽ tạo gói tin chứa nội dung tin nhắn, tên người gửi và người nhận, sau đó hiển thị tin nhắn trên màn hình chính Cuối cùng, gói tin sẽ được mã hóa và gửi đi.

Tại Server, gói tin từ người dùng sẽ được nhận và chuyển tiếp đến tất cả người dùng khác Các người dùng sẽ tiến hành giải mã gói tin để khôi phục lại nội dung ban đầu và kiểm tra xem gói tin đã đến đúng đích hay chưa.

Chọn chức năng đăng xuất

Gởi yêu cầu đăng xuất và gởi yêu cầu gởi FrendList

Hiển thị màn hình đăng nhập

Gửi thông báo đăng xuất của người dùng và kiểm tra danh sách bạn bè; nếu có bạn bè trùng với người dùng, nội dung sẽ được hiển thị Nếu gói tin là thông tin của tin nhắn công khai, tất cả người dùng sẽ thấy nội dung tin nhắn đó.

Tin nhắn trước khi được gởi đi từ Client sẽ được gán các thông điệp tương ứng vào như để gởi tới Server

Hình 2.3 Sơ đồ xử lý gởi tin nhắn

2.1.3.4 Xử lý mã hóa và giải mã tin nhắn

Trong quá trình trò chuyện giữa mọi người với nhau, người dùng có thể

Nhập nhắn và tin định xác đích đến

Yêu cầu gởi tin nhắn

Kiểm tra nếu là thông điệp đã mã hóa thì giải mã gởi tin và kiểm tra đích đến

Lựa chọn chức năng mã hóa hay không

Gởi tin nhắn và người nhận

Trước khi gửi tin nhắn, cần hiển thị lựa chọn chức năng mã hóa để bảo đảm tính riêng tư và tính bảo mật, đặc biệt đối với những tin nhắn quan trọng.

Khi lựa chọn chức năng mã hóa, một tin nhắn sẽ được gán một biến dạng chuỗi để xác định xem nội dung của tin nhắn đó đã được mã hóa hay chưa.

Tin nhắn trước khi gởi đi sẽ có dạng:

SendData("CHAT|" + Ecrypt(txtSend.Text)+(char)13 +(char)10+str+en); là tin nhắn với nội dung đã được mã hóa trước khi truyền đi hoặc là:

SendData("CHAT|" + txtSend.Text + str);

 str: là đích người cần gởi

 en: là biến chuỗi đánh dấu tin nhắn đã được mã hóa

 Ecrypt(): là hàm để mã hóa tin nhắn

Dựa trên lý thuyết RSA, hàm Ecrypt() sẽ được xây dựng để mã hóa tin nhắn trước khi gửi đi Thuật toán mã hóa RSA dựa trên các nguyên tắc toán học để thực hiện quá trình mã hóa Trước khi mã hóa, tin nhắn sẽ được chuyển đổi sang mã ASCII Đoạn mã thực hiện quá trình này bao gồm việc xác định độ dài của chuỗi, chuyển đổi chuỗi thành mảng ký tự, và sau đó chuyển đổi từng ký tự thành giá trị ASCII tương ứng.

Sau đó dựa vào cơ sở toán học sẽ mã hóa từng kí tự trong chuỗi tin nhắn đã được chuyển thành mã Ascii

Thuật toán RSA sử dụng hai loại khóa: khóa công khai và khóa bí mật Khóa công khai được phát hành cho mọi người và dùng để mã hóa thông tin, trong khi khóa bí mật chỉ được người sở hữu biết và dùng để giải mã Điều này có nghĩa là bất kỳ ai cũng có thể mã hóa dữ liệu, nhưng chỉ những người nắm giữ khóa bí mật mới có khả năng giải mã thông tin đó.

Quá trình tạo khóa: private void taoKhoa()

//Tạo hai số nguyên tố ngẫu nhiên khác nhau do { p = soNgauNhien(); q = soNgauNhien();

//Tính e là một số ngẫu nhiên có giá trị 0< e

Ngày đăng: 09/05/2021, 17:06

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
1. Giáo trình “Mạng Máy Tính” , khoa Tin Học ĐH Sư Phạm Sách, tạp chí
Tiêu đề: Mạng Máy Tính
2. Giáo trình “Lập Trình Chuyên Nâng Cao”, Tác Giả: Trần Uyên Trang Sách, tạp chí
Tiêu đề: Lập Trình Chuyên Nâng Cao
3. Giáo trình “Truyền Và Bảo Mật Thông Tin”, Lê Thị Bích Hồng Sách, tạp chí
Tiêu đề: Truyền Và Bảo Mật Thông Tin
4. Dương Quang Thiện, 2005, .NET toàn tập Khác
5. Nguyễn Ngọc Bình Phương, 2005, Các giải pháp lập trình C# Khác
6. Mai Lam, 2010, Giáo trình lập trình ứng dụng mạng. Website Khác

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w