Tổng quan về mật mã học
Mật mã học
Mật mã học là ngành khoa học ứng dụng toán học để biến đổi thông tin thành dạng khác nhằm che giấu nội dung và ý nghĩa cần mã hóa Ngành này đóng vai trò quan trọng với nhiều ứng dụng trong đời sống xã hội, đặc biệt là trong các lĩnh vực an ninh, quân sự, và dân sự như thương mại điện tử và ngân hàng Hiện nay, việc sử dụng mã hóa và bảo mật thông tin ngày càng trở nên phổ biến trên toàn cầu.
Sự phát triển của khoa học máy tính và Internet đã thúc đẩy sự đa dạng trong nghiên cứu và ứng dụng khoa học mật mã, mở ra nhiều hướng nghiên cứu chuyên sâu cho từng lĩnh vực cụ thể Ứng dụng của khoa học mật mã không chỉ giới hạn ở việc mã hóa và giải mã thông tin, mà còn bao gồm các vấn đề như chứng thực nguồn gốc thông tin thông qua chữ ký điện tử, chứng nhận tính xác thực của người sở hữu mã khóa với chứng nhận khóa công cộng, cũng như các quy trình đảm bảo an toàn cho việc trao đổi thông tin và thực hiện giao dịch điện tử Kết quả nghiên cứu về mật mã đã được tích hợp vào các hệ thống phức tạp hơn, kết hợp với các kỹ thuật khác để đáp ứng nhu cầu đa dạng của các ứng dụng thực tế, chẳng hạn như hệ thống bỏ phiếu trực tuyến, hệ thống đào tạo từ xa và quản lý an ninh cho các tổ chức.
Hệ thống cung cấp dịch vụ multimedia trên mạng cần áp dụng mã hóa và giải mã sinh trắc học để đảm bảo cung cấp dịch vụ hiệu quả và bảo vệ bản quyền sở hữu trí tuệ cho thông tin số.
Hệ thống mã hóa
- Định nghĩa 1.1: Hệ thống mã hóa (cryptosystem) là một bộ năm (P,
C, K, E, D) thỏa mãn các điều kiện sau:
1 Tập nguồn P là tập hữu hạn tất cả các mẩu tin nguồn cần mã hóa có thể có
2 Tập đích C là tập hữu hạn tất cả các mẩu tin có thể có sau khi mã hóa
3 Tập khóa K là tập hữu hạn các khóa có thể được sử dụng
4 E và D lần lượt là tập mã hóa và giải mã với mỗi khóa k € K, tồn tại luật mã hóa e k € E và luật giải mã d k € D tương ứng Luật mã hóa e k : P → C và luật giải mã d k : C→ P là hai ánh xạ thỏa mãn d k (e k (x))= x x € P
Tính chất 4 là yếu tố quan trọng trong hệ thống mã hóa, đảm bảo rằng một mẩu tin x thuộc tập P khi được mã hóa bằng luật mã hóa e k thuộc tập E sẽ được giải mã chính xác thông qua thuật giải mã d k thuộc tập D.
Zm là một tập hợp gồm các số nguyên từ 0 đến m−1, được trang bị phép cộng (+) và phép nhân (×) Trong Zm, phép cộng và phép nhân được thực hiện giống như trong tập hợp số nguyên Z, nhưng kết quả được tính theo modulo m.
Ví dụ : Ta cần tính giá trị 11×13 trong Z16 Trong Z, ta có kết quả phép nhân 11×13 = 143 Do 143 ≡ 15 (mod 16) nên 11×13 = 15 trong Z16
Một số tính chất của Z m :
2 Tính giao hoán của phép cộng trong Z m , a, b Z m , a b b a
3 Tính kết hợp của phép cộng trong Z m, a, b, c Z m , (a b) c a (b c)
4 Z m có phần tử trung hòa là 0, a, b Z m , a 0 0 a a
5 Mọi phần tử a trong Z m đều có phần tử đối là m a
7 Tính giao hoán của phép nhân trong Z m , a, b Z m , a b b a
8 Tính kết hợp của phép nhân trong Z m, a, b, c Z m , (a b) c a (b c)
9 Z m có phần tử đơn vị là 1, a, b Z m , a 1 1 a a
10 Tính chất phân phối của phép nhân đối với phép cộng a, b, c Z m,
Các tính chất 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) đảm bảo rằng thông tin không thể bị thay đổi mà không bị phát hiện Mặc dù tính chất này không ngăn chặn việc thay đổi thông tin, nhưng nó cho phép người nhận nhận biết khi thông tin đã bị nghe lén hoặc thay đổi Để đảm bảo tính toàn vẹn cho thông tin, các hàm một chiều (one-way function) như MD5, SHA-1 và MAC thường được sử dụng.
Authentication ensures that the sender or receiver can prove their identity This process can involve the use of a password, a challenge based on an encryption algorithm, or a shared secret between two parties Authentication can be one-way or mutual, depending on the requirements of the communication.
Tính không chối bỏ (non-repudiation) đảm bảo rằng người gửi hoặc nhận thông tin không thể phủ nhận hành động gửi hoặc nhận đó Thông thường, tính năng này được thực hiện thông qua việc sử dụng chữ ký điện tử (electronic signature).
Tính nhận dạng (identification) trong hệ thống là quá trình xác định người dùng thông qua một chứng minh thư (identity) như chìa khóa ban đầu (primary key) Chứng minh thư này không chỉ xác định các chức năng của người dùng mà còn quy định giới hạn cho phép và các thuộc tính liên quan, thường được gọi là credential Các hình thức nhận dạng có thể bao gồm login, dấu vân tay, ADN, hoặc giản đồ võng mạc mắt.
Hệ thống mã hóa quy ước (mã hóa đối xứng)
Trong hệ thống mã hóa quy ước, việc mã hóa và giải mã thông điệp sử dụng cùng một khóa bí mật hay khóa đối xứng, điều này khiến cho bảo mật thông tin phụ thuộc vào việc giữ bí mật của mã khóa.
Với sự phát triển nhanh chóng của bộ vi xử lý, phương pháp mã hóa chuẩn (DES) đã trở nên không còn an toàn cho bảo mật thông tin Nhằm đáp ứng nhu cầu bảo mật thông tin liên lạc của chính phủ Hoa Kỳ, Viện Tiêu chuẩn và Công nghệ Quốc gia Hoa Kỳ (NIST) đã quyết định chọn một chuẩn mã hóa mới có độ an toàn cao hơn.
The Rijndael algorithm, developed by Vincent Rijmen and Joan Daemen, was officially selected as the Advanced Encryption Standard (AES) on October 2, 2000, and is widely used in both commercial and civilian applications.
Thông điệp nguồn được mã hóa bằng mã khóa k đã được thống nhất giữa người gửi A và người nhận B Người A sử dụng mã khóa k để mã hóa thông điệp x thành thông điệp y và gửi y cho người B Để giải mã thông điệp y, người B cũng cần mã khóa k An toàn bảo mật thông tin mã hóa phụ thuộc vào việc giữ bí mật của mã khóa k; nếu người C biết mã khóa này, họ có thể giải mã thông điệp mà A đã gửi cho B.
1.4.1 Phương pháp mã hóa dịch chuyển :
Phương pháp mã hóa dịch chuyển là một trong những kỹ thuật mã hóa cổ xưa nhất, trong đó thông điệp được mã hóa bằng cách dịch chuyển từng ký tự một k vị trí trong bảng chữ cái.
Trong trường hợp đặc biệt k=3, phương pháp mã hóa dịch chuyển được gọi là phương pháp mã hóa Caesar
Thuật toán 1.1: Phương pháp mã hóa dịch chuyển
Mã hóa dịch chuyển là một phương pháp mã hóa đơn giản với quy trình mã hóa và giải mã nhanh chóng Tuy nhiên, phương pháp này dễ bị tấn công bằng cách thử tất cả các khả năng khóa, vì không gian khóa K chỉ có n phần tử để lựa chọn.
Hình 1.2 : Mô hình hệ thống mã hóa qui ước
Để mã hóa một thông điệp sử dụng các chữ cái từ A đến Z (26 chữ cái), ta áp dụng P = C = K = Z26 Tuy nhiên, phương pháp này không đảm bảo an toàn vì thông điệp có thể bị giải mã dễ dàng bằng cách thử lần lượt 26 giá trị khóa k thuộc K Trung bình, thông điệp mã hóa có thể bị giải mã sau khoảng n/2 lần thử khóa k trong K.
1.4.2 Phương pháp mã hóa thay thế :
Phương pháp mã hóa thay thế (Substitution Cipher) là một trong những kỹ thuật mã hóa nổi bật, đã được áp dụng trong nhiều thế kỷ Phương pháp này thực hiện việc mã hóa thông điệp thông qua việc hoán vị các ký tự trong bảng chữ cái hoặc các phần tử trong tập nguồn P.
Thuật toán 1.2: Phương pháp mã hóa thay thế là một kỹ thuật mã hóa đơn giản, cho phép thực hiện nhanh chóng quá trình mã hóa và giải mã Phương pháp này khắc phục nhược điểm của mã hóa bằng dịch chuyển với không gian khóa K nhỏ, dễ bị giải mã bằng cách thử nghiệm từng giá trị khóa Ngược lại, phương pháp mã hóa thay thế có không gian khóa K lớn với n! phần tử, làm cho việc giải mã bằng cách “vét cạn” mọi trường hợp khóa trở nên khó khăn Tuy nhiên, thông điệp mã hóa vẫn có thể bị giải mã nếu có bảng tần số xuất hiện của các ký tự trong thông điệp hoặc nếu nắm được một số từ, ngữ trong thông điệp nguồn ban đầu.
Phương pháp mã hóa bằng dịch chuyển là một dạng đặc biệt của mã hóa thay thế, sử dụng n giá trị khóa k trong số n! phần tử Trong khi đó, phương pháp Affine cũng là một trường hợp đặc biệt khác thuộc loại mã hóa thay thế.
Thuật toán 1.3: Phương pháp Affine
Phương pháp mã hóa bằng thay thế, bao gồm các biến thể như mã hóa bằng dịch chuyển và mã hóa Affine, thiết lập một ánh xạ duy nhất giữa mỗi phần tử x trong tập P và phần tử y trong tập C tương ứng với một khóa k đã chọn Mỗi khóa k từ tập K tạo ra một song ánh từ P vào C.
Phương pháp Vigenere khác với các phương pháp mã hóa khác ở chỗ nó sử dụng một từ khóa có độ dài m, cho phép thực hiện m phép mã hóa bằng dịch chuyển theo chu kỳ.
Không gian khóa K của phương pháp Vigenere Cipher có số phần tử là n m, lớn hơn nhiều so với không gian khóa K trong phương pháp mã hóa bằng dịch chuyển Vì vậy, việc tìm mã khóa k để giải mã thông điệp đã mã hóa trở nên khó khăn hơn so với phương pháp mã hóa bằng dịch chuyển.
Thuật toán 1.4: Phương pháp mã hóa Vigenere
Phương pháp Hill, được Lester S Hill công bố vào năm 1929, định nghĩa P = C = (Z n ) m cho số nguyên dương m Mỗi phần tử x trong P là một bộ m thành phần, với mỗi thành phần thuộc Zn Ý tưởng chính của phương pháp này là sử dụng m tổ hợp tuyến tính của m thành phần trong mỗi phần tử x để tạo ra m thành phần, từ đó hình thành phần tử y trong C.
Thuật toán 1.5: Phương pháp mã hóa Hill
1.4.6 Phương pháp mã hóa hoán vị :
Các phương pháp mã hóa đều dựa trên nguyên tắc thay thế ký tự trong thông điệp nguồn bằng ký tự khác để tạo ra thông điệp mã hóa Phương pháp mã hóa hoán vị (Permutation Cipher) giữ nguyên các ký tự trong thông điệp nhưng thay đổi vị trí của chúng, tức là thông điệp nguồn được mã hóa thông qua việc sắp xếp lại các ký tự.
Thuật toán 1.6: Phương pháp mã hóa hoán vị
Hệ thống mã hóa khóa công cộng (mã hóa bất đối xứng) và phương pháp RSA
Các phương pháp mã hóa khóa công cộng đơn giản hóa việc trao đổi mã khóa, khác với các phương pháp mã hóa quy ước, nơi bài toán này trở nên phức tạp hơn Khóa công cộng không cần phải giữ bí mật như khóa bí mật trong mã hóa quy ước Bằng cách sử dụng khóa công cộng, chúng ta có thể thiết lập quy trình an toàn để truy xuất khóa bí mật cho hệ thống mã hóa quy ước.
Trong những năm gần đây, phương pháp mã hóa khóa công cộng, đặc biệt là RSA, đã trở thành tiêu chuẩn phổ biến nhất trên Internet Phương pháp này được ứng dụng rộng rãi trong việc bảo mật thông tin liên lạc và thương mại điện tử.
Năm 1978, R.L Rivest, A Shamir và L Adleman đã phát triển hệ thống mã hóa khóa công cộng RSA, còn được biết đến là “hệ thống MIT” Phương pháp này thực hiện tất cả các phép tính trên Z n, trong đó n là tích của hai số nguyên tố lẻ p và q khác nhau, dẫn đến công thức Ф(n) = (p–1)(q–1).
Thuật toán 1.8: Phương pháp RSA
Dựa trên định nghĩa phương pháp mã hóa RSA, việc áp dụng vào thực tế được tiến hành theo các bước sau:
Thuật toán 1.9: Sử dụng phương pháp RSA
Hình 1.3 : Mô hình hệ thống mã hóa với khóa công cộng
NET Framework
Định nghĩa NET
Để bắt đầu khảo sát NET, cần xác định rõ ranh giới công việc, vì NET là một nền tảng đa dạng hơn là một sản phẩm đơn lẻ, thường gây khó hiểu Được định nghĩa như một khung ứng dụng, NET cung cấp nền tảng cho việc xây dựng ứng dụng, xác định cách truy cập các hàm qua hệ thống và mạng Nó cho phép xây dựng các giải pháp và dịch vụ Web, giải phóng khỏi sự ràng buộc của Microsoft Windows, tạo ra các trao đổi thông tin giữa các hệ thống và ứng dụng khác nhau Ý tưởng của NET nhằm hướng tới một Web thân thiện và tích hợp, nơi các ứng dụng có thể tương tác tự do mà không phụ thuộc vào chương trình hay nền tảng Tóm lại, NET giúp thông tin trên Web dễ dàng tiếp cận từ bất kỳ thiết bị nào, hỗ trợ hệ thống máy chủ và ứng dụng giao tiếp một cách liền mạch, xây dựng hệ thống tính toán phân tán và tạo ra một môi trường tương tác năng động hơn giữa dịch vụ Web, ứng dụng và khách hàng.
Mục tiêu của NET
Microsoft NET giúp loại bỏ các thành phần riêng biệt, cho phép thông tin được trao đổi và xây dựng trên một nền tảng chung Dù việc tạo ra một nền tảng độc lập có vẻ tự phá hủy, Microsoft thực sự đang theo đuổi một chiến lược dài hạn, khuyến khích các nhà phát triển cạnh tranh ở mức ứng dụng và dịch vụ thay vì chỉ ở mức nền tảng.
Khi bạn vào một cửa hàng bách hóa để mua bóng đèn, bạn sẽ thấy nhiều loại bóng đèn từ các nhà sản xuất khác nhau, nhưng tất cả đều phải tuân thủ những tiêu chuẩn nhất định Điều này đảm bảo rằng bất kể nhãn hiệu, độ bền và khả năng tương thích với đui đèn đều tương đương nhau Ngành công nghiệp bóng đèn cạnh tranh chủ yếu ở mức sản phẩm thay vì các tiêu chuẩn Nếu mỗi công ty chỉ cạnh tranh dựa trên tiêu chuẩn, sẽ có những sản phẩm bóng đèn được sản xuất riêng cho từng kiểu đui đèn, gây khó khăn cho người tiêu dùng trong việc lựa chọn.
.NET Framework là sản phẩm tối ưu của Microsoft, được thiết kế để xây dựng và triển khai nhanh chóng các dịch vụ và ứng dụng Web XML Nền tảng này kết hợp mô hình lập trình đơn giản, dễ sử dụng với các giao thức mở và linh hoạt của Internet, nhằm đạt được tầm nhìn phát triển công nghệ hiện đại.
Sự hợp nhất qua các chuẩn Internet công cộng là cần thiết để giao tiếp hiệu quả với đối tác kinh doanh và khách hàng theo vị trí địa lý Để đáp ứng nhu cầu này, các giải pháp phát triển cần hỗ trợ các chuẩn Internet mở, đồng thời tích hợp chặt chẽ với các giao thức mà không yêu cầu người phát triển phải hiểu rõ về cơ sở hạ tầng bên dưới.
Khả năng biến đổi trong các hệ thống lớn hiện nay thường dựa trên kiến trúc "ghép nối lỏng", chủ yếu là kiến trúc không đồng bộ dựa trên nền thông điệp Tuy nhiên, việc phát triển ứng dụng trên kiến trúc này thường gặp nhiều khó khăn và thiếu công cụ so với môi trường N lớp "ghép nối chặt" .NET Framework được thiết kế để kết hợp lợi thế của kiến trúc "ghép nối chặt" với khả năng biến đổi và vận hành linh hoạt của kiến trúc "ghép nối lỏng".
.NET Framework hỗ trợ nhiều ngôn ngữ lập trình khác nhau, cho phép các nhà phát triển tận dụng những ưu điểm riêng của từng ngôn ngữ, như khả năng xử lý toán học hoặc các hàm tính toán tài chính Điều này không chỉ giúp các ứng dụng được viết bằng nhiều ngôn ngữ tích hợp chặt chẽ với nhau mà còn cho phép các công ty khai thác kỹ năng phát triển sẵn có mà không cần đào tạo lại Hơn nữa, NET Framework tạo điều kiện cho các nhà phát triển làm việc với ngôn ngữ mà họ ưa thích, nâng cao hiệu suất làm việc.
Nâng cao năng suất cho các nhà phát triển ứng dụng là điều quan trọng, đặc biệt khi số lượng nhà phát triển không nhiều Với NET Framework, các nhóm phát triển có thể loại bỏ những công việc lập trình không cần thiết, từ đó tập trung vào việc viết các logic doanh nghiệp .NET Framework giúp tiết kiệm thời gian bằng cách tự động hóa các giao dịch, quản lý bộ nhớ hiệu quả và cung cấp một tập hợp đa dạng các đối tượng điều khiển, hỗ trợ nhiều tác vụ phát triển chung.
Bảo vệ những sự đầu tư thông qua việc bảo mật đã được cải tiến :
Bảo mật là một trong những vấn đề quan trọng nhất liên quan đến Internet hiện nay Kiến trúc bảo mật của NET Framework được xây dựng từ nền tảng vững chắc nhằm bảo vệ các ứng dụng và dữ liệu thông qua một mô hình bảo mật tinh vi dựa trên bằng chứng.
Hệ điều hành Windows cung cấp nhiều dịch vụ đa dạng, bao gồm truy cập dữ liệu toàn diện, bảo mật tích hợp, giao diện người dùng tương tác và mô hình đối tượng thành phần đáng tin cậy .NET Framework đã tận dụng những lợi thế này để mang đến trải nghiệm sử dụng dễ dàng và hiệu quả cho người dùng.
Các dịch vụ NET
Để triển khai mô hình NET, cần phải sắp xếp đúng các khối hợp nhất cơ sở, vì chúng xác định cách thức xây dựng các dịch vụ Web Những dịch vụ này nhằm hỗ trợ các nhà phát triển trong việc tạo ra ứng dụng NET Microsoft đã định nghĩa các dịch vụ khối hợp nhất NET như sau:
Khi áp dụng công nghệ Authentication và Passport của Microsoft, các nhà phát triển có thể tạo ra dịch vụ độc lập và bảo vệ chúng theo nhu cầu của mình.
Messaging trong NET được phát triển dựa trên nền tảng của MSN Hotmail Web, bao gồm dịch vụ e-mail, Microsoft Exchange Server 2000 và Instant Messaging Các hệ thống truyền thông điệp này có khả năng phân tán đến mọi thiết bị nhờ vào tính không phụ thuộc nền tảng, mang lại sự linh hoạt và tiện lợi cho người dùng.
.NET mang đến cho người dùng trải nghiệm cá nhân hóa với khả năng kiểm soát cao hơn thông qua các quy tắc xử lý dữ liệu và quyền ưu tiên rõ ràng, xác định cách thức di chuyển và quản lý dữ liệu hiệu quả.
XML (Ngôn ngữ Đánh dấu Mở rộng) là một ngôn ngữ phổ biến cho phép dữ liệu chuyển đổi giữa các định dạng khác nhau mà vẫn giữ nguyên tính toàn vẹn Kết hợp với SOAP, XML cung cấp một giải pháp linh hoạt cho việc quản lý và điều khiển dữ liệu hiệu quả.
Một trong những dịch vụ đầu tiên được triển khai trong NET là Microsoft HailStorm, một giải pháp trung tâm người dùng cho phép người dùng lưu trữ thông tin cá nhân như cuộc hẹn, lịch và thông tin tài chính.
Khi người dùng đăng ký dịch vụ, thông tin của họ sẽ được chia sẻ với các ứng dụng khác theo ý muốn, trở thành một phần của trải nghiệm trực tuyến Trong tương lai, người dùng sẽ nhận được các dịch vụ tương tự được đề xuất trên Web từ các công ty thông qua việc đăng ký dịch vụ Microsoft NET đã chuẩn bị cho việc áp dụng một số công nghệ mới, và điều này đã được cộng đồng công nghệ thông tin và Internet chấp nhận.
Tác động của NET đối với chuyên gia CNTT
Chiến lược NET ảnh hưởng đến các chuyên gia CNTT theo nhiều cách khác nhau Đầu tiên, nó tác động đến các nhà phát triển, giúp họ tối ưu hóa quy trình lập trình và nâng cao hiệu suất Tiếp theo, chúng ta cũng cần xem xét tác động của NET đối với các quản trị hệ thống và những chuyên gia CNTT khác, khi nó cung cấp các công cụ và giải pháp hỗ trợ quản lý hệ thống hiệu quả hơn.
Nhà phát triển cảm nhận rõ ràng tác động mạnh mẽ từ ý tưởng NET, đặc biệt khi xem xét sự thay đổi trong công việc phát triển ứng dụng Trước đây, ứng dụng được xây dựng trên các dịch vụ hệ thống cục bộ, nơi mỗi ứng dụng hoạt động độc lập trên một hệ điều hành riêng Điều này giới hạn khả năng giao tiếp giữa các ứng dụng Tuy nhiên, sự chuyển mình sang kiến trúc n-tier đã cho phép các nhà phát triển tạo ra ứng dụng hoạt động trên mạng, kết nối và tương tác tốt hơn Sự phát triển này không chỉ chuyển từ dịch vụ cục bộ sang dịch vụ mạng toàn cầu mà còn thúc đẩy khả năng phát triển phần mềm doanh nghiệp, tập trung vào việc nâng cao năng suất làm việc.
Chúng ta đang bước vào giai đoạn mới trong việc thay đổi thông qua XML và SOAP, cho phép các ứng dụng tương tác qua Internet thông qua dịch vụ Web Dịch vụ Web không chỉ cung cấp dịch vụ cho người dùng mà còn cho các ứng dụng khác, đánh dấu sự chuyển mình trong cách chúng ta nhìn nhận ứng dụng, từ việc mua CD-ROM và cài đặt trên máy tính sang việc sử dụng dịch vụ trực tuyến Các dịch vụ Web, được xây dựng trên nền tảng XML, có thể được truy cập bởi bất kỳ ai trên bất kỳ thiết bị nào, bất kỳ lúc nào, cho phép các quy trình chuyên biệt hoạt động liên tục trên Internet mà không cần sự can thiệp của người dùng.
Quy trình dịch vụ Web kết hợp giữa ghép nối lỏng và ghép nối chặt, sử dụng chuẩn truyền thông điệp và phương pháp truy cập dữ liệu trên Internet Ý tưởng NET, dựa trên XML và dịch vụ Web, mang đến cho các nhà phát triển cách thức mới để tạo ra ứng dụng dễ dàng hơn Thách thức đặt ra cho các nhà phát triển là tích hợp các khái niệm này vào nền tảng NET Mặc dù ý tưởng NET không hoàn toàn thay đổi công việc quản lý máy chủ CNTT, nhưng nó mang lại sự giải tỏa trong quản trị nhờ mô hình tính toán phân tán đã sẵn sàng Tuy nhiên, việc quản lý máy chủ doanh nghiệp và máy trạm vẫn sẽ hoạt động chủ yếu theo cách truyền thống.
Tác động của NET đối với người dùng
Nền tảng NET có thể cải thiện đáng kể trải nghiệm người dùng Hiện nay, việc tính toán chủ yếu phụ thuộc vào phần cứng và hệ điều hành, với người dùng sử dụng PC, laptop hoặc PDA để cài đặt phần mềm và cấu hình hệ thống Dữ liệu được quản lý và thao tác trên các thiết bị này, nhưng sự gia tăng công nghệ khiến số lượng PC tại nhà và văn phòng tăng nhanh chóng Điều này đặt ra thách thức khi người dùng cần nhiều không gian lưu trữ, như 13 Gbyte ổ cứng, và mô hình tính toán hiện tại gặp vấn đề do số lượng người dùng ngày càng đông Người dùng phải tự quản lý dữ liệu và thiết bị của mình, trong khi Internet trở thành một công cụ phụ trợ hơn là một phần thiết yếu trong cuộc sống.
.NET đã thay đổi cách tiếp cận quản lý dữ liệu, cho phép người dùng không cần lưu trữ tất cả dữ liệu và phần mềm trên máy tính cá nhân Thay vào đó, dữ liệu và ứng dụng có thể được lưu trữ trên các máy chủ trực tuyến với chi phí thấp Điều này giúp giảm bớt trách nhiệm quản lý cho người dùng, khi họ chỉ cần truy cập và thao tác dữ liệu, trong khi quản trị viên máy chủ đảm nhận việc lưu giữ, xử lý lỗi và lập kế hoạch cấu hình Khi dữ liệu đã được đưa lên Internet, chiến lược NET sẽ hoạt động hiệu quả, cung cấp khả năng truyền dữ liệu mượt mà thông qua XML và SOAP.
Hãy tưởng tượng bạn đang làm việc trên một máy PC văn phòng và quyết định mua cổ phiếu Bạn truy cập vào website, sử dụng thông tin cá nhân của mình, có thể thông qua Microsoft HailStorm, để thực hiện giao dịch Sau đó, khi đang di chuyển trong giờ cao điểm, bạn sử dụng điện thoại di động để kiểm tra giá cổ phiếu và quyết định bán Toàn bộ quá trình này diễn ra mà bạn không cần lo lắng về các ứng dụng hay tính tương thích nền tảng, và thông tin cá nhân của bạn luôn sẵn sàng mọi lúc mọi nơi Nhìn chung, NET biến Internet thành một nguồn dữ liệu tương tác thực sự, cho phép người dùng quản lý mọi khía cạnh cuộc sống từ công việc, tài chính cá nhân đến giải trí.
Kiến trúc NET Framework
.NET Framework bao gồm hai phần chính là Common Language Runtime (CLR) và Base Class Libraries (BCL), cả hai đều đóng vai trò quan trọng trong việc phát triển dịch vụ và ứng dụng NET.
Bộ thực thi Common Language Runtime (CLR) được xây dựng trên các dịch vụ hệ điều hành, chịu trách nhiệm thực hiện ứng dụng và quản lý các yếu tố như bộ nhớ, an ninh và tích hợp ngôn ngữ CLR bao gồm nhiều dịch vụ hỗ trợ phát triển, triển khai ứng dụng và cải thiện tính đáng tin cậy Mặc dù các nhà phát triển không tương tác trực tiếp với CLR, họ sử dụng các thư viện lớp cơ sở được xây dựng trên CLR thông qua các ngôn ngữ lập trình Ngoài ra, NET Framework cung cấp mô hình lập trình ứng dụng Web ASP.NET và Windows Forms, trong đó ASP.NET cung cấp các thành phần và dịch vụ nâng cao để phát triển ứng dụng và dịch vụ Web XML.
.NET Framework cung cấp một runtime đặc biệt gọi là Common Language Runtime (CLR), quản lý việc thực hiện mã và cung cấp dịch vụ hỗ trợ phát triển CLR vượt trội hơn các runtime trước đây như VB-runtime nhờ vào khả năng tích hợp ngôn ngữ, bảo mật truy cập mã, quản lý thời gian sống của đối tượng và hỗ trợ gỡ lỗi, giúp quá trình phát triển trở nên dễ dàng hơn.
Mã được biên dịch và hướng tới CLR có tên "managed code"
"Managed code" cung cấp siêu dữ liệu cần thiết cho CLR, giúp hỗ trợ đa ngôn ngữ, bảo mật mã, quản lý thời gian sống của đối tượng và quản lý bộ nhớ hiệu quả.
Trình biên dịch và quản lý mã
.NET Framework yêu cầu sử dụng trình biên dịch ngôn ngữ tích hợp vào CLR, bao gồm Visual Basic NET, C# NET, C++ NET và JScript NET của Microsoft Ngoài ra, thị trường còn có nhiều trình biên dịch từ các đối tác thứ ba như COBOL và Perl.
Hình 2.1 : Sơ đồ kiến trúc NET Framework
Sau khi sử dụng trình biên dịch ngôn ngữ, mã của bạn sẽ được chuyển đổi sang Microsoft Intermediate Language (MSIL), hay còn gọi là IL IL bao gồm một tập hợp các lệnh độc lập với CPU, cho phép việc chuyển đổi dễ dàng sang các ngôn ngữ máy khác.
"native code" Siêu dữ liệu cũng được chứa bên trong IL
IL độc lập với CPU cho phép mã IL được chuyển đổi dễ dàng giữa các máy tính hỗ trợ NET Framework mà không gặp khó khăn Sau khi mã IL được tạo ra, nó sẽ được biên dịch bởi trình biên dịch JIT (Just-In-Time) thành mã máy hay "native code" Mã IL chứa tất cả thông tin cần thiết để thực hiện các lệnh và gọi hàm, cùng với nhiều thao tác khác.
.NET Framework bao gồm nhiều trình biên dịch JIT, có khả năng chuyển đổi mã IL thành mã máy phù hợp với CPU cụ thể Quá trình này diễn ra khi ứng dụng được khởi động lần đầu tiên.
Khi xây dựng trang ASP.NET đầu tiên, bạn cần chú ý đến quá trình biên dịch mã Sau khi tạo trang, mã sẽ được biên dịch sang IL và khi truy cập trang qua URL, sẽ có một sự tạm dừng ngắn do trình duyệt gọi mã IL và biên dịch nó sang mã máy bằng trình biên dịch JIT Lần gọi đầu tiên sẽ mất thời gian, nhưng sau đó, khi bạn nhấn F5 để làm mới trang, nó sẽ được thực hiện ngay lập tức vì mã đã được lưu trong bộ nhớ CLR nhận biết rằng trang đã được biên dịch và sẽ cung cấp đầu ra từ bộ nhớ Nếu có thay đổi nào trên trang ASP.NET, bạn cần biên dịch lại và khi chạy trang, CLR sẽ phát hiện sự thay đổi và sử dụng trình biên dịch JIT một lần nữa để biên dịch mã IL sang mã máy.
Trình biên dịch JIT đảm bảo mã máy được biên dịch an toàn kiểu, nghĩa là các đối tượng luôn được tách biệt và không thể làm hỏng lẫn nhau.
Trong NET Framework, các assembly đóng vai trò quan trọng như các khối hợp nhất của ứng dụng Thiếu một assembly liên quan sẽ khiến mã không thể biên dịch từ IL Khi biên dịch mã từ mã được quản lý sang mã máy, trình biên dịch JIT tìm kiếm mã IL trong file PE cùng với bản kê khai assembly Mỗi khi bạn tạo ứng dụng Web Form hay Windows Form trong NET, bạn thực chất đang tạo ra một assembly, và mỗi ứng dụng này đều chứa ít nhất một assembly.
Trong Windows DNA, các DLL và EXE đóng vai trò là những "khối hợp nhất" cho các ứng dụng, trong khi đó, trong NET, assembly trở thành cơ sở quan trọng cho việc phát triển ứng dụng.
Trong Windows DNA và COM, hiện tượng được gọi là DLL hell xảy ra khi chỉ có một phiên bản của thành phần COM có thể tồn tại trên một máy tính tại bất kỳ thời điểm nào Điều này là do đặc tả COM không bao gồm thông tin phụ thuộc trong định nghĩa kiểu của thành phần Tuy nhiên, với NET, giờ đây có thể có nhiều phiên bản của các component hay assembly chạy song song trên cùng một server Ứng dụng sẽ luôn tìm kiếm assembly mà nó được xây dựng từ đó.
Khi một ứng dụng NET khởi động, nó tìm kiếm các assembly trong thư mục cài đặt, nơi chứa các private assembly Nếu không tìm thấy assembly trong thư mục này, ứng dụng sẽ tìm kiếm chúng trong GAC (Global Assembly Cache).
Cấu trúc của một assembly
Các assembly trong NET được thực hiện bởi Common Language Runtime và có khả năng "tự mô tả", tức là tất cả thông tin cần thiết về assembly được lưu trữ bên trong chính nó Khác với Windows DNA, nơi COM lưu trữ dữ liệu "tự mô tả" trong registry của server, assembly NET cho phép cài đặt và loại bỏ mà không cần dừng hoạt động của IIS Việc cài đặt một assembly chỉ đơn giản là sao chép nó, giúp tiết kiệm thời gian và công sức trong quá trình triển khai.
Các assembly được tạo ra bởi các phần sau :
Bản kê khai assembly (Assembly manifest) Kiểu siêu dữ liệu (Type metadata)
NET Framework trong bảo mật
Độ tin cậy và nền tảng NET
Trước khi áp dụng các biện pháp an ninh hoặc kỹ thuật mã hóa, bạn cần đảm bảo độ tin cậy của chương trình Nền tảng NET đã có những bước tiến đáng kể trong việc giải quyết vấn đề này Ứng dụng NET không được biên dịch thành mã nguồn có thể nhìn thấy, mà được chuyển đổi thành mã trung gian tương tự như mã của Java Điều này cho phép CLR và NET Framework cung cấp nhiều dịch vụ an ninh tự động và đáng tin cậy.
Kiểm tra giới hạn trong quá trình chạy chương trình để tránh sự thất thoát bộ nhớ và tràn stack
Trong quá trình chạy chương trình, việc kiểm tra kiểu dữ liệu là rất quan trọng để tránh việc sử dụng kiểu dữ liệu sai Điều này bao gồm việc duyệt qua stack để xác định sự cho phép trước khi thực hiện gọi mã.
Tự động thu gom rác một cách hiệu quả để tiết kiệm bộ nhớ
Kiểm soát lỗi tránh những lỗi bất thường trong quá trình chạy
Bảo vệ theo vai trò giúp xác thực và giới hạn quyền thực thi cho người sử dụng, trong khi bảo vệ theo chứng thực quản lý việc cấp phép sử dụng mã cơ sở.
Quản lý mã và định kiểu an toàn
Mã có thể sử dụng dịch vụ quản lý mã của CLR, cung cấp các dịch vụ như kiểm tra định kiểu an toàn và tự động thu gom rác, nhằm tăng cường tính tin cậy và an toàn Để tận dụng các dịch vụ này, quản lý mã cần phải dự đoán, sắp xếp và kiểu đồng nhất Định kiểu an toàn là yếu tố quan trọng trong bảo mật, và CLR có khả năng thực hiện điều này nhờ vào hiểu biết sâu sắc về loại dữ liệu được quản lý Với kiến thức đó, CLR có thể ép kiểu chính xác để thiết lập các quy tắc trong việc định kiểu an toàn.
Common Type System (CTS) định nghĩa các quy tắc cho tất cả các loại dữ liệu trong NET, bao gồm chuỗi và mảng, đảm bảo tính đồng nhất và an toàn trong việc xử lý dữ liệu Các quy tắc này được thực thi bởi MSIL và xác định cách mà các loại dữ liệu được quản lý, cùng với việc kiểm soát các lớp kế thừa để ngăn chặn các hành vi không an toàn như tràn giới hạn mảng Mã MSIL chuyển đổi quá trình chạy thành hướng dẫn chi tiết cho phần cứng trước khi kiểm tra kiểu dữ liệu Để đảm bảo tính an toàn, NET sử dụng metadata để định nghĩa mã nguồn và dữ liệu trong chương trình, trong khi CLR tự động quản lý mã, tương tự như quá trình thu gom rác, nhằm ngăn ngừa rò rỉ bộ nhớ và nâng cao độ tin cậy.
Tất cả các đối tượng trong lập trình đều có kiểu riêng, và việc sắp xếp bộ nhớ phụ thuộc vào từng tham chiếu đến đối tượng Kể từ khi việc xử lý con trỏ tùy ý bị loại bỏ, việc truy cập vào đối tượng chỉ có thể thực hiện thông qua các thành phần công cộng Hệ thống CLR có khả năng xác nhận tính an toàn của một đối tượng bằng cách phân tích metadata, do đó không cần phải xem xét toàn bộ mã nguồn, chỉ cần phân tích đối tượng là đủ để đánh giá tính an toàn.
Trong ngôn ngữ C#, chúng ta có thể không sử dụng trình quản lý mã bằng cách áp dụng từ khóa unsafe, tuy nhiên, các ngôn ngữ khác như VB.NET chỉ cho phép điều này khi sử dụng định kiểu an toàn và trình quản lý mã Từ khóa unsafe cần thiết khi làm việc với con trỏ bộ nhớ Mã không được quản lý hữu ích khi gọi hàm kế thừa DLLs và sử dụng PInvoke, nhưng nó sẽ không được thẩm định bởi định kiểu an toàn của CLR.
MSIL (Microsoft Intermediate Language) là ngôn ngữ trung gian được sử dụng trong tất cả các trình biên dịch NET, cho phép thực thi mã với các kiểu được định nghĩa bởi CTS (Common Type System) trong quá trình chạy MSIL được chuyển đổi thành mã đơn giản, và sau đó CLR (Common Language Runtime) thực hiện kiểm tra kiểu Mặc dù kiểm tra kiểu diễn ra một cách mặc định, nhưng có thể được bỏ qua nếu mã được coi là đáng tin cậy.
VÀ MỘT SỐ LOẠI MÃ HOÁ ĐƢỢC HỖ TRỢ BỞI NET
Tổng quan lớp Cryptography
Microsoft đã đăng ký quyền sở hữu Win32 Cryptography API (CryptoAPI) vào năm 1996 và tích hợp vào Win NT Mặc dù CryptoAPI cung cấp hỗ trợ đầy đủ cho lập trình mật mã, nhưng nó khá phức tạp và yêu cầu người dùng phải có hiểu biết sâu về mật mã học cùng với việc làm việc với nhiều thành phần và số liệu lớn Đến khi xuất hiện trong ngôn ngữ lập trình C, CryptoAPI mới trở nên dễ sử dụng hơn thông qua việc gọi hàm May mắn thay, NET Framework đã đơn giản hóa việc sử dụng API này bằng cách cung cấp lớp System.Security.Cryptography thân thiện hơn với người dùng.
Chúng ta sẽ cùng tìm hiểu ngắn gọn một số một số lớp chính có trong lớp System.Security.Cryptography
SymmetricAlgorithm : Lớp mã hóa đối xứng Nó sẽ mã hóa theo các thuật toán mã hóa đối xứng như: DES, Rịndael
AsymmetricAlgorithm : Lớp mã hóa bất đối xứng, nó sẽ mã hóa theo các thuạt toán RSA, DSA
CryptoStream kết nối dòng dữ liệu nguồn với các thuật toán mã hóa, trong khi CspParameters chứa thông tin về các tham số trong những thuật toán đặc biệt, cho phép lưu trữ và truy xuất thông qua Cryptographic Service Provider (CSP).
HashAlgorithm : Lớp cơ sở hỗ trợ các thuật toán băm
RandomNumberGenerator : Lớp cơ sở sinh ra số ngẫu nhiên
ToBase64Transform và FromBase64Transform : Dùng đẻ chuyển đổi các dãy Byte và Base-64
CryptographicException : Chứa thông tin về lỗi của các loại mã hóa khác nhau
Các bạn có thể nhớ và tùy ý sử dụng các lớp này trong chương trình của mình vì nó đã có sẵn trong lớp System.Security.Cryptography
Các thuật toán mã hóa đối xứng trong NET
Các lớp NET Framework thực thi thuật toán mã hóa đối xứng thông qua lớp cơ sở SymmetricAlgorithm, trong đó có một số trường được khai báo là "protected" và không thể truy vấn trực tiếp Tuy nhiên, người dùng có thể truy vấn những trường này thông qua các thuộc tính ảo, được thực thi cụ thể trên lớp tương ứng Ví dụ, trường BlockSizeValue có thể được truy vấn qua thuộc tính ảo BlockSize, cho phép người dùng xác định kích thước khối phù hợp với lớp thực tế đang sử dụng, mặc dù việc đặt cỡ khối thành giá trị không hợp lệ trong thuật toán mã hóa đối xứng sẽ bị hạn chế.
CryptographicException, dựa trên thuật toán cụ thể đang được sử dụng
Trong lập trình, khi một trường được khai báo là "protected" và thuộc tính ảo, kiểu dữ liệu và tên của chúng sẽ được loại bỏ, chỉ giữ lại giá trị của trường "protected" Các thuộc tính ảo này tồn tại trong lớp.
SymmetricAlgorithm thể hiện trong bảng sau:
Hình 4.1 : Các thuật toán mã hóa hỗ trợ trong lớp Cryptoghraphy
BlockSize là giá trị kích cỡ khối được thiết lập dưới dạng bit cho thuật toán, cho phép mã hóa hoặc giải mã dữ liệu trong một bước Dữ liệu lớn hơn kích cỡ khối sẽ được chia thành các khối có kích cỡ tương tự, và khối cuối cùng sẽ được gán thêm kích cỡ của nó Các kích cỡ khối hợp lệ được xác định bởi LegalBlockSizes trong từng thuật toán Kiểu dữ liệu là int.
Kích cỡ của giá trị trả về được xác định dưới dạng các bit cho mỗi thuật toán mã hóa, và kết quả cuối cùng sẽ được trả về sau khi mã hóa hoặc giải mã Điều này là bắt buộc trong các phương thức OFB và CFB Kích cỡ thích hợp phải dựa trên các thuật toán mã hóa đối xứng, nhưng không được lớn hơn kích cỡ của khối, với kiểu dữ liệu là int.
IV Lấy hoặc đặt giá trị ban đầu cho vector trong thuật toán mã hóa đối xứng, bắt buôc phải chó trong phương thức CBC Có kiểu mảng Byte
Key Lấy hoặc đặt giá trị cho khóa bí mật sử dụng trong thuật toán mã hóa đối xứng để mã hóa hoặc giải mã Có kiểu mảng Byte
KeySize cho phép lấy hoặc thiết lập kích thước của khóa bí mật dưới dạng bit Kích thước phù hợp sẽ được xác định bởi LegalKeySizes trong từng thuật toán Kiểu dữ liệu là int.
LegalBlockSizes Lấy kích cỡ của khối được hỗ trợ bởi các thuật toán mã hóa đối xứng
LegalKeySizes Lấy kích cỡ của khóa được hỗ trợ trong thuật toán mã hóa đối xứng
Mode Lấy hoặc đặt chế độ để thực hiện trong các thuật toán Nó có kiểu là kiểu CipherMode.VD: ECB, CBC, CFB, OFB
Padding Lấy hoặc dặt giá trị chèn vào các byte còn trống của khối cuối cùng Có kiểu PaddingMode VD: PKCS7, Zeos, None
SymmetricAlgorithm được thiết kế là lớp "public" và không chứa tham số Kiểu thiết kế này tạo ra các khóa bí mật khác nhau Tất nhiên,
SymmetricAlgorithm cũng hỗ trợ các phương thức chuẩn Equals, Finalize, GetHashCode, ToString, GetType, và MemberwiseClone, những phương thức mà đã được định nghĩa ở lớp Object cơ sở
Clear Sẽ gọi Dispose, giải phóng nguồn được sử dụng trong thuật toán mã hóa đối xứng Phương thức trả về kiểu void
Create Tạo đối tượng SymmetricAlgorithm để mã hóa hoặc giải mã Phương thức trả về đối tượng SymmetricAlgorithm
CreateDecryptor Tạo đối tượng giải mã sử dụng khóa và vector khởi tạo
Phương thức tham chiếu đến ICryptoTranform sử dụng để chuyển dữ liệu thành các khối
CreateEncryptor Tạo đối tượng mã hóa sử dụng khóa và vector khởi tạo
Phương thức tham chiếu đến ICryptoTranform sử dụng để chuyển dữ liệu thành các khối
Equals Kế thừa từ lớp Object, sử dụng để so sánh 2 đối tượng
SymmetricAlgorithm cho bằng nhau Giá trị trả về có dạng bool
GenerateIV Khởi tạo vector bất kỳ Trả về kiểu void
GenerateKey Khởi tạo khóa bất kỳ Trả về kiểu void
GetHashCode Kế thừa từ lớp Object, cung cấp giá trị băm cho đối tượng
SymmetricAlgorithm Trả về kiểu int
GetType Kế thừa từ lớp Object sử dụng để lấy kiểu cho đối tượng
SymmetricAlgorithm Trả về kiểu Type
ToString Kế thừa từ lớp Object, sử dụng để cung cấp chuỗi hiển thị cho đối tượng SymmetricAlgorithm
ValidKeySize Phương thức này quyết định khi kích cỡ khóa phù hợp với thuật toán đang sử dụng Trả về kiể bool
Bạn sẽ không làm việc trực tiếp với đối tượng SymmetricAlgorithm, vì nó là một đối tượng trừu tượng Thay vào đó, bạn sẽ sử dụng các lớp được cung cấp, hoạt động như các phương thức ảo của SymmetricAlgorithm Dưới đây là sơ đồ các lớp trong SymmetricAlgorithm.
Chúng ta có thể thấy trong Hình 4.2 là các lớp có trong lớp
Symmetric Algorithm, chúng cũng là các lớp trìu tượng Bây giờ chúng ta sẽ cùng tìm hiểu ý nghĩa của các lớp
DES là lớp trìu tượng đóng gói theo thuật toán mã hóa đối xứng DES
TripleDES là lớp trìu tượng đóng gói theo thuật toán mã hóa đối xứng Triple DES, thuật toán này có độ an toàn cao hơn DES
Rijndael là lớp trìu tượng đóng gói theo thuật toán mã hóa đối xứng
Rijndael nó là một chuẩn mới thay thế DES
Hình 4.2 : Thuật toán mã hóa đối xứng trong lớp
RC2 là lớp trìu tượng đóng gói theo thuật toán mã hóa đối xứng
RC2 được Ronald Rivest nghiên cứu để thay thế DES
Thuật toán Kích thước khóa hợp lệ Kích thước khóa mặc định
RC2 Từ 40 đến 128 bits 128 bits = 16 bytes
Triple DES 128, 192 bits 192 bits = 24 bytes
Chúng ta cùng xét 1 ví dụ về cách sử dụng thuật toán mã hóa đối xứng trong NET
-Sinh khóa bí mật : static string GenerateKey()
DESCryptoServiceProvider myDES ; myDES = new DESCryptoServiceProvider();
//myDES.GenerateKey(); return ASCIIEncoding.ASCII.GetString(myDES.Key);
-Mã hóa file : void EcryptFile(string inputFile, string outputFile, string szSecureKey)
FileStream inStream, outStream; inStream = new FileStream(inputFile, FileMode.Open,
FileAccess.Read); outStream = new FileStream(outputFile,FileMode.Create, FileAccess.Write);
DESCryptoServiceProvider(); myDES.Key = ASCIIEncoding.ASCII.GetBytes(szSecureKey); myDES.IV = ASCIIEncoding.ASCII.GetBytes(szSecureKey);
ICryptoTransform myDES_Ecryptor = myDES.CreateEncryptor(); CryptoStream myEncryptStream; myEncryptStream = new CryptoStream(outStream, myDES_Ecryptor, CryptoStreamMode.Write); byte[] byteBuffer = new byte[100]; long nTotalByteInput = inStream.Length, nTotalByteWritten = 0; int nCurReadLen = 0; while (nTotalByteWritten < nTotalByteInput)
{ nCurReadLen = inStream.Read(byteBuffer, 0, byteBuffer.Length); myEncryptStream.Write(byteBuffer, 0, nCurReadLen); nTotalByteWritten += nCurReadLen;
Các thuật toán mã hóa bất đối xứng trong NET
.NET Framework thực hiện thuật toán mã hóa bất đối xứng thông qua lớp AsymmetricAlgorithm, tương tự như cách sử dụng các thuật toán mã hóa đối xứng với lớp SymmetricAlgorithm Dưới đây là sơ đồ các lớp trong lớp AsymmetricAlgorithm.
Bảng các phương thức trong lớp AsymmetricAlgorithm :
KeySize Kích thước của khóa tính theo bits
LegalKeySizes Giá trị kích thước khóa hợp lệ tính theo byte của thuật toán mã hóa bất đối xứng hiện tại
KeyExchangeAlgorithm Chỉ định thuật toán trao đổi khóa được sử dụng và cách thức trao đổi khóa công khai và khóa bí mật
SignatureAlgorithm Chỉ định tên thuật toán được sử dụng để ký trên đối tượng hiện thời
FromXmlString() Tái tạo lại đối tượng thuật toán mã hóa bất đối xứng từ 1 file XML
ToXmlString() Trả về một thể hiện XML cho đối tượng bất đối xứng đang sử dụng
Hình 4.3 : Thuật toán mã hóa bất đối xứng trong lớp
Chúng ta cùng xem một ví dụ về cách sử dụng thuật toán mã hóa bất đối xứng trong NET :
-Sinh cặp khóa công khai và khóa bí mật : static void Generatakey(string szKeyName, int nKeySize)
RSACryptoServiceProvider(nKeySize); myRSA.PersistKeyInCsp = false; string szPrivkey, szPubkey; szPrivkey = myRSA.ToXmlString(true); szPubkey = myRSA.ToXmlString(false);
FileStream fsPub = new FileStream(szKeyName+"Pub.key", FileMode.Create,FileAccess.Write); byte[] bytePubkey = ASCIIEncoding.ASCII.GetBytes(szPubkey); fsPub.Write(bytePubkey, 0, bytePubkey.Length); fsPub.Close();
FileStream(szKeyName+"Priv.key",FileMode.Create, FileAccess.Write); byte[] bytePrivkey = ASCIIEncoding.ASCII.GetBytes(szPrivkey); fsPriv.Write(bytePrivkey, 0, bytePrivkey.Length); fsPriv.Close();
-Mã hóa với khóa công khai static void EncryptFile(string szFileInput, string szFileEnc, string szPubKey) { try
FileStream fsPubkey = new FileStream(szPubKey, FileMode.Open, FileAccess.Read);
FileStream fsInput = new FileStream(szFileInput, FileMode.Open, FileAccess.Read);
FileStream fsOutput = new FileStream(szFileEnc, FileMode.Create, FileAccess.Write);
RSACryptoServiceProvider(); byte[] bytePubkey = new byte[fsPubkey.Length]; fsPubkey.Read(bytePubkey, 0, bytePubkey.Length); myRSA.FromXmlString(ASCIIEncoding.ASCII.GetString(bytePubkey,
To securely encrypt data, first read the input file into a byte array, then utilize RSA encryption to transform the data, and finally write the encrypted byte array to the output file before closing all file streams.
} catch (CryptographicException ex) {Console.WriteLine(ex.Message);} }
-Giải mã với khóa bí mật : static void DecryptFile(string szFileInput, string szFileEnc, string szPrivKey) { try
FileStream fsPrivkey = new FileStream(szPrivKey, FileMode.Open, FileAccess.Read);
FileStream fsInput = new FileStream(szFileInput, FileMode.Open, FileAccess.Read);
FileStream fsOutput = new FileStream(szFileEnc, FileMode.Create, FileAccess.Write);
RSACryptoServiceProvider(); byte[] bytePrivkey = new byte[fsPrivkey.Length]; fsPrivkey.Read(bytePrivkey, 0, bytePrivkey.Length); myRSA.FromXmlString(ASCIIEncoding.ASCII.GetString(bytePrivkey,
The code snippet demonstrates the process of reading an encrypted byte array from an input file, decrypting it using RSA, and writing the decrypted data to an output file It initializes a byte array to hold the input data, performs the decryption, and then writes the resulting byte array to the specified output file before closing all file streams.
Các thuật toán hàm băm trong NET Framework
Có 2 loại thuật toán hàm băng thường dùng là SHA-1 (Secure Hash Algorithm được đưa ra bởi NIST vào giữa những năm 1990) và MD5 (Thuật toán Message Digest đưa ra bởi R.Rivest trong những năm đầu 1990) Thêm nữa, một vài phiên bản mới của SHA đã được công bố Giải thuật băm có khóa cũng rất quan trọng trong việc xác thưc thông tin Tất cả những thứ đó đều được hỗ trợ bởi NET Framework dưới dặng các lớp trong
Dưới đây là sơ đồ lớp trong lớp HashAlgorithm Nó cung cấp các lớp trìu tượng khác như: KeyedHashAlgorithm, MD5, SHA1, SHA256, SHA384,
SHA512 là một trong những thuật toán mã hóa hàm băm phổ biến hiện nay Các lớp này thuộc loại lớp trừu tượng, do đó không thể thao tác trực tiếp Mỗi lớp sẽ có một lớp thực thi cụ thể, và chúng ta sẽ sử dụng các lớp thực thi này để thực hiện các thao tác cần thiết.
Hình 4.3 : Thuật toán băm trong NET
Lớp MHACSHA1 cung cấp hàm băm có khóa dựa trên thuật toán SHA-1, trong khi lớp MACTripleDES sử dụng mã hóa Triple DES cho hàm băm HMAC tương tự như chữ ký số trong việc xác thực văn bản và đảm bảo tính toàn vẹn, nhưng khác biệt ở chỗ không phải là một bộ kiểm tra và từ chối HMAC sử dụng lược đồ đối xứng, với cả bên gửi và bên nhận chia sẻ cùng một khóa, trong khi chữ ký số dựa vào lược đồ bất đối xứng Khi khóa được biết bởi nhiều cá nhân, không có cách nào để chứng minh rằng một cá nhân thứ ba có thể được chấp nhận bởi thuật toán băm Do đó, MACs thường nhỏ hơn và có độ an toàn thấp hơn so với chữ ký số.
Mặc dù NET Framework hỗ trợ mở rộng và cho phép tích hợp các thuật toán băm cá nhân qua lớp HashAlgorithm, nhưng không nên tự thiết kế thuật toán riêng Về mặt bảo mật, một thuật toán mã hóa cần được kiểm tra kỹ lưỡng bởi nhiều chuyên gia trong thời gian dài Hầu hết người dùng thường chọn các thuật toán đã được chứng minh và tin cậy qua thời gian, như MD5 và SHA.
Trong ngành công nghiệp máy tính, ngoài một số thuật toán được hỗ trợ trong NET, không còn thuật toán hàm băm nào được khuyến cáo sử dụng Microsoft Windows CryptoAPI hỗ trợ ba thuật toán băm: MD4, MD5 và SHA-1 Tuy nhiên, NET Framework không còn hỗ trợ MD4 kể từ khi MD5 ra đời, vì MD5 đã khắc phục hầu hết các lỗi của MD4.
SHA-256, SHA-384, SHA-512 những thuật toán mà CrytoAPI không hỗ trợ
Lớp HashAlgorithm có thuộc tính Hash, là mảng byte chứa giá trị bảng băm Thuộc tính HashSize cho biết kích thước của mã băm tính bằng bit Phương thức quan trọng nhất trong lớp này là
HashAlgorithm, hay còn gọi là ComputerHash, chuyển đổi các giá trị đầu vào thành chuỗi byte Ví dụ dưới đây minh họa cách sử dụng lớp HashAlgorithm để mã hóa bằng thuật toán SHA-1 với giá trị đầu vào là mảng byte messageByteArray.
HashAlgorithm sha1 = new SHA1CryptoServiceProvider(); byte[] sha1Hash = sha1.ComputeHash(messageByteArray);
Lớp MD5 mã hóa theo thuật toán MD5 chấp nhận đầu vào có độ dài bất kỳ và cho kết quả 128 bit Thuật toán này được thiết kế cho các ứng dụng chữ ký số, với hàm băm được mã hóa bằng khóa riêng trong RSA MD5 là phiên bản mở rộng từ MD4, mặc dù chậm hơn nhưng an toàn hơn.
SHA-1 là một thuật toán mã hóa thuộc chuẩn SHA1, cho phép xử lý dữ liệu đầu vào có độ dài tối đa 264 bit và tạo ra kết quả với độ dài 160 bit Nó được phân loại là một tiêu chuẩn an ninh của NIST và có thể được sử dụng trong Digital Signature Algorithm (DSA).
Lớp SHA256, SHA384, SHA512 liên hệ mật thiết với nhau và cùng sử dụng thuật toán băm nhưng khác ở chỗ là kết quả đầu ra lần lượt là 256, 384,
Thuật toán mã hóa đối xứng 512 bit có thể bị tấn công theo tỷ lệ 2^n, trong khi các thuật toán hàm băm chỉ bị tấn công với tỷ lệ 2^(n/2) Điều này có nghĩa là việc tấn công dựa trên hàm băm chỉ thành công khi hai dữ liệu đầu vào cho cùng một giá trị đầu ra Đối với thuật toán SHA-160, việc tấn công chỉ có thể thành công sau 2^80 lần thử Mặc dù thuật toán này tương đối an toàn, nhưng không thể đảm bảo an toàn lâu dài.
Lớp KeyedHashAlgorithm là một thuật toán hàm băm sử dụng khóa, cho phép tính toán đầu ra dựa trên dữ liệu đầu vào và một phần dữ liệu khóa Thuật toán này có hai phương thức chính: key-dependent và one-way, thường được sử dụng để xác thực Khi người dùng nắm rõ khóa chính, họ có thể chấp nhận hoặc kiểm tra hàm băm, từ đó đảm bảo tính toàn vẹn và tính xác thực trong việc trao đổi thông tin khóa.
KeyedHashAlgorithm is an abstract class that specifically implements HMACSHA1 and MACTripleDES These classes utilize hashing algorithms based on the SHA-1 and TripleDES encryption methods.
4.4.4 Định danh đối tƣợng Đôi khi người lập trình cần một thỏa thuận đặt tên chung để hàng trăm các chuẩn, thuật toán, và kiểu dữ liệu được được đặt dưới 1 tên duy nhất OIDs (Object Identifiers) sẽ định nghĩa và quản lý bằng số các cấu trúc, bao gồm cả ANSI (American National Standards Institute), với mục đích định danh duy nhất các kiểu thông qua một sơ đồ phân cấp logic Có số lượng lớn OIDs để định danh mỗi kiểu riêng biệt như : giao thức, thuật toán, các kiểu dữ liệu Chi tiết hơn, phần lớn các thuật toán mã hóa được công nhận bởi ANSI đều được đăng ký với một tên duy nhất trong OID Ví dụ OIDs thường được sử nhất dụng cho thuật toán băm ở hình dưới Chúng ta sẽ xem OIDs một cách cụ thể trong các lớp của NET Security Framework như SignHash và
VerifyHash trong lớp RSACryptoServiceProvider và
OIDs thường được sử dụng cho thuật toán băm, và đoạn mã dưới đây minh họa việc sử dụng OID trong phương thức SignHash của lớp RSACryptoServiceProvider Biến hashbytes là một mảng byte được tạo ra từ hàm ComputerHash của lớp SHA1.
//create RSA object using default key
//sign hash using OID for SHA-1 signaturebytes = rsa.SignHash(hashbytes, "1.3.14.3.2.26");