Đồ án tốt nghiệp tìm hiểu lược đồ chuyển đổi bản rõ trong chuẩn mật mã rsa

58 1 0
Đồ án tốt nghiệp tìm hiểu lược đồ chuyển đổi bản rõ trong chuẩn mật mã rsa

Đ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

BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT Mà ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ĐỒ ÁN TỐT NGHIỆP TÌM HIỂU LƯỢC ĐỒ CHUYỂN ĐỔI BẢN RÕ TRONG CHUẨN MẬT Mà RSA Ngành: An tồn thơng tin Mã số: 7.48.02.02 Sinh viên thực hiện: Trần Văn Tam Lớp: AT10C Người hướng dẫn 1: TS Nguyễn Võ Nhất Khoa An tồn thơng tin – Học viện Kỹ thuật mật mã Người hướng dẫn 2: ThS Đặng Trung Nhị Trung tâm CNTT & GSANM – Ban Cơ yếu Chính phủ Hà Nội, 2022 BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT Mà ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ĐỒ ÁN TỐT NGHIỆP TÌM HIỂU LƯỢC ĐỒ CHUYỂN ĐỔI BẢN RÕ TRONG CHUẨN MẬT Mà RSA Ngành: An toàn thông tin Mã số: 7.48.02.02 Sinh viên thực hiện: Trần Văn Tam Lớp: AT8B Người hướng dẫn 1: TS Nguyễn Võ Nhất Khoa An tồn thơng tin – Học viện Kỹ thuật mật mã Người hướng dẫn 2: ThS Đặng Trung Nhị Trung tâm CNTT & GSANM – Ban Cơ yếu Chính phủ Hà Nội, 2022 MỤC LỤC (Các bạn sinh viên lưu ý: tất công thức, tham số toán học phải gõ Equation Word) Một số lời khuyên trình bày đồ án tốt nghiệp ii Về hình thức trình bày báo cáo .ii Về đề mục ii Về hình vẽ bảng biểu ii Về phụ lục .ii Về mã chương trình (code) .ii Về lời nói đầu ii Về phần kết luận ii Về trang bìa .ii Danh mục kí hiệu viết tắt ii Danh mục hình vẽ ii Danh mục bảng ii Lời cảm ơn .ii Lời nói đầu .ii Chương Giới thiệu chung hệ mật RSA .2 1.1 Lịch sử đời RSA 1.2 Hoạt động thuật toán RSA 1.2.1 Mô tả sơ lược .2 1.2.2 Tạo khóa .2 1.2.3 Mã hóa 1.2.4 Giải mã 1.2.5 Ví dụ .2 1.3 Tạo chữ ký số cho văn 1.4 Vấn đề an toàn RSA 1.5 Các vấn đề đặt thực tế 1.5.1 Q trình tạo khóa .2 1.5.2 Phân phối khóa 1.5.3 Tấn công dựa thời gian 1.6 Sự cần thiết việc chuyển đổi rõ 1.7 Kết luận chương Chương Chuyển đổi rõ theo PKCS #1 v1.5 .2 2.1 Lược đồ chuyển đổi rõ theo PKCS #1 v1.5 2.1.1 Chuyển đổi rõ theo PKCS #1 v1.5 2.1.2 Giải chuyên đổi rõ theo PKCS #1 v1.5 2.2 Hỗ trợ lược đồ chuyển đổi rõ PKCS #1 v1.5 phiên chuẩn mật mã RSA 2.3 Kết luận chương Chương Lược đồ chuyển đổi rõ OAEP 3.1 Mô tả chung lược đồ chuyển đổi rõ OAEP 3.1.1 Chuyển đổi rõ theo lược đồ OAEP .2 3.1.2 Giải chuyển đổi rõ theo lược đồ OAEP 3.1.3 Sai lầm cách hiểu OAEP 3.2 Áp dụng lược đồ OAEP vào hệ mật RSA .2 3.2.1 Chuyển đổi rõ theo lược đồ OAEP .2 3.2.2 Giải chuyển đổi rõ theo OAEP .2 3.2.3 Hàm băm Hash 3.2.4 Hàm sinh mặt nạ MGF 3.2.5 Tham số P 3.3 Sự điều chỉnh lược đồ OAEP qua phiên khác chuẩn mật mã RSA 3.4 Kết luận chương Chương Xây dựng chương trình minh họa hoạt động lược đồ chuyển đổi rõ 4.1 Yêu cầu chương trình 4.2 Lựa chọn cơng cụ lập trình 4.3 Tính giá trị băm P .2 4.4 Giới thiệu chương trình 4.5 Kết luận chương Kết luận Tài liệu tham khảo Phụ lục MỘT SỐ LỜI KHUYÊN VỀ TRÌNH BÀY ĐỒ ÁN TỐT NGHIỆP Nếu muốn đồ án người phản biện đánh giá cao, trình bày đồ án tốt nghiệp, sinh viên cần lưu ý số vấn đề sau Về hình thức trình bày báo cáo  Chỉ sử dụng thống phông chữ Times New Roman, cỡ chữ 14pt, mà không dùng phông chữ, cỡ chữ khác, ngoại trừ đoạn mã chương trình Khơng tùy tiện thêm dòng trống trước đoạn, đề mục  Không để xảy tra trường hợp tên đề mục cuối trang, nội dung đề mục lại bắt đầu trang  Nếu có cơng thức khơng dùng tính Equation mặc định Word 2007 trở sau (vì xấu), mà cần sử dụng gõ công thức Equation 3.0 tải công cụ MathType để sử dụng Trong Word 2007 trở sau, để chèn công thức với Equation 3.0 chọn: Insert > Object > Microsoft Equation 3.0  Danh mục từ viết tắt phải xếp theo thứ tự bảng chữ  Ngoại trừ đề mục, đoạn văn phải hai biên (Justified), cách dòng đoạn văn 1,3 1,5; dòng thụt vào 1,25 cm (hoặc 0,5 inch); không đặt khoảng cách đoạn  Tất hình vẽ, bảng biểu phải đánh số; số hiệu hình vẽ, bảng biểu phải bao gồm số hiệu chương chứa hình vẽ, bảng biểu Tên hình đặt bên hình, Tên bảng đặt bảng, Chú ý không để xảy trường hợp hình trang mà tên hình bị nhảy sang trang sau, hay tên bảng trang mà bảng lại bắt đầu trang sauu  Một đường link (URL) mục danh mục tài liệu tham khảo Cần phải có tên tác giả, tên viết, đến URL viết tham khảo  Khi đưa vào báo cáo luận điểm, kết trích dẫn từ tài liệu cần tham chiếu đến tài liệu Ví dụ: "Số lượng công DDoS Việt Nam năm 2015 tăng 20% so với năm 2014 [3]" Về đề mục Sau đề mục khơng có dấu câu: dấu chấm, dấu hai chấm, Không để đề mục dạng câu hỏi Ví dụ, thay "Lỗ hổng bảo mật gì?" hay viết lại "Khái niệm lỗ hổng bảo mật" Thay "Tường lửa gì?" sử dụng "Giới thiệu chung tường lửa" Về hình vẽ bảng biểu Cần tham chiếu đến hình vẽ, bảng biểu có báo cáo Nói dễ hiểu đưa hình, bảng vào báo cáo cần phải nhắc đến hình/bảng trình bày báo cáo Ví dụ: "kết đo thể Bảng 2.1 Số liệu bảng 2.1 thể dạng biểu đồ Hình 2.5" Hạn chế sử dụng hình ảnh mang tính biểu tượng Cách hình ảnh phù hợp cho viết dạng truyền thông đại chúng Cịn đồ án tốt nghiệp nói riêng viết mang phong cách khoa học nói chung cần sử dụng hình ảnh thể chất vấn đề (thay dùng hình ảnh giúp người ta tưởng tượng vấn đề) Cần xem xét kỹ lưỡng bảng hình Nếu sinh viên cho khơng phải nhìn vào hiểu nội dung thể bảng hình cần có phần giải thích ý nghĩa bảng hình Đối với bảng dịng, cột có ý nghĩa (là gì) Đối với hình thành phần có ý nghĩa (là gì) Có thể khơng giải thích tất dòng/cột bảng hay tất thành phần hình mà chọn phần cần thiết Về phụ lục Phụ lục nơi để chứa thông tin, liệu cần để minh họa cho luận điểm đồ án lại có kích thước lớn, không phù hợp để đưa vào đồ án với luận điểm tương ứng Nếu có phụ lục khơng cần đánh số Nếu có nhiều phụ lục đánh số theo thứ tự 1, 2, Mọi phụ lục, có, phải tham chiếu đến trình trình bày đồ án Ví dụ "Đoạn chương trình khai thác lỗ hổng trình bày Phụ lục 2" Về mã chương trình (code) Khơng đưa đoạn mã dài vào nội dung đồ án, thay vào đưa vào đoạn mã quan trọng để minh hoạt, dẫn chứng, giải thích cho luận điểm Những đoạn mã dài đưa vào phần phụ lục (nếu cần) Về lời nói đầu Mục "Lời nói đầu" khơng phải chỗ để chém gió hay để thể tài sáng tác văn chương Trong mục này, sinh viên nên giới thiệu thông tin thời sự, cơng trình nghiên cứu có lĩnh vực thuộc chủ đề đồ án, từ phân tích cần thiết phải tìm hiểu, nghiên cứu chủ đề Nói cách khác, trước hết cần rõ tính cấp thiết đề tài đồ án Tiếp đó, xác định tên đề tài cần xác định mục tiêu tìm hiểu, nghiên cứu Tức cần xác định xem đồ án cần phải giải vấn đề Và phần thứ ba (có thể có khơng) giới thiệu cấu trúc đồ án Về phần kết luận Tương tự trình bày phần "Lời nói đầu", mục "Kết luận" khơng phải nơi để chém gió hay để thể thể tài sáng tác văn chương Tuyệt đối không đưa vào câu "em hiểu|nắm|biết " hay "kiến thức thu bổ ích cho em " Thay vào đó, phần "Kết luận" nơi tóm lược lại kết đạt được; khẳng định việc hoàn thành tất hay hoàn thành phần mục tiêu đặt ra; mặt hạn chế xác định hướng khắc phục Về trang bìa Mẫu có trang bìa Đối với đồ án đóng bìa cứng trang bìa thứ dùng để in bìa cứng (bìa chính), cịn trang bìa thứ hai dùng để in bìa phụ Đối với đồ án đóng bìa mềm trang bìa thứ hai dùng để in hai trang bìa Nếu có người hướng dẫn gọi "Người hướng dẫn" mà khơng đánh số DANH MỤC KÍ HIỆU VÀ VIẾT TẮT || Phép nối hai chuỗi bít (hoặc chuỗi octet) ||X|| Độ dài chuỗi bít (hoặc chuỗi octet) X  Phép cộng bít theo mơ-đun Số nguyên nhỏ không nhỏ Số nguyên lớn không lớn DB Data Block EM Encoded Message EME Encoding Method for Encryption I2OSP Integer To Octet String Primitive MGF Mask Generation Function OAEP Optimal Asymmetric Encryption Padding PKCS Public-Key Cryptography Standard PS Padding String RFC Request for Comments RSAES RSA Encryption Scheme DANH MỤC HÌNH VẼ Hình 2.1 Giải chuyển đổi rõ theo PKCS #1 v1.5 Hình 3.1 Chuyển đổi rõ theo lược đồ OAEP Hình 3.2 Giải chuyển đổi rõ theo lược đồ OAEP Hình 3.3 Biểu diễn OAEP khơng Hình 3.4 Chuyển đổi rõ theo lược đồ OAEP PKCS #1 v2.0 Hình 3.5 Giải chuyển đổi rõ theo lược đồ OAEP PKCS #1 v2.0 Hình 4.1 Kết chuyển đổi chuỗi rỗng trước băm SHA1 Hình 4.2 Giao diện chương trình chuyển đổi rõ Hình 4.3 Giao diện chương trình giải chuyển đổi rõ Hình 4.4 Thơng báo lỗi chuỗi M chứa kí tự khơng hợp lệ Hình 4.5 Thơng báo lỗi chuỗi M q dài 10 CHƯƠNG XÂY DỰNG CHƯƠNG TRÌNH MINH HỌA HOẠT ĐỘNG CỦA LƯỢC ĐỒ CHUYỂN ĐỔI BẢN RÕ 4.1 Yêu cầu chương trình Trên ta xem xét hai lược đồ chuyển đổi rõ áp dụng chuẩn mật mã RSA lược đồ PKCS #1 v1.5 lược đồ OAEP Trong số hai lược đồ việc chuyển đổi theo lược đồ PKCS #1 v1.5 thực cách dễ dàng, việc minh họa hoạt động phần mềm không thực cần thiết Như thế, nhiệm vụ đặt xây dựng chương trình minh họa hoạt động lược đồ OAEP, bao gồm việc chuyển đổi giải chuyển đổi rõ Trong đó, việc chuyển đổi giải chuyển đổi phải thể cách trực quan, rõ ràng chi tiết cho bước Hình Như trình bày mục 3.3., lược đồ OAEP phiên 2.1 2.2 chuẩn mật mã RSA điều chỉnh so với phiên 2.0 Việc minh họa lược đồ OAEP thực theo phiên nhất, tức phiên 2.2 4.2 Lựa chọn cơng cụ lập trình Như mơ tả 3.1 3.2., để thực chuyển đổi rõ theo lược đồ OAEP cần phải sử dụng hàm sinh số chuỗi ngẫu nhiên (khác với hàm sinh số ngẫu nhiên), hàm băm hàm sinh mặt nạ Trong phạm vi đồ án này, ta không xem xét hoạt động cụ thể hàm nêu trên, mà muốn tìm hiểu lược đồ chuyển đổi rõ Vì vậy, cần chọn cơng cụ lập trình có hỗ trợ hàm nêu Một công cụ vừa đơn giản, vừa mạnh mẽ đáp ứng yêu cầu Visual C# NET Visual Studio 2008 hãng Microsoft Hiểu cách đơn giản, NET thư viện lập trình khổng lồ xây dựng hồn tồn hướng đối tượng Thư viện chia thành namespace Mỗi namespace chứa lớp cấu trúc liệu khác thuộc lĩnh vực định Một namespace lại gồm namespace Ví dụ, lớp kiểu liệu liên quan đến mật mã đặt namespace System.Security.Cryptography Trong namespace có số lớp cài đặt thuật tốn băm SHA1 SHA1Cng, SHA1CryptoServiceProvider, SHA1Managed; có lớp để sinh chuỗi ngẫu nhiên RNGCryptoServiceProvider; có lớp cài đặt hàm sinh mặt 30 nạ MGF1 quy định PKCS #1 v2.0 2.1 Pkcs1MaskGenerationMethod Trong phần tiếp theo, ta sử dụng lớp ngôn ngữ lập trình C# để minh họa hoạt động lược đồ chuyển đổi rõ OAEP 4.3 Tính giá trị băm P Theo quy định PKCS #1 v2.0 2.1 tham số P chuỗi rỗng Thế khơng có lớp thư viện NET cho phép tính hàm băm chuỗi rỗng (có độ dài 0) Để giải vấn đề này, ta cần xem lại hoạt động hàm băm SHA1, cụ thể việc chuyển đổi liệu nguồn (padding) trước băm Ta biết liệu trước băm phải chuyển đổi để đạt kích thước định Thao tác chuyển đổi quy định [22] cho SHA1 sau Thêm bít "1" vào cuối khối liệu ban đầu Bổ sung bít để đạt đến kích thước bít Biểu diễn kích thước khối liệu ban đầu dạng số nguyên 64 bít nối khối 64 bít vào cuối khối thu bước trước Theo quy tắc này, chuỗi rỗng sau chuyển đổi đưa dạng chuỗi 512 bít có cấu trúc Hình 10000…0000000000000000000000000000000000000000…000 447 64 Hình 4.7 Kết chuyển đổi chuỗi rỗng trước băm SHA1 Tuy nhiên, ta coi chuỗi Hình đầu vào hàm băm chuỗi lại biến đổi (thành chuỗi 1024 bít) trước băm Như vậy, ta khơng có hi vọng tìm giá trị băm tham số P (chuỗi rỗng) cách sử dụng lớp cài đặt SHA1 NET Để xác định giá trị băm P cách cài đặt chương trình thực chuẩn SHS Khi đó, giá trị băm tìm [23]: pHash = da39a3ee5e6b4b0d3255bfef95601890afd80709 (4.1) 4.4 Giới thiệu chương trình Chương trình viết ngơn ngữ C# môi trường phát triển Visual Studio 2008 sử dụng NET Framework 2.0, vậy, để thực thi chương trình địi hỏi máy người dùng phải cài đặt sẵn NET Framework 2.0 Nếu điều kiện chưa đáp ứng người dùng tải NET Framework 2.0 từ địa chỉ: 31 http://www.microsoft.com/en-us/download/details.aspx?id=1639 Khi thực thi, chương trình có giao diện Hình Hình 9, đó, việc chuyển đổi rõ trình bày Hình 8, việc giải chuyển đổi rõ trình bày Hình Hình 4.8 Giao diện chương trình chuyển đổi rõ Hình 4.9 Giao diện chương trình giải chuyển đổi rõ Như thấy, nút lệnh chương trình có đánh số thứ tự Điều giúp người dùng biết trình tự cần phải thực thao tác với chương trình Trên giao diện chương trình, có trắng mà người dùng nhập liệu vào tay, cịn với có xám việc nhập liệu tay khơng phép, liệu phải tính tốn theo quy tắc lược đồ OAEP Giá trị chuỗi kí tự hệ số 16 32 Để hiểu rõ hoạt động chương trình, xét trường hợp chuyển đổi rõ (Hình 8) Ở có hai mà người dùng nhập liệu tay ô "M" chứa rõ M ô "Seed" chứa chuỗi ngẫu nhiên Seed Chuỗi ngẫu nhiên Seed sinh tự động qua nút "Sinh Seed" sau chỉnh sửa tay Kích thước khóa lấy cố định 64 octet, tức 512 bít Giá trị băm chuỗi rỗng P, trình bày mục 4.3 "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709" Để sử dụng chương trình, người dùng cần nhập vào M Seed sau thực qua bước – Hình Khi nhấn vào nút "1 Tính khối liệu DB", trước hết, chương trình kiểm tra tính hợp lệ chuỗi M Nếu chuỗi có chứa kí tự khơng thuộc hệ số 16, hay có có kích thước khơng chương trình báo lỗi Ví dụ, nhập vào M = "123XAB" có thơng báo lỗi Hình 4.10 Thơng báo lỗi chuỗi M chứa kí tự khơng hợp lệ Cịn M = "00112233445566778899AABBCCDDEEFF00112233445566" chương trình báo lỗi M có kích thước q lớn (Hình 11) Hình 4.11 Thơng báo lỗi chuỗi M q dài Ta biết kích thước tối đa M thức 1) Trong đó, (xem cơng kích thước khóa 64 octet; 33 kích thước đầu hàm băm 20 octet (vì hàm bằm SHA1) Tức kích thước tối đa chuỗi M : 64 – 2*20 – = 22 octet Nếu chuỗi M vượt qua phép kiểm tra chương trình áp dụng bước 3, 4, Bảng để xác định chuỗi DB Khi người dùng nhấn nút "2 Sinh mặt nạ DB" việc kiểm tra chuỗi Seed thực tương tự việc kiểm tra chuỗi M Việc sinh chuỗi ngẫu nhiên Seed thực nhờ vào việc sử dụng lớp RNGCryptoServiceProvider NET Framework sau: Byte[] pbSeed = new Byte[HASH_LEN]; RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); pbSeed = rng.GetBytes(pbSeed, HASH_LEN); Khi chuỗi Seed vượt qua phép kiểm tra chương trình sử dụng hàm MGF1 để sinh mặt nạ Hàm MGF1 cài đặt sẵn NET Framework lớp PKCS1MaskGenerationMethod Việc sinh mặt nạ hiểu sau: Byte[] pbDBMask; PKCS1MaskGenerationMethod mgf = new PKCS1MaskGenerationMethod(); pbDBMask = mgf.GenerateMask(pbSeed, DB_LEN); Khi người dùng nhấn vào nút "3 Tính maskedDB" khối DB cộng bít theo mơ-đun với mặt nạ Bảng 5): để thu (bước pbMaskedDB = new Byte[DB_LEN]; for (int i = 0; i < DB_LEN; i++) pbMaskedDB[i] = (Byte)(pbDB[i] ^ pbDBMask[i]); Khi người dùng nhấn vào nút "4 Sinh mặt nạ Seed" chương trình sử dụng hàm MGF1 để sinh mặt nạ PKCS1MaskGenerationMethod, tương tự việc sinh mặt nạ sử dụng lớp trình bày trên: Byte[] pbSeedMask; PKCS1MaskGenerationMethod mgf = new PKCS1MaskGenerationMethod(); pbSeedMask = mgf.GenerateMask(pbMaskedDB, HASH_LEN); Khi người dùng nhấn vào nút "5 Tính maskedSeed" chuỗi ngẫu nhiên Seed cộng bít theo mơ-đun với mặt nạ Bảng 5) để thu : 34 (bước 10 pbMaskedSeed = new Byte[HASH_LEN]; for (int i = 0; i < HASH_LEN; i++) pbMaskedSeed[i] = (Byte)(pbSeed[i] ^ pbSeedMask[i]); Và cuối cùng, người dùng nhấn vào nút "6 Hồn tất việc chuyển đổi" chương trình thực theo bước 11 Bảng để tạo khối liệu EM, kết cuối việc chuyển đổi rõ Trên Hình kết chuyển đổi cho rõ M = 0123 chuỗi ngẫu nhiên Seed = 8F1B59C81402F7A0F54A9F9C3B31DB60EA808365 Phần mã chương trình trình bày phần Phụ lục 4.5 Kết luận chương Chương trình minh họa hoạt động lược đồ chuyển đổi rõ OAEP xây dựng thành công, đáp ứng yêu cầu đặt mô tả chi tiết bước lược đồ Chương trình mặt cho thấy tác giả nắm vững hoạt động lược đồ, mặt khác giúp cho người chuẩn bị làm quen với lược đồ nắm bắt hoạt động nhanh chóng 35 KẾT LUẬN Bốn chương đồ án thể mục tiêu đặt thực đồ án đạt Cụ thể: Chương hệ thống lại kiến thức tổng quan hệ mật RSA Chương để đảm bảo an tồn khơng thể áp dụng trực tiếp lược đồ RSA vào thực tế, mà cần phải sử dụng thao tác chuyển đổi rõ trước mã hóa (và trước kí) Chương chương xem xét hai lược đồ chuyển đổi rõ quy định phiên khác chuẩn mật mã RSA (PKCS #1) Đó lược đồ chuyển đổi rõ PKCS #1 v1.5 áp dụng cho hệ mật RSA từ phiên 1.5 tiếp tục sử dụng phiên hơn; lược đồ chuyển đổi rõ OAEP áp dụng từ phiên 2.0 tiếp tục sử dụng phiên Qua phiên khác nhau, lược đồ điều chỉnh để chống lại công công bố Tuy nhiên, quy luật phát triển khoa học nói chung khoa học mật mã nói riêng, người ta lại tìm cơng khác để vượt qua điều chỉnh Trong chương 4, chương trình minh họa hoạt động lược đồ chuyển đổi rõ OAEP xây dựng thành công Sở dĩ lược đồ OAEP chọn việc chuyển đổi rõ theo lược đồ PKCS #1 v1.5 thực cách dễ dàng, việc minh họa chương trình khơng thực cần thiết Chương trình trình bày chương mặt cho thấy tác giả nắm vững hoạt động lược đồ OAEP, mặt khác có ý nghĩa ứng dụng giúp cho người làm quen với lược đồ nắm bắt hoạt động nhanh chóng Dù vậy, cịn số vấn đề liên quan đến chuyển đổi rõ chưa giải đồ án Trước hết, đồ án đề cập đến việc ứng dụng lược đồ chuyển đổi rõ mà chưa làm rõ chất lý thuyết lược đồ Việc áp dụng lược đồ chuyển đổi rõ xem xét cho trường hợp mã hóa mà chưa xem xét cho trường hợp kí số Và đồ án chưa làm rõ hiểu lý điều chỉnh lược đồ chuyển đổi rõ qua phiên khác chuẩn mật mã RSA Việc giải điểm tồn hướng phát triển tương lai đồ án 36 TÀI LIỆU THAM KHẢO [1] RSA Laboratories, PKCS #1 v2.2: RSA Cryptography Standard, October 27, 2012 [2] RSA Laboratories, PKCS #1 v2.1: RSA Cryptography Standard, June 14, 2002 [3] RSA Laboratories, PKCS #1 v2.0: RSA Cryptography Standard, October 1, 1998 [4] RSA Laboratories, RFC 2313, PKCS #1: RSA EncryptionVersion 1.5, March 1998 [5] M Bellare, P Rogaway Optimal Asymmetric Encryption Padding - How to Encrypt with RSA In Advances in Cryptology | EUROCRYPT '94, pages 92111, Springer-V erlag, 1994 [6] Shoup Victor OAEP reconsidered Advances in Cryptology – CRYPTO 2001, pp 239-259 Springer Berlin Heidelberg, 2001 [7] RSA Laboratories, RSA-OAEP Encryption Scheme, 2000 [8] What changed in PKCS#1 v2.2, and why, http://crypto.stackexchange.com/ questions/6626/what-changed-in-pkcs1-v2-2-and-why [9] Varun Shukla, Abhishek Choubey A comparative analysis of the possible attacks on RSA cryptosystem, International Journal of Electronic and Communication Engineering and Technology (IJECET), ISSN 0976 – 6472, Volume 3, Issue 1, January- June (2012), pp 92-97 [10] Y Desmedt and A.M Odlyzko A chosen text attack on the RSA cryptosystem and some discrete logarithm schemes In H.C Williams, editor, Advances in Cryptology – CRYPTO ’85 Proceedings, volume 218 of Lecture Notes in Computer Science, pages 516-521 Springer-Verlag, New York, 1986 [11] Bleichenbacher Daniel Chosen ciphertext attacks against protocols based on the RSA encryption standard PKCS# Advances in Cryptology – CRYPTO'98 Springer Berlin Heidelberg, 1998 [12] Manger James A chosen ciphertext attack on RSA optimal asymmetric encryption padding (OAEP) as standardized in PKCS# v2 Advances in Cryptology – CRYPTO 2001 Springer Berlin Heidelberg, 2001 [13] Johan Hastad Solving simultaneous modular equations SIAM Journal on Computing, 17(2):336-341, April 1988 37 [14] Microsoft Corporation Microsoft Development Network (MSND) for Visual Studio 2008 [15] James Manger A Chosen Ciphertext Attack on RSA Optimal Asymmetric Encryption Padding (OAEP) as Standardized in PKCS #1 v2.0, http://archiv.infsec.ethz.ch/education/fs08/secsem/Manger01.pdf [16] Mask Generation Funcion, http://software.intel.com/sites/products/ documentation/doclib/ipp_sa/71/ippcp/ippcp_ch3/ch3_mask_generation_func tions.htm [17] RSAES-OAEP Dictionary, http://www.rsa.com/rsalabs/node.asp?id=2148 [18] Optimal asymmetric encryption padding, http://en.wikipedia.org/wiki/Optimal_asymmetric_encryption_padding [19] RSA (mã hóa), http://vi.wikipedia.org/wiki/RSA_%28m%C3%A3_h %C3%B3a%29 [20] PKCS ♯1, http://en.wikipedia.org/wiki/PKCS_%E2%99%AF1 [21] Plaintext-aware encryption, http://en.wikipedia.org/wiki/Plaintextaware_encryption [22] FIPS, Secure Hash Standard, March 2012, http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf [23] SHA1 Digest of an Empty String, http://craiccomputing.blogspot.com/2009/09/sha1-digest-of-empty-string.html 38 PHỤ LỤC Mã chương trình minh họa hoạt động lược đồ chuyển đổi rõ using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Text; System.Windows.Forms; System.Security.Cryptography; namespace RSA_Padding { public partial class Form1 : Form { //Khai báo thuộc tính lớp sử dụng biến toàn cục String stHashP = "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709"; Byte[] pbDB; Byte[] pbHashP; Byte[] pbSeed; Byte[] pbDBMask; Byte[] pbMaskedDB; Byte[] pbSeedMask; Byte[] pbMaskedSeed; Byte[] pbEM; const Int32 HASH_LEN = 20; const Int32 KEY_LEN = 64; //64 octet = 512 bits const Int32 DB_LEN = KEY_LEN - HASH_LEN - 1; /////////////////////////////////////////////////////////// public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { txtKeyLen.Text = KEY_LEN.ToString(); txtKeyLen0.Text = KEY_LEN.ToString(); pbHashP = HexString.ToByteArray(stHashP); txtHashP.Text = stHashP; txtHashP0.Text = stHashP; } private void btnGenSeed_Click(object sender, EventArgs e) { RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); pbSeed = new Byte[HASH_LEN]; rng.GetBytes(pbSeed); txtSeed.Text = HexString.FromByteArray(pbSeed); } private void txtCalcDB_Click(object sender, EventArgs e) { //Kiểm tra tính hợp lệ M if (txtM.Text.Length % == 1) txtM.Text = "0" + txtM.Text; //Mỗi byte phải kí tự hexa txtM.Text = txtM.Text.ToUpper(); if (txtM.Text.Length == 0){ MessageBox.Show("M khơng thể chuỗi rỗng!", "Có lỗi"); return; } if (!HexString.IsValidHexString(txtM.Text)) 39 { MessageBox.Show("M chứa kí tự khơng hợp lệ!", "Có lỗi"); return; } if (txtM.Text.Length/2 > KEY_LEN - * HASH_LEN - 2) { String msg = "M dài!"; msg = msg + "\nKích thước M là: " + txtM.Text.Length / + " octet"; msg = msg + "\nKích thước tối đa M là: " + (KEY_LEN - * HASH_LEN - 2).ToString() + " octet"; MessageBox.Show(msg, "Có lỗi"); return; } //Xác định PS Int32 dPSLen = KEY_LEN - * HASH_LEN - txtM.Text.Length / - 2; } //Xác định DB String stDB; stDB = stHashP; for (int i = 0; i < dPSLen; i++) stDB += "00"; stDB = stDB + "01" + txtM.Text; txtDB.Text = stDB; pbDB = HexString.ToByteArray(stDB); private void btnGenDBMask_Click(object sender, EventArgs e) { //Kiểm tra tính hợp lệ Seed if (txtSeed.Text.Length % == 1) txtSeed.Text = "0" + txtSeed.Text; //Mỗi byte phải kí tự hexa txtSeed.Text = txtSeed.Text.ToUpper(); if (!HexString.IsValidHexString(txtSeed.Text)) { MessageBox.Show("Seed chứa kí tự khơng hợp lệ!", "Có lỗi"); return; } if (txtSeed.Text.Length != HASH_LEN * 2) { String msg = "Seed khơng hợp lệ"; msg = msg + "\nKích thước Seed là: " + txtSeed.Text.Length / + " octet"; msg = msg + "\nKích thước bắt buộc Seed là: " + HASH_LEN + " octet"; MessageBox.Show(msg, "Có lỗi"); return; } //Sinh mặt nạ PKCS1MaskGenerationMethod mgf = new PKCS1MaskGenerationMethod(); pbDBMask = mgf.GenerateMask(pbSeed, DB_LEN); txtDBMask.Text = HexString.FromByteArray(pbDBMask); } private void txtSeed_TextChanged(object sender, EventArgs e) { txtDBMask.Clear(); txtMaskedDB.Clear(); txtSeedMask.Clear(); txtMaskedSeed.Clear(); txtEM.Clear(); } 40 private void btnCalcMaskedDB_Click(object sender, EventArgs e) { if (txtDB.Text.Length == || txtDBMask.Text.Length == 0) { MessageBox.Show("Phải thực thao tác trước thực thao tác này", "Có lỗi"); return; } pbMaskedDB = new Byte[DB_LEN]; for (int i = 0; i < DB_LEN; i++) pbMaskedDB[i] = (Byte)(pbDB[i] ^ pbDBMask[i]); txtMaskedDB.Text = HexString.FromByteArray(pbMaskedDB); } private void txtM_TextChanged(object sender, EventArgs e) { txtDB.Clear(); txtDBMask.Clear(); txtMaskedDB.Clear(); txtSeedMask.Clear(); txtMaskedSeed.Clear(); txtEM.Clear(); } private void btnGenSeedMask_Click(object sender, EventArgs e) { if (txtMaskedDB.Text.Length == 0) { MessageBox.Show("Phải thực thao tác trước thực thao tác này", "Có lỗi"); return; } PKCS1MaskGenerationMethod mgf = new PKCS1MaskGenerationMethod(); pbSeedMask = mgf.GenerateMask(pbMaskedDB, HASH_LEN); txtSeedMask.Text = HexString.FromByteArray(pbSeedMask); } private void btnCalcMaskedSeed_Click(object sender, EventArgs e) { if (txtSeedMask.Text.Length == 0) { MessageBox.Show("Phải thực thao tác trước thực thao tác này", "Có lỗi"); return; } pbMaskedSeed = new Byte[HASH_LEN]; for (int i = 0; i < HASH_LEN; i++) pbMaskedSeed[i] = (byte)(pbSeed[i] ^ pbSeedMask[i]); txtMaskedSeed.Text = HexString.FromByteArray(pbMaskedSeed); } private void btnCalcEM_Click(object sender, EventArgs e) { if (txtMaskedSeed.Text.Length == 0) { MessageBox.Show("Phải thực thao tác 1-5 trước thực thao tác này", "Có lỗi"); return; } String stEM = "00" + txtMaskedSeed.Text + txtMaskedDB.Text; txtEM.Text = stEM; pbEM = HexString.ToByteArray(stEM); } 41 octet"; private void btnParseEM_Click(object sender, EventArgs e) { String msg = "Khối EM không hợp lệ"; if (txtEM2.Text.Length != KEY_LEN*2) { msg += "\nLý do: Kích thước khác " + KEY_LEN.ToString() + " MessageBox.Show(msg, "Có lỗi"); return; } } if (txtEM2.Text[0] != '0' || txtEM2.Text[1] != '0') { msg += "\nLý do: octet khác 00"; MessageBox.Show(msg, "Có lỗi"); return; } if (!HexString.IsValidHexString(txtM2.Text)) { msg += "\nLý do: Chuỗi M có chứa kí tự khơng hợp lệ"; MessageBox.Show(msg, "Có Lỗi"); return; } txtMaskedSeed2.Text = txtEM2.Text.Substring(2, HASH_LEN * 2); pbMaskedSeed = HexString.ToByteArray(txtMaskedSeed2.Text); txtMaskedDB2.Text = txtEM2.Text.Substring(2 + HASH_LEN * 2); pbMaskedDB = HexString.ToByteArray(txtMaskedDB2.Text); private void btnCalcSeedMask_Click(object sender, EventArgs e) { if (txtMaskedDB2.Text.Length == 0) { MessageBox.Show("Cần thực thao tác trước thực thao tác này!"); return; } PKCS1MaskGenerationMethod mgf = new PKCS1MaskGenerationMethod(); pbSeedMask = mgf.GenerateMask(pbMaskedDB, HASH_LEN); txtSeedMask2.Text = HexString.FromByteArray(pbSeedMask); } private void btnCalcSeed_Click(object sender, EventArgs e) { if (txtSeedMask2.Text.Length == 0) { MessageBox.Show("Cần thực thao tác 1-2 trước thực thao tác này"); return; } pbSeed = new Byte[HASH_LEN]; for (int i = 0; i < HASH_LEN; i++) pbSeed[i] = (byte)(pbMaskedSeed[i] ^ pbSeedMask[i]); txtSeed2.Text = HexString.FromByteArray(pbSeed); } private void btnCalcDBMask_Click(object sender, EventArgs e) { if (txtSeed2.Text.Length == 0) { MessageBox.Show("Cần thực thao tác 1-3 trước thực thao tác này"); return; 42 } } PKCS1MaskGenerationMethod mgf = new PKCS1MaskGenerationMethod(); pbDBMask = mgf.GenerateMask(pbSeed, DB_LEN); txtDBMask2.Text = HexString.FromByteArray(pbDBMask); private void btnCalcDB_Click(object sender, EventArgs e) { if (txtDBMask2.Text.Length == 0) { MessageBox.Show("Cần thực thao tác 1-4 trước thực thao tác này"); return; } pbDB = new Byte[DB_LEN]; for (int i = 0; i < DB_LEN; i++) pbDB[i] = (byte)(pbMaskedDB[i] ^ pbDBMask[i]); txtDB2.Text = HexString.FromByteArray(pbDB); } private void btnParseDB_Click(object sender, EventArgs e) { if (txtDB2.Text.Length == 0) { MessageBox.Show("Cần thực thao tác 1-5 trước thực thao tác này"); return; } //Tách phần 1: pHash txtHashP2.Text = txtDB2.Text.Substring(0, HASH_LEN * 2); String msg = "Giải chuyển đổi không thành công"; if (txtHashP2.Text != txtHashP0.Text) { msg += "\nLý do: Giá trị pHash' không trùng với giá trị pHash"; } } MessageBox.Show(msg, "Có lỗi"); return; //Tách phần 2: PS Int32 index = HASH_LEN * 2; String stOneOctet; bool bFoundOctet01=false; { stOneOctet = txtDB2.Text.Substring(index, 2); if (stOneOctet == "00") index += 2; else if (stOneOctet == "01") bFoundOctet01 = true; else break; } while (bFoundOctet01 == false); if (!bFoundOctet01) { msg += "\nLý do: Khơng tìm thấy octet phân cách 01"; MessageBox.Show(msg, "Có lỗi"); return; } txtM2.Text = txtDB2.Text.Substring(index + 2); private void txtEM2_TextChanged(object sender, EventArgs e) 43 { } txtMaskedSeed2.Clear(); txtMaskedDB2.Clear(); txtSeedMask2.Clear(); txtSeed2.Clear(); txtDBMask2.Clear(); txtDB2.Clear(); txtHashP2.Clear(); txtM2.Clear(); } } static class HexString { public static byte[] ToByteArray(String HexString) { int NumberChars = HexString.Length; byte[] bytes = new byte[NumberChars / 2]; for (int i = 0; i < NumberChars; i += 2) { bytes[i / 2] = Convert.ToByte(HexString.Substring(i, 2), 16); } return bytes; } public static string FromByteArray(byte[] arr) { StringBuilder Result = new StringBuilder(); string HexAlphabet = "0123456789ABCDEF"; foreach (byte B in arr) { Result.Append(HexAlphabet[(int)(B >> 4)]); Result.Append(HexAlphabet[(int)(B & 0xF)]); } return Result.ToString(); } public static bool IsValidHexString(String st) { for (int i = 0; i < st.Length; i++) { if (st[i] >= '0' && st[i] = 'A' && st[i] = 'a' && st[i]

Ngày đăng: 06/06/2023, 05:38