CHƯƠNG 1: GIỚI THIỆU .

NET FRAMEWORK
1.1. Định nghĩa. .NET framework là một nền tảng lập trình và cũng là một nền tảng thực thi ứng dụng chủ yếu trên hệ điều hành Microsoft Windows được phát triển bởi Microsoft. Các chương trình được viết trên nền.NET Framework sẽ được triển khai trong môi trường phần mềm (ngược lại với môi trường phần cứng) được biết đến với tên Common Language Runtime (CLR). Môi trường phần mềm này là một máy ảo trong đó cung cấp các dịch vụ như an ninh phần mềm (security), quản lý bộ nhớ (memory management), và các xử lý lỗi ngoại lệ (exception handling). .NET framework bao gồm tập các thư viện lập trình lớn, và những thư viện này hỗ trợ việc xây dựng các chương trình phần mềm như lập trình giao diện; truy cập, kết nối cơ sở dữ liệu; ứng dụng web; các giải thuật, cấu trúc dữ liệu; giao tiếp mạng... CLR cùng với bộ thư viện này là 2 thành phần chính của.NET framework. .NET framework đơn giản hóa việc viết ứng dụng bằng cách cung cấp nhiều thành phần được thiết kế sẵn, người lập trình chỉ cần học cách sử dụng và tùy theo sự sáng tạo mà gắn kết các thành phần đó lại với nhau. Nhiều công cụ được tạo ra để hỗ trợ xây dựng ứng dụng .NET, và IDE (Integrated Developement Environment) được phát triển và hỗ trợ bởi chính Microsoft là Visual Studio.[1] 1.2. Kiến trúc của .Net framework .Net framework được giới thiệu bao gồm 2 thành phần chính là Common Language Runtime (CLR) và Base Class Libraries (BCL). Một trong các thành phần này đều có vai trò cực kỳ quan trọng trong việc phát triển các dịch vụ và các ứng dụng của .Net. Common Language Runtime (gọi tắt là bộ thực thi) được xây dựng trên các dịc vụ điều hành. Nó chịu trách nhiệm thực hiện các ứng dụng và đảm bảo các phần liên quan đến ứng dụng đều được đap ứng như quản lý bộ nhớ, an ninh bảo mật, tích hợp ngôn ngữ,… Bộ thực thi bao gồm nhiều dịch vụ hỗ trợ phát triển và triển khai ứng dụng cũng như cảu thiện đáng tin cậy của ứng dụng. Tuy vậy, những nhà phát triển 1

trên thực tế không tương tác với CLR. Họ sử dụng một tập các thư viện cơ sở được xây dựng bên trên bộ thực thi này thông qua các ngôn ngữ lập trình. Như là một phần của các lớp cơ sở, .Net framework còn cung cấp một mô hình lập trình ứng dụng cho Web ASP.Net cung cấp các thành phần và các dịch vụ ở mức cao hơn nhằm mục đích phát triển các dịch vụ và các ứng dụng Web XML.

Hình 1.1: Sơ đồ kiến trúc .Net framework 1.2.1. Common Language Runtime – CLR. Common Langua Runtime trong .Net framework quản lý sự thực hiện mã và cung cấp sự truy cập vào nhiều loại dịch vụ giúp cho quá trình phát triển được dễ dàng hơn. Common Language Runtime có khả năng tích hợp các 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. 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 để cung cấp các dịch vụ hỗ trợ đa ngôn ngữ, bảo mật, quản lý thời gian sống và quản lý bộ nhớ.

2

1.2.2. Base Class Libraries. Thư viện các lớp cơ sở .Net framework cung cấp một tập các lớp, hướng đối tượng có thứ bậc và có thể mở rộng chúng được sử dụng bởi bất cứ ngôn ngữ lập trình nào. Như vậy, tất cả các ngôn ngữ từ Jscript tới C++ trở nên bình đẳng và các nhà phát triển có thể tự do lựa chọn ngôn ngữ mà họ vẫn quen dung. Tập các lớp, các kiểu giá trị và giao diện này được tổ chức bằng một hệ thống Namespace. Để khai báo một Namespace ta dùng: namespace NamespaceName { // nơi chứa đựng tất cả các class } Trong đó, Namespace: là từ khóa khai báo một NameSpace NamespaceName: là tên của một Namespace 1.2.3. ASP.Net. ASP.Net là một tập hợp cac lớp nằm trong thư viện lớp cơ sở. ASP.Net cung cấp một mô hình ứng dụng Web dưới dạng một tập các đối tượng điều khiển và cung cấp cơ sở hạ tầng giúp bạn tạo ra các ứng dụng Web một cách dễ dàng. Các đối tượng điều khiển này được xây dựng cho các ứng dụng trên máy phục vụ phản ánh những đối tượng điều khiển giao diện người dùng HTML đặc thù như listbox, textbox, button,..v…v. ASP.Net cũng cung cấp những đặc tính như quản lý trạng thái và phục hồi tiến trình giúp giảm bớt số lượng mã mà một người phát triển phải viết và tăng độ tin cậy của ứng dụng. Ngoài ra ASP.Net cho phép các nhà phát triển chuyển giao phần mềm như là một dịch vụ. Khi sử dụng những đặc tính các dịch vụ Web XML ASP.Net, các nhà phát triển ASP.Net có thể viết những giao dịch logic đơn giản và cơ sở hạ tầng ASP.Net sẽ chịu trách nhiệm chuyển dịch vụ đó theo đường SOAP và các giao thức khác. ASP.Net làm việc với mọi ngôn ngữ và công cụ. 3

1. Những phát triển thường áp dụng chính sách an ninh bằng việc dùng Win32 API. .  Quyền thi hành dựa trên tính xác thực và chính sách an ninh. . Những dòng mã khó hiểu được sắp xếp lại để sử lý một cách đơn giản nhất.  Lớp Crytography cung cấp các thuật toán mã hóa an toàn.Net framework khá quan trọng trong vấn đề an ninh và mã hóa:  Thiết lập các chính sách an ninh và tính xác thực.Net framework và Common Language Runtime cho phép người lập trình làm việc đơn giản hơn với các phương pháp bảo mật. Dưới đây là một số các tính năng được cung cấp bởi nền tảng .Net Security framework được tích hợp các tính 4 .Net framework cung cấp nhiều phương pháp đơn giản bằng cách đưa Win32 Security API vào một đối tượng đơn giản hơn.2.  Quản lý và xác thực môi trường ứng dụng. . họ thường phải cố gắng làm một lối lập trình phức tạp.CHƯƠNG 2: .NET FRAMEWORK TRONG BẢO MẬT 2. 2. Rất nhiều phép toán như lấy khóa từ trong CSP giờ có thể tự động lấy khóa trong lớp an ninh của . Thêm nữa mỗi lớp trong .Net Framework và Common Language Runtime.Net Security framework.Net Framework và Common Language Runtime.  Quyền truy cập thông qua việc xác thực người dùng và vai trò của người dùng. . Giả sử như chống lại việc thông tin bị đánh cắp bằng cách sử dụng phương pháp bảo mật thích hợp trong chương trình. Các mã độc có thể ngăn chặn bằng việc phân quyền người sử dụng và bảo vệ truy cập mã nguồn. ví dụ như việc lấy khóa trong Cryptographic Service Provider (CSP) mà rất nhiều người phát triển thường bỏ qua nó. Một vấn lớn trong lập trình các phương pháp an ninh sử dụng Win32 API là rất khó khan trong để hiểu và sử dụng.

Net framework.  Kiểm soát lỗi tránh những lỗi bất thường trong quá trình chạy.  Kiểm tra kiểu dữ liệu trong quá trình chạy chương trình để tránh đưa ra kiểu dữ liệu sai. 2.Net tích hợp thêm các dữ liệu lớn để định nghĩa mã nguồn và dữ liệu chứa trong chương trình. Sử dụng được sự hiểu biết đó. Để thực hiện việc kiểm tra kiểu an toàn. Để sử dụng được những dịch vụ của CLR. Độ tin cậy và nền tảng của . CLR có thể ép kiểu chính xác để đưa ra các luật trong việc định kiểu an toàn.3. .4.Net đã tiến xa một bước để giải quyết vấn đề về độ tin cậy. CLR cung cấp một tập hợp dịch vụ.Net framework xử lý rất nhiều dịch vụ an ninh tự động đáng tin cậy như:  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. .  Bảo vệ theo vai trò để xác thực và giới hạn thực thi cho người sử dụng.  Bảo vệ theo chứng thực quản lý việc cho phép sử dụng mã cơ sở. Khi sử dụng bất kỳ một biện pháp an ninh hay các kỹ thuật mã hóa.năng an ninh được và khai báo như lớp được niêm phong không thể đánh cắp và bị lộ. Định kiểu an toàn hoàn toàn có thể thực hiện được vì CLR hiểu chi tiết về loại dữ liệu nào đang được quản lý. Trình quản lý mã được tự 5 . Quản lý kiểu mã và định kiểu an toàn. quản lý mã cần phải dự đoán trước.  Tự động gom rác một cách hiệu quả để tiết kiệm bộ nhớ. sắp xếp và kiểu đồng nhất. 2. phải chắc chắn về độ tin cậy của chương trình. làm tăng tính tin cậy và tính an toàn. Mã có thể sử dụng dịch vụ của CLR có tên là quản lý mã. như kiểm tra định kiểu an toàn và tự động thu gom rác.  Đi dọc stack để kiểm tra sự cho phép để gọi mã. Nền tảng .

5. Mã hóa theo các thuật toán mã hóa đối xứng như: DES. nhưng nó rất khó sử dụng.Security.  CspParameters: Chứa thông tin của các tham số trong những thuật toán đặc biệt để có thể lưu trữ và lấy lại thông tin qua CSP. using System. Mặc dù CryptoAPI cung cấp đầy đủ sự hỗ trợ cho ngành lập trình mật mã.Cryptography có một số lớp chính như sau:  SymmetricAlgorithm: Lớp mã hóa đối xứng. Cách sử dụng thư viện Cryptography.Net framework làm đơn giản hóa việc sử dụng API bằng cách cung cấp một lớp với tên gọi System.  CryptographicException: Chứa thông tin về lỗi của các loại mã khác nhau. Lớp Cryptography và một số hàm mã hóa được ứng dụng trong .  ToBase64Transform và FromBase64Transform: Dùng để chuyển đổi các dãy Byte và Base64.động chấp nhận hoặc từ chối bởi CLR.Cryptography.Cryptography dùng cho lập trình mã hóa.5. DSA. Trình quản lý bộ nhớ tự động này gần giống với việc thu gom rác. System. 2.  CryptoStream: Kết nối dòng dữ liệu nguồn với các thuật toán mã hóa. RC 2. Tổng quan lớp Cryptography.  AsymmetricAlgorithm: Lớp mã hóa bất đối xứng.  RandomNumberGenerator: Lớp cơ sở sinh số ngẫu nhiên.  HashAlgorithm: Lớp cơ sở hỗ trợ thuật toán băm. Phải thật sự hiểu rõ về mật mã học và phải làm việc với rất nhiều các thành phần cũng như những con số lớn trong API.Security.Security. Triple DES. nó sẽ mã hóa theo các thuật toán RSA. 6 .Net Framework 2. . Microsoft đăng ký bản quyền sở hữu Win32 Cryptography API (CryptoAPI) vào năm 1996 tích hợp trong Win NT.1. Thu gom rác chống lại việc rò rỉ bộ nhớ và tăng độ tin cậy. Rijndael.

Lưu ý rằng người gửi và người nhận (ví dụ. Cùng với các thuật toán. phương thức hoạt động và padding đó cũng phải được thoả thuận. Cho thấy cách mật mã đối xứng hoạt động.Net. có những chi tiết có liên quan. Các thuật toán mã hóa đối xứng trong . Bob và Alice) phải đồng ý trước về những gì chìa khóa và những thuật toán bí mật được sử dụng. 7 . chẳng hạn như các vector khởi tạo.Hình 2.2.5.1: Các lớp trong Cryptography 2.

Trong mỗi trường hợp được khai báo “protected” và thuộc tính ảo sẽ có chung kiểu dữ liệu và tên sẽ cùng được loại bỏ chỉ có giá trị gắn liền với trường được khai báo “protected” 8 .Hình 2. việc cố gắng đặt cỡ của khối thành giá trị cụ thể là không hợp pháp trong thuật toán mã hóa đối thành giá trị cụ thể là không hợp pháp trong thuật toán mã hóa đối xứng. Tuy nhiên những trường này có thể truy vấn thông qua các thuộc tính ảo. sẽ được cho phép bởi CryptographicException. dựa trên thuật toán cụ thể đang được sử dụng.2: Quá trình mã hóa và giải mã thuật toán mã hóa đối xứng 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. dựa trên lớp thực tế đang sử dụng. thuộc tính ảo thực thi cụ thể trên lớp cụ thể. Theo cách này. Lớp SymmetricAlgorithm có một vài trường được khai báo “protected” nên không thể truy vấn trực tiếp vào phương thức không được cung cấp bởi lớp. Ví dụ như trường số nguyên BlockSizeValue có thể truy vấn thông qua thuộc tính BlockSize theo kiểu thích hợp.

Kiểu CipherMode. Lấy hoặc đặt giá trị cho kích cỡ khối dưới dạng các bit cho thuật toán. Các thuộc tính có trong lớp SymmetricAlgorithm được thể hiện như sau: Thuộc tính BlockSize Ý nghĩa Kiểu int. Lấy kích cỡ của khối được hỗ trợ trong thuật toán mã hóa đối xứng. Lấy hoặc đặt chế độ để thực hiện trong các thuật toán. Kích cỡ thích hợp sẽ được phân biệt bởi LegalKeySizes trong mỗi thuật toán. Lấy kích cỡ của khóa được hỗ trợ trong thuật toán mã móa đối xứng. bắt buộc phải có ở một số chế độ Cirpher Mode. IV Key KeySize LegalKeySizes LegalBlockSizes Mode 9 .. để dữ liệu tổng thể có thể được mã hóa hoặc giải mã trong một bước.được giữ lại. Khối cuối cùng sẽ được gắn thêm kích cỡ của nó Kiểu mảng Byte. Lấy hoặc đặt cỡ cho khóa bí mật dưới dạng các bit. Lấy hoặc đặt giá trị ban đầu cho vector trong thuật toán mã hóa đối xứng. Kiểu mảng Byte. 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ã. Kiểu int. Dữ liệu mà lớn hơn kích cỡ khối sẽ được chia ra các khối khác có kích cỡ giống như khối đã tạo.

Tạo đối tượng SymmetricAlgorithm để mã hóa hoặc giải mã. Trả về kiểu void. 10 Create CreateDecryptor CreateEncryptor Equals GenerateIV GenerateKey . Bảng 2. Kế thừa từ lớp Object. Khởi tạo giá trị vector bất kỳ. giải phóng nguồn được sử dụng trong thuật toán mã hóa đối xứng. ToString. Trả về kiểu void. SymmetricAlgorithm cũng hỗ trợ các phương thức chuẩn Equals. Phương thưc tham chiếu đến ICrptoTranform sử dụng để chuyển dữ liệu thành các khối. Tạo đối tượng mã hóa sử dụng khóa và vector khởi tạo. Finalize. Phương thưc tham chiếu đến ICrptoTranform sử dụng để chuyển dữ liệu thành các khối. GetHashCode. Giá trị trả về có dạng bool. Kiểu thiết kế này tạo ra các khóa bí mật khác nhau.1: Các thuộc tính của Symmetric Algorithm. Tất nhiên. sử dụng để so sánh 2 đối tượng SymmetricAlgorithm cho bằng nhau.Padding Kiểu PaddingMode. Sẽ gọi Dispose. Phương thức trả về đối tượng SymmetricAlgorithm. GetType và MemberwiseClone những phương thức mà đã được định nghĩa ở lớp Object cơ s ở. SymmetricAlgorithm được thiết kế là lớp “public” và không chứa tham số. Phương thức chung Clear Ý nghĩa Phương thức trả về kiểu void. Khởi tạo khóa bất kỳ. Tạo đối tượng giải mã sử dụng khóa và vector khởi tạo. Lấy hoặc đặt giá trị chèn vào các byte còn trống của khối cuối cùng.

GetHashCode Kế thừa từ lớp Object. Kế thừa từ lớp Object. 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. cung cấp giá trị băm cho đối tượng SymmetricAlogrithm. vì đây là một đối tượng trừu tượng. Bạn sẽ làm việc với các class được cung cấp và nó hoạt động như một phương thức ảo của Symmetric Algorithm dưới đây là sơ đồ các lớp trong SymmetricAlgorithm. 11 .2: Các phương thức có trong SymmetricAlgorithm. Trả về kiểu int. Trả về kiểu bool. Chúng ta không làm việc trực tiếp với đối tượng SymmetricAlgorithm. Trả về kiểu Type. GetType ToString ValidKeySize Bảng 2. sử dụng để lấy kiểu cho đối tượng SymmetricAlogrithm. Kế thừa từ lớp Object. sử dụng để cung cấp chuỗi hiển thị cho đối tượng SymmetricAlogrithm.

Cách khai báo: 12 . Bây giờ chúng ta sẽ tìm hiểu ý nhĩa của các lớp và cách khai báo:  DES là lớp trừu tượng đóng gói theo thuật toán mã hóa đối xứng.Hình 2. Chúng ta có thể thấy trong hình 2. Cách khai báo: DESCryptoServiceProvider desCSP = new DESCryptoServiceProvider(). chúng cũng là các lớp trừu tượng.  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.3 là các lớp có trong lớp SymmetricAlgorithm.3: Các thuật toán mã hóa bất đối xứng có trong lớp Symmetric Algorithm.

TripleDESCryptoServiceProvider TripleDESCryptoServiceProvider(). Sau đó. 192 bit 128. Kích thước khóa và khóa mặc định của các thuật toán mã hóa đối xứng được sử dụng trong . Bất cứ ai không biết khóa bí mật sẽ mất một thời gian dài lấy bản rõ từ bản mã này. Bob cho phép tất cả mọi người truy cập vào khóa công khai. 13 .3: Kích thước khóa của các thuật toán mã hóa đối xứng 2.5. khi Alice có một số thông tin bí mật mà cô muốn gửi cho Bob. Cách khai báo: RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider(). nhưng Bob có khóa bí mật và có thể dễ dàng giải mã bản rõ ban đầu.Net. Để sử dụng mật mã không đối xứng. 192. trong đó có Alice. Hình 4-1 cho thấy cách mã hóa bất đối xứng được sử dụng. Sau đó cô gửi bản mã kết quả cho Bob. Cách khai báo: AesCryptoServiceProvider aesCSP = new AesCryptoServiceProvider(). Các thuật toán mã hóa bất đối xứng trong . cô mã hóa dữ liệu bằng cách sử dụng một thuật toán bất đối xứng thích hợp và khóa công khai được tạo ra bởi Bob. Bob ngẫu nhiên tạo ra một cặp public và private key. 256 bit Kích thước khóa mặc định 64 bit 128 bit 192 bit 256 bit Bảng 2. tdesCSP = new  Rijndael là lớp trừu tượng đóng gói theo thuật toán mã hóa đối xứng.Net framework: Thuật toán DES RC 2 Triple DES Rijndael Kích thước khóa hợp lệ 64 bit Từ 40 đến 128 bit 128.3.  RC 2 là lớp trừu tượng đóng gói theo thuật toán mã hóa đối xứng.

.Net framework thực thi thuật toán mã hóa đối xứng thông qua lớp cơ sở AsymmetricAlgorithm cũng giống như việc sử dụng các thuật toán mã hóa đối xứng thông qua lớp SymmetricAlgorithm. Sau đây là sơ đồ các lớp trong lớp AsymmetricAlgorithm: 14 .4: Cách mã hóa bất đối xứng được sử dụng.Hình 2.

Các phương thức được thể hiện trong lớp AsymmetricAlgorithm: Phương thức chung KeySize LegalKeySizes Ý nghĩa Kích thước của khóa tính theo bit Giá trị kích thước khóa hợp lệ tính the 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 thuật toán được sử dụng để ký trên đối tượng hiện thời 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 FromXmlString() 15 .5: Thuật toán mã hóa đối xứng trong lớp Asymmetric Algorithm.Hình 2.

Exponent: Giá trị mũ của khóa.XML: tbxPublicKeyAsym. D: Giá trị khía bí mật.Text = rsa. e. Cách khai báo thuật toán mã hóa bất đối xứng RSA: RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(). d.4: Các phương thức chung của lớp Asymmetric Algorithm. Sau đây là cấu trúc của file XML gồm:        Modulus: Giá trị mô-đun của khóa. tbxPrivateKeyAsym. n. khóa công khai và khóa bí mật đều được lưu dưới dạng XML. Sinh cặp khóa bí mật và công khai lưu dưới dạng file . Ở trong thuật toán mã hóa bất đối xứng.ToXmlString(false). P: Được sử dụng để tăng hiệu quả của thuật toán RSA.ToXmlString() Trả về một thể hiện XML cho đối tượng bất đối xứng đang sử dụng Bảng 2.Text = rsa.ToXmlString(true). Q DP DQ  InverseQ: Khóa công khai: <RSAKeyValue> <Modulus>rDfiEFFnSsTOckbA/gh7H75f7yQAGpsRNDFFuTxlepQA/oLoZVEdC u4fyzNPzRl9Z5Lz25EDnOwliX2Py6vljxVIPQHC/H5n+yYSUvZtdiL9ELPxI2Tz 9807TWWDvKm7nx/4XeYvLc4/8swMnbaaUSktX3bHvaElLUV/DCQck/5XU+Q 49+/2+bF6IuwsNadNYOx3JgfkmYvPHmIEbLoqgKByBrKp4jnR+gOD7rzUPqvL EfYLMvLGAPRCbYn4AvbA8Mnpo1s4PhypY3wW7O46WGElM7B/VWksltJ+h 9+/xCy2jptNlxmRJrB2sIf61EdK3TTFGlV6LnNE4LLpwQM9WQ==</Modulus> <Exponent>AQAB</Exponent> </RSAKeyValue> Khóa bí mật: 16 .

17 . Thực hiện giải mã file bằng private key.<RSAKeyValue><Modulus>rDfiEFFnSsTOckbA/gh7H75f7yQAGpsRNDFFuTxl epQA/oLoZVEdCu4fyzNPzRl9Z5Lz25EDnOwliX2Py6vljxVIPQHC/H5n+yYSU vZtdiL9ELPxI2Tz9807TWWDvKm7nx/4XeYvLc4/8swMnbaaUSktX3bHvaElLU V/DCQck/5XU+Q49+/2+bF6IuwsNadNYOx3JgfkmYvPHmIEbLoqgKByBrKp4j nR+gOD7rzUPqvLEfYLMvLGAPRCbYn4AvbA8Mnpo1s4PhypY3wW7O46WG ElM7B/VWksltJ+h9+/xCy2jptNlxmRJrB2sIf61EdK3TTFGlV6LnNE4LLpwQM9 WQ==</Modulus> <Exponent>AQAB</Exponent> <P>1dVpO8WVUeCUI+8DmSZdAy6wLERPDaC/ntK+sRF0IFPRzkGUCexC7J4 SlCjmm7nmzY0OenpnyAh4X9Gamt9rpTSX765w0bdF8N9GyiZGKwi8H2AwY5 4giXPBFuOmfYkt1kDqEC/jg5nyeufITfWPH3lHBxMzlbzrwUuRqUuw0LE=</P> <Q>zi2tb/DxAfRyK6/LWuaCvZAeCDMUkfuuRnzwrgUBaeti41T8HfQRzLCpag 3p+nes4SSFm0KFuz6JO+tSSjEJ1Ee2v2PATEO6VC9M3PW9I/N31WPCR4gtzG FTkSIM4KlrTiJbMq37RvkbuaLaoBi5c6HFH4OEyTEht8lEth47ISk=</Q> <DP>quiI1KJGh4ulO9dEm/riqrF9U9RBDxZlMa8lhOb7Vv9HmMAnb4rrrq1lEhB iySLby3yrjs8Y9fN3KragCJr8Ma4IpiRZvfTrLOt4bAgNW0X+/mDmLCjtvo7LTN 0la/7hqPZ3Xfq4sK2x9fQdz9mtzC0lzQzW1R6LnBInWRXLO/E=</DP> <DQ>ANvd2haF2n07MIVl8nX9W27LQTt9PXJv8mk403C/5cIOQmYrOrC2lkSy H/f43os7FCED0XbAedwz1CURza9QnCrETx3KQkcR8qHTzyPS6uBrwl7NA2FE 15IcOAGNTi5GfSfVe2uQHWaSP/62rG4N77ZfzNbOacwjmNFk0OFlW6k=</DQ > <InverseQ>NTNFwG5f/bA0paO6R7bgQnsAgM5R51BghexThn4dxlqXlU2QBHx snPhV15IKJHwTEYQv+oUM5r5OiHWZxbtucqZemsD4PcUprjoaZaYqJ29fZ98S d4xi96MZIDTFvU8YXfJyY55Bod4+/I3laNxg28U3DEoY/gu4u3HV99FmOcc=</ InverseQ> <D>CQhMS8FNOtNsJXu3AwvUU1OjifIYLE0OP6/G4aJ8iwuIqtCYWjoBHTHki n6INLBdzqkbL5yhNSGAjX+/ozXCjjjWR1bYkHAbyYUTaHUCxDOtFKtvXgUd M5W4wsQsfuBjFgMx/lDEkDE1UulnTv1FBjUz60IaU0SIo+F1eqBJPGzAReBm BHSDKTjt+6xhpefjZRxTsH+um5zuRphBii8CvbOmTetNaMaIfvE7Huydy4eEc3y nyFcZyxFiMzilxgDIS+Brr7Hm2za5v2dKeAleK0E2fWHWJ1tPwK0Re1XTDzTP cYTrfpAJ2rPjpsOm4hqMLjt9ptb+VygPooNQYSV4YQ==</D> </RSAKeyValue> Các bước thực hiện thuật toán RSA mã hóa file bằng public key:  Chia nhỏ bản rõ thành các khối dữ liệu nhỏ hơn hoặc bằng 128 byte.  Nối các khối đã mã hóa thành bản mã.  Mã hóa các khối nhỏ dữ liệu bằng public key và hàm mã hóa.

Thêm nữa.Net framework. Giải thuật ký số (Digital Signature Algorithm. 18 . Tất cả những thứ đó đều được hỗ trợ bởi . được chỉ ra trong FIPS 186.  Kiểm tra tính hợp lệ của chữ ký.[1] Hoạt động của DSA:  Tạo khóa. viết tắt DSA) là chuẩn của chính phủ Mỹ hoặc FIPS cho các chữ ký số. Giải thuật này được đề nghị bởi Viện các tiêu chuẩn và công nghệ quốc gia (NIST) vào tháng 8/1991 để sử dụng trong chuẩn chữ ký số (DSS).4. Giải thuật toán băm có khóa cũng rất quan trọng trong việc xác thực thông tin.  Giải mã từng khối nhỏ bản mã bằng private key và hàm giải mã.  Nối các khối đã giải mã thành bản rõ. chuẩn được mở rộng hơn năm 2000.Net framework.5. được chấp nhận năm 1993. Các thuật toán hằm băm ở trong . được xem như FIPS 186-2. 2.  Ký lên bản rõ. Một sửa đổi nhỏ được đưa ra năm 1996 trong FIPS 186-1. một vài phiên bản mới của SHA đã được công bố.Net framework dưới dạng các lớp trong HashAlgorithm:  MD5  SHA-1  SHA-256  SHA-384  SHA-512  KeyedHashAlgorithm Tóm tắt các thuật toán băm của . Chia nhỏ bản mã thành các khối dữ liệu bằng 128 byte. Có 2 loại thuật toán hàm băm thường dùng là SHA-1 (Secure Hash Algorithm) và MD5 (Message Digest).

Dưới đây là sơ đồ trong lớp HashAlgorithm.5: Các thuật toán hàm băm. Ứng với mỗi lớp sẽ có một lớp thực thi cụ thể và ta sẽ sử dụng chúng trực tiếp: 19 . Các lớp này cũng là lớp trừu tượng nên ta không thể thao tác trực tiếp lên lớp.Thuật toán Kích thước khối đầu vào (bit) 512 512 512 1024 1024 Tin nhắn giới hạn (bit) 264 264 264 2128 2128 Kích thước mã băm (bit) 128 160 256 384 512 MD5 SHA-1 SHA-256 SHA-384 SHA-512 Bảng 2.

Net framework: Khai báo MD5: MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(). 20 . Cách khai báo các lớp của thuật toán hàm băm có trong . byte[] hashKey = md5.ComputeHash(bytesKey).Hình 2.6: Các thuật toán mã hóa bằng hàm băm.

Những lớp này mã hóa thuật toán hàm băm có khóa dựa trên thuật toán SHA-1 và TripleDES: HMACSHA1 msha1 = new HMACSHA1 (). Khai báo SHA-256: SHA256CryptoServiceProvider sha2 = new SHA256CryptoServiceProvider(). ở trong lớp này nó thực thi cụ thể dựa trên lớp HMACSHA1 và MACTripleDES.Khai báo SHA-1: SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider().ComputeHash(bytesKey). byte[] hashKey = sha1. Nó không thường được sử dụng. MACTripleDES mtrdes = new MACTripleDES (). Khai báo SHA-384: SHA384CryptoServiceProvider sha3 = new SHA384CryptoServiceProvider(). Khai báo lớp KeyedHashAlgorithm. Các thuộc tính có trong lớp hàm băm. Thuộc tính này trả về kích thước của mã băm (bit) mà thuật toán băm tạo ra.ComputeHash(bytesKey). byte[] hashKey = sha5. byte[] hashKey = sha2. Thuộc tính Hash Ý nghĩa Thuộc tính này trả về giá trị của mã băm tính toán. byte[] hashKey = sha3.ComputeHash(bytesKey). Khai báo SHA-512: SHA512CryptoServiceProvider sha5 = new SHA512CryptoServiceProvider(). HashSize 21 .ComputeHash(bytesKey).

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 OIDs. Chúng ta sẽ xem OIDs một cách cụ thể trong các lớp của . ComputeHash Initialize 22 . Những người lập trình cần thỏa thuận đặt tên chung để hang tram các chuẩn.6: Các thuộc tính có trong lớp Hash Algorithm.Net Security Framework như SignHash và VerifyHash trong lớp RSACryptoServiceProvider và DSACryptoServiceProvider. Các phương thức của lớp Hash Algorithm: Methods Create Ý nghĩa Phương thức tĩnh này tạo ra một thể hiện mới của lớp HashAlgorithm bằng tên. Bảng 2.CanReuseTransform Các thuộc tính từ lớp ICryptoTranform.7: Các phương thức của lớp Hash Algorithm. Lớp này được sử dụng bởi các lớp học thuật toán thực hiện để khởi tạo trạng thái của họ trước khi sử dụng. thuật toán và kiểu dữ liệu được đặt dưới một cái tên duy nhất. thuật toán. các kiểu dữ liệu. Có số lượng lớn OIDs để định danh mỗi kiểu riêng như: giao thức. nhưng được thực hiện bởi lớp HashAlgorithm Bảng 2. Phương thức ComputeHash được sử dụng để tạo ra mã băm từ mảng byte và luồng dữ liệu. mà không liên quan trực tiếp đến băm. OIDs (Object Identifiers) sẽ được đị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.

3.3.14.26”).840. 23 .3.3.”1.16.3.101.101. Sau đây là một ví dụ minh họa việc sử dụng OIDs như một thành phần trong phương thức SignHash của lớp RSACryptoServiceProvider.3.14.4.Cryptographic Hash Algorithm MD5 SHA-1 SHA-256 SHA-384 SHA-512 OIDs 1.26 2.2.113549. Tất nhiên nó chỉ là giả định vì biến hashbytes là một mảng byte đã được tạo ra bằng cách gọi hàm ComputerHash của lớp SHA-1.840.2.6: OIDs của các thuật toán hàm băm.4.SignHash(hashbytes.1 2.3 Bảng 2. RSACryptoServiceProvider rsa = new RSACryptoServiceProvider().4.2.2.16. Signaturebytes = rsa.5 1.2 2.2.1.1.16.3.840.101.840.1.2.2.

NET FRAMEWORK 3. OFB. Rijndael (AES) và 4 Radiobutton đại diện cho 4 loại mã hóa đó. Lập trình mã hóa đối xứng trong . 3. Symmetric Algorithm bao gồm 4 thuật toán DES. TripleDES.1. Padding bao gồm 3 24 . chọn chế mặc định là CBC.CHƯƠNG 3: LẬP TRÌNH MÃ HÓA TRONG . ở đây chọn chế độ mặc định là DES. Cirpher Modes bao gồm 5 Radiobutton đại diện cho 5 chế độ là ECB. CTS. Padding. Mã hóa và giải mã file với thuật toán mã hóa đối xứng. RC2.1: Giao diện Symmetric Algorithm. Dưới đây là một số giao diện của chương trình. CBC. Chúng ta sẽ cùng xem một chương trình demo và cùng giải thích làm thế nào để mã hóa một file với các thuật toán mã hóa đối xứng.1.Net. Giao diện chương trình gồm 3 GroupBox: Symmetric Algorithm. CFB.1. Hình 3. Modes.

Checked == true) { tbxCreateKeySym. EventArgs e) { if (rbt3DES.Create("RC2"). } } private void rbt3DES_CheckedChanged(object sender. sa = SymmetricAlgorithm.Checked == true) { tbxCreateKeySym.Create("DES").Radiobutton đại diện cho 3 chế độ padding PKCS #7.Checked == true) { tbxCreateKeySym.Enabled = true. None chọn chế độ mặc định là PKCS #7. EventArgs e) { if (rbtRC2. private void rbtDES_CheckedChanged(object sender.Create("AES").Enabled = false.Enabled = true.Create("TripleDES"). Zeros. Khi load form hoặc có sự thay đổi ở Radiobutton ở Symmetric Algorithm thì sẽ gọi đến hàm khởi tạo thuật toán mã hóa đối xứng. } } private void rbtRC2_CheckedChanged(object sender. sa = SymmetricAlgorithm. } } 25 . EventArgs e) { if (rbtAES.Checked == true) { tbxCreateKeySym. sa = SymmetricAlgorithm. EventArgs e) { if (rbtDES. } } private void rbtAES_CheckedChanged(object sender.Enabled = false. sa = SymmetricAlgorithm.

CBC.Checked == true) { sa. rbtCBC.OFB. lựa chọn chế độ mặc định CBC cho các quá trình mã hóa và giải mã.Ở Modes. EventArgs e) { if (rbtOFB.Checked == true) { sa.Mode = CipherMode. } } 26 . EventArgs e) { if (rbtCBC. } } private void rbtCBC_CheckedChanged(object sender.Mode = CipherMode.Checked = true. EventArgs e) { if (rbtEBC. Khi có sự thay đổi ở đây sẽ gọi tới hàm: private void rbtEBC_CheckedChanged(object sender.Checked == true) { sa.Mode = CipherMode. } } private void rbtCTS_CheckedChanged(object sender. EventArgs e) { if (rbtCFB.CFB.Checked == true) { MessageBox. } } private void rbtOFB_CheckedChanged(object sender.Checked == true) { sa.Show("Not use!!!!").ECB. EventArgs e) { if (rbtCTS.Mode = CipherMode. } } private void rbtCFB_CheckedChanged(object sender.

byte[] key = sa. foreach (int b in iv) strIV += b. } tbxCreateKeySym. public string GenKey() { sa.IV.Text = GenKey().GenerateIV(). foreach (int b in key) strKey += b. string strIV = "".Checked == true) { tbxCreateKeySym. string strKey = "".Key. } Hàm GenKey() và GenIV(). byte[] iv = sa.Enabled = false.Text = GenIV(). EventArgs e) { tbxCreateIVSym. tbxCreateKeySym.Text = GenKey().ToString("X2") + " ". return strIV. } public string GenIV() { sa.GenerateKey(). } private void btnCreateIV_Click(object sender. EventArgs e) { if (rbtAES. return strKey.ToString("X2") + " ". } 27 .Ở Button Create Key và Create IV khi click vào sẽ gọi đến GenKey() và GenIV() dùng để sinh khóa và sinh iv cho mỗi thuật toán: private void btnCreateKeySym_Click(object sender.

DefaultExt = "txt".txt private void btnSaveKey_Click(object sender.Các button Save Key và Save IV sẽ lưu key và iv thành các file được lưu mặc định .OK) { SaveIV(saveFD.Text. return. MessageBox. } } private void btnSaveIV_Click(object sender.OK) { SaveKey(saveFD. HashKey(2. LoadIV(tbxLoadIVSym. } 28 . EventArgs e) { if (rbtAES. khi đã có đầy đủ các thông tin cần thiết quá trình mã hóa sẽ diễn ra. } } Khi muốn mã hóa và giải mã người dùng phải chỉ đường dẫn của Key. saveFD. khi người dùng click vào button Encrypt.Show("Encrypted!!!").FileName).Text. Bước vào quá trình giải mã. if (saveFD.FileName).Title = "You want to save file?". tbxCreateKeySym. tbxSourceFileSym. tbxDesFileSym.Checked == true) { EncryptData(4. Destination File. EventArgs e) { saveFD = new SaveFileDialog(). saveFD. if (saveFD. IV qua các đường dẫn Load Key. Load IV và đường dẫn Source File. private void btnEncryptSym_Click(object sender.ShowDialog() == DialogResult. saveFD. saveFD.Title = "You want to save file?".Text).ShowDialog() == DialogResult.Text)). EventArgs e) { saveFD = new SaveFileDialog().DefaultExt = "txt".

EventArgs e) { if (rbtAES.Text)).Show("Encrypted!!!"). return. LoadKey(tbxLoadKeySym.Text. HashKey(1.Text. tbxSourceFileSym. } if (rbtRC2.Text). } if (rbt3DES. } } Và ở button Decrypt. return. MessageBox. tbxSourceFileSym.Show("Decrypted!!!").Text.Text.Text. LoadKey(tbxLoadKeySym.Text)). } if (rbtDES.Text).Text)). MessageBox.Checked == true) { EncryptData(1.Text)). thực hiện quá trình giải mã với key và iv đã được dùng để mã hóa.Text.Text.Checked == true) { DecryptData(1.if (rbtDES. return.Show("Encrypted!!!"). tbxSourceFileSym.Checked == true) { DecryptData(4. LoadIV(tbxLoadIVSym.Show("Encrypted!!!"). MessageBox. tbxSourceFileSym.Text). LoadIV(tbxLoadIVSym. 29 .Text)). MessageBox. tbxSourceFileSym. tbxCreateKeySym. tbxDesFileSym.Text).Checked == true) { EncryptData(2.Text.Text). LoadKey(tbxLoadKeySym.Text. tbxDesFileSym. tbxDesFileSym. tbxDesFileSym. tbxDesFileSym. HashKey(2. LoadIV(tbxLoadIVSym. private void btnDecryptSym_Click(object sender. tbxLoadKeySym.Checked == true) { EncryptData(3. LoadIV(tbxLoadIVSym. LoadIV(tbxLoadIVSym. return.Text.

Mã hóa file bằng thuật toán mã hóa bất đối xứng.Show("Decrypted!!!").MessageBox. tbxSourceFileSym.Text. } 3.Checked == true) { DecryptData(2. LoadKey(tbxLoadKeySym.Checked == true) { DecryptData(3.Text.2. tbxSourceFileSym. MessageBox. } if (rbtRC2.1.Text). 30 . tbxLoadKeySym.Text. HashKey(1. Dưới đây là một số giao diện của chương trình. return.Show("Decrypted!!!"). LoadIV(tbxLoadIVSym.Text. LoadIV(tbxLoadIVSym.Text)).Text)).Show("Decrypted!!!"). Chúng ta sẽ cùng xem một chương trình demo và cùng giải thích làm thế nào để mã hóa một file với các thuật toán mã hóa đối xứng. tbxDesFileSym. return. tbxDesFileSym.Text). return. } if (rbt3DES. MessageBox.

EventArgs e) 31 .5 và OAEP.ToXmlString(true). private void btnCreateKeyAsym_Click(object sender. } Cặp khóa public và private key sẽ được lưu khi người dùng click vào button Save Key. Khi click vào button Create Key.ToXmlString(false).XML.Hình 3. tbxPrivateKeyAsym. Ở đây chỉ cung cấp một thuật toán mã hóa bất đối xứng là RSA và các padding: PKCS #1 v1. private void btnSavePubKey_Click(object sender.2: Giao diện của chương trình Asymmetric Alogorithm. public key và private key được sinh ra dưới dang file . tbxPublicKeyAsym. EventArgs e) { rsa = new RSACryptoServiceProvider().Text = rsa.Text = rsa.

nhập các đường dẫn tới file cần mã hóa và lưu file mã hóa. saveFD.Text == "") { MessageBox.ShowDialog() == DialogResult.Dispose().Text). private void btnEncrypt_Click(object sender.FileName. Khi click vào button.DefaultExt = "xml". người dùng phải chỉ đường dẫn tới nơi lưu khóa public key ở Load Key. tbxPublicKeyAsym.Title = "Do you want to save file?".Text).OK) { string pathSave = saveFD. } saveFD. } saveFD.Dispose().Text == "") { MessageBox.ShowDialog() == DialogResult.FileName. return.Title = "Do you want to save file?". saveFD. saveFD. 32 . if (saveFD.DefaultExt = "xml". Encrypt quá trình mã hóa sẽ bắt đầu. EventArgs e) { saveFD = new SaveFileDialog(). EventArgs e) { if (tbxDesFileAsym. if (saveFD. tbxPrivateKeyAsym.{ if (tbxPublicKeyAsym. WriteFileText(pathSave.Show("You have not created key !!!"). } saveFD = new SaveFileDialog().OK) { string pathSave = saveFD. saveFD. } Bước vào quá trình mã hóa.Show("Choose the source file to encrypt!!!"). } private void btnSavaPrivateKey_Click(object sender. WriteFileText(pathSave.

Show("Choose the Public Key or Private Key to Decrypt !!!"). Button Decrypt.Show("Path wrong!!"). MessageBox. return.Text == "") { MessageBox. } if (tbxLoadKeyAsym.Text. private void btnDecrypt_Click(object sender. return. tbxDesFileAsym.Text. EventArgs e) { if (tbxDesFileAsym. } if (tbxLoadKeyAsym. Khóa private key sẽ được đọc từ đường dẫn Load Key.Text == "") { MessageBox. } if (tbxDesFileAsym.Show("Path wrong!"). return. } 33 .Text).return. } tbxSourceFileAsym.Text == "") { MessageBox.Text == "") { MessageBox.Text == "") { MessageBox.Show("Choose the source file to encrypt!!!"). return.Show("Choose the Public Key or Private Key to Encrypt !!!").Show("Encrypted !!!"). return. } EncryptRSA(tbxLoadKeyAsym. dùng để giải mã file đã được mã hóa bằng private key đã được tạo ra cùng public key. } if (tbxDesFileAsym.

MessageBox. quá trình mã hóa sẽ bắt đầu.Text). 34 .Text. tbxDesFileAsym. Mã hóa file bằng thuật toán hàm băm. SHA-1.Text.3: Giao diện Hash Algorithm. Ở mã hóa file bằng thuật toán hàm băm sẽ được hỗ trợ các thuật toán như: MD5.DecryptRSA(tbxLoadKeyAsym. Tiếp đó lúc click vào button Hash. SHA-512. Keyed Hash Algorithm qua các radiobutton ở trong GroupBox Hash Algorithm.4. Người dùng sẽ phải điền đầy đủ đường dẫn về file cần mã hóa và file để lưu sau khi mã hóa xong.Show("Decrypted !!!"). Thuật toán Keyed Hash Algorithm là hàm băm có key. nên khi chọn thuật toán này sẽ cho phép điền key vào để mã hóa trong khi các thuật toán khác thì không. Hình 3. SHA-384. SHA-256. } 3. tbxSourceFileAsym.1.

} } } 35 . tbxDesFileHash.Text).Text). if (fiSource. tbxDesFileHash.Text.Text == "") { MessageBox.Checked == true && tbxKeyHA. return.Text == "") { MessageBox. tbxSourceFileHash. } else { HashFile(hash.Show("Hash successfull!!!").Text. } MessageBox.Show("Choose source file!!!").private void btnEncryptHash_Click(object sender.Show("Path wrong!!!"). EventArgs e) { if (tbxSourceFileHash.Show("Enter Key!!!").Text == "") { MessageBox.Show("Choose destination file!!!"). tbxSourceFileHash.Exists) { if (hash == 6) { KeyedHashFile(tbxKeyHA. } else { MessageBox. } else if (tbxDesFileHash.Text).Text. } else { FileInfo fiSource = new FileInfo(tbxSourceFileHash. } else if (rbtKeyHash.

Net framework cũng như . Bên cạnh đó bài báo cáo cũng có những mặt hạn chế:  Chương trình còn khá đơn giản.  Tìm hiểu về lớp Cryptopraphy trong .KẾT LUẬN Sau quá trình tìm hiểu đề tài báo cáo.  Chưa có phần tạo chữ ký số. nhóm đã tìm hiểu và thực hiện được một số vấn dể như sau:  Tìm hiểu về .  Bắt hết các lỗi còn thiếu sót.Net framework trong bảo mật thông tin.  Chương trình mã hóa chưa mã hóa được các file có dung lượng lớn.  Chưa có hệ thống hỗ trợ người sử dụng. chưa thân thiện với người dùng.Net framework hỗ trợ trong lập trình bảo mật  Xây dựng được chương trình demo về mã hóa file bằng các thuật toán mã hóa. Hướng phát triển của báo cáo:  Xây dựng chương trình hoàn thiện hơn.  Chưa bắt hết các lỗi trong chương trình.  Bổ sung hệ thống hỗ trợ người sử dụng 36 .

Programing . 37 .Net Security.TÀI LIỆU THAM KHẢO 1.NET_Framework 2. 3.wikipedia.org/wiki/. http://vi.Net Security and Cryptography. Và một số tài liệu khác trên internet. 4. .