1. Trang chủ
  2. » Công Nghệ Thông Tin

TÌM HIỂU LƯỢC ĐỒ CHUYỂN ĐỔI BẢN RÕ TRONG CHUẨN MẬT MÃ RSA

55 324 0

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

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

THÔNG TIN TÀI LIỆU

Nội dung

BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT Mà ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ BÁO CÁO THỰC TẬP 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: Công nghệ thông tin Chuyên ngành: An toàn thông tin Mã số: 52.48.02.01 Hà Nội, 2017 BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT Mà ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ BÁO CÁO THỰC TẬP 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: Công nghệ thông tin Chuyên ngành: An toàn thông tin Mã số: 52.48.02.01 Sinh viên thực hiện: Trần Văn Tam Lớp: AT8B Giảng viên phụ trách: TS Nguyễn Võ Nhất Khoa An toàn thông tin – Học viện Kỹ thuật mật mã Hà Nội, 2017 MỤC LỤC Một số lời khuyên trình bày báo cáo iii Về hình thức trình bày báo cáo iii Về đề mục iv Về hình vẽ bảng biểu iv Về phụ lục iv Về mã chương trình (code) iv Về lời nói đầu v Về phần kết luận v Về trang bìa v Danh mục kí hiệu viết tắt vi Danh mục hình vẽ vii Danh mục bảng viii Lời nói đầu ix Chương Giới thiệu chung hệ mật RSA 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 1.2.2 Tạo khóa 1.2.3 Mã hóa 1.2.4 Giải mã 1.2.5 Ví dụ 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 Quá trình tạo khóa 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.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 11 2.2 Hỗ trợ lược đồ chuyển đổi rõ PKCS #1 v1.5 phiên chuẩn mật mã RSA 12 2.3 Kết luận chương 13 Chương Lược đồ chuyển đổi rõ OAEP 14 3.1 Mô tả chung lược đồ chuyển đổi rõ OAEP 14 3.1.1 Chuyển đổi rõ theo lược đồ OAEP 14 3.1.2 Giải chuyển đổi rõ theo lược đồ OAEP 16 3.1.3 Sai lầm cách hiểu OAEP 17 i 3.2 Áp dụng lược đồ OAEP vào hệ mật RSA 17 3.2.1 Chuyển đổi rõ theo lược đồ OAEP 17 3.2.2 Giải chuyển đổi rõ theo OAEP 21 3.2.3 Hàm băm Hash 23 3.2.4 Hàm sinh mặt nạ MGF 24 3.2.5 Tham số P 26 3.3 Sự điều chỉnh lược đồ OAEP qua phiên khác chuẩn mật mã RSA 26 3.4 Kết luận chương 29 Chương Xây dựng chương trình minh họa hoạt động lược đồ chuyển đổi rõ 30 4.1 Yêu cầu chương trình 30 4.2 Lựa chọn công cụ lập trình 30 4.3 Tính giá trị băm P 31 4.4 Giới thiệu chương trình 31 4.5 Kết luận chương 35 Kết luận 36 Tài liệu tham khảo 37 Phụ lục 39 ii MỘT SỐ LỜI KHUYÊN VỀ TRÌNH BÀY BÁO CÁO Nếu muốn báo cáo đánh giá cao, sinh viên cần lưu ý số vấn đề sau (Phần viết cho Báo cáo Đồ án tốt nghiệp áp dụng cho báo cáo thực tập tốt nghiệp) Về hình thức trình bày báo cáo  Mẹo: Muốn trình bày mục lục đẹp (như mẫu này) lưu văn định dạng DOC thay định dạng DOCX  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]" iii Về đề mục Sau đề mụ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 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) iv Về lời nói đầu Mục "Lời nói đầu" 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" 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), 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ố v 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 t  Số nguyên nhỏ không nhỏ t t  Số nguyên lớn không lớn t 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 vi DANH MỤC HÌNH VẼ Hình 2.1 Giải chuyển đổi rõ theo PKCS #1 v1.5 11 Hình 3.1 Chuyển đổi rõ theo lược đồ OAEP 14 Hình 3.2 Giải chuyển đổi rõ theo lược đồ OAEP 16 Hình 3.3 Biểu diễn OAEP không 17 Hình 3.4 Chuyển đổi rõ theo lược đồ OAEP PKCS #1 v2.0 19 Hình 3.5 Giải chuyển đổi rõ theo lược đồ OAEP PKCS #1 v2.0 22 Hình 4.1 Kết chuyển đổi chuỗi rỗng trước băm SHA1 31 Hình 4.2 Giao diện chương trình chuyển đổi rõ 32 Hình 4.3 Giao diện chương trình giải chuyển đổi rõ 32 Hình 4.4 Thông báo lỗi chuỗi M chứa kí tự không hợp lệ 33 Hình 4.5 Thông báo lỗi chuỗi M dài 33 vii DANH MỤC BẢNG Bảng 3.1 Chuyển đổi rõ theo lược đồ OAEP PKCS #1 v2.0 19 Bảng 3.2 Giải chuyển đổi rõ theo lược đồ OAEP PKCS #1 v2.0 22 Bảng 3.3 Hàm sinh mặt nạ MGF1 25 Bảng 3.4 Hàm chuyển đổi số nguyên thành chuỗi octet I2OSP 26 Bảng 3.5 Chuyển đổi rõ theo lược đồ OAEP PKCS #1 v2.1 28 viii 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 3.4 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 hoàn toà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 toá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ế 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 512k  448 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 4.1 10000…0000000000000000000000000000000000000000…000 447 64 Hình 4.1 Kết chuyển đổi chuỗi rỗng trước băm SHA1 Tuy nhiên, ta coi chuỗi Hình 4.1 đầ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 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 4.2 Hình 4.3, đó, việc chuyển đổi rõ trình bày Hình 4.2, việc giải chuyển đổi rõ trình bày Hình 4.3 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õ 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, với ô có xám việc nhập liệu tay không phép, liệu ô phải tính toá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 4.2) Ở 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 4.2 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.4 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 lớn (Hình 4.5) Hình 4.5 Thông báo lỗi chuỗi M dài Ta biết kích thước tối đa M emLen   hLen  (xem công thức 3.11) Trong đó, emLen kích thước khóa 64 octet; hLen kích 33 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 3.5 để 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ạ dbMask 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ạ dbMask để thu maskedDB (bước Bảng 3.5): 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ạ seedMask sử dụng lớp PKCS1MaskGenerationMethod, tương tự việc sinh mặt nạ dbMask 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ạ seedMask (bước 10 Bảng 3.5) để thu maskedSeed : 34 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 Hoàn tất việc chuyển đổi" chương trình thực theo bước 11 Bảng 3.5 để tạo khối liệu EM, kết cuối việc chuyển đổi rõ Trên Hình 4.2 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 toàn á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, 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 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(); } private void btnCalcMaskedDB_Click(object sender, EventArgs e) 40 { 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); } private void btnParseEM_Click(object sender, EventArgs e) 41 { 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() + " octet"; 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; } PKCS1MaskGenerationMethod mgf = new PKCS1MaskGenerationMethod(); 42 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) { txtMaskedSeed2.Clear(); 43 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: 02/08/2017, 23:39

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w