Giáo trình cơ sở mật mã học

237 21 0
Giáo trình cơ sở mật mã học

Đ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

Häc viƯn c«ng nghƯ b­u chÝnh viƠn th«ng GIÁO TRÌNH PT IT C¥ së mËt m· häc Chủ biên: GS.TS Nguyễn Bình Cộng tác viên: TS Ngơ Đức Thiện Khoa KTĐT1 - Học viện CNBCVT Hà Nội - 2013 MỤC LỤC LỜI NÓI ĐẦU i MỤC LỤC iii CHƯƠNG NHẬP MÔN MẬT Mà HỌC 1.1 SƠ ĐỒ KHỐI ĐƠN GIẢN CỦA MỘT HỆ THỐNG THÔNG TIN SỐ 1.2 SƠ LƯỢC VỀ MẬT Mà HỌC 1.3 THUẬT TOÁN VÀ ĐỘ PHỨC TẠP 1.3.1 Khái niệm thuật toán 1.3.2 Độ phức tạp thuật toán 1.4 LÝ THUYẾT THÔNG TIN TRONG CÁC HỆ MẬT 1.4.1 Độ mật hoàn thiện 1.4.2 Entropy 13 IT BÀI TẬP CHƯƠNG 22 CHƯƠNG MẬT Mà KHĨA BÍ MẬT 24 2.1 SƠ ĐỒ KHỐI MỘT HỆ TRUYỀN TIN MẬT 24 2.2 MẬT Mà THAY THẾ 25 PT 2.2.1 Mật mã dịch vòng (MDV) 25 2.2.2 Mã thay (MTT) 26 2.2.3 Mật mã Vigenère 26 2.3 MẬT Mà HOÁN VỊ (MHV) 31 2.4 MẬT Mà HILL 32 2.5 HỆ MẬT XÂY DỰNG TRÊN CÁC CẤP SỐ NHÂN XYCLIC CỦA VÀNH ĐA THỨC 36 2.5.1 Nhóm nhân vành 36 2.5.2 Các phần tử cấp n nhóm nhân xyclic cấp n 37 2.5.3 Hệ mật xây dựng cấp số nhân xyclic 38 2.6 CÁC HỆ MẬT Mà TÍCH 44 2.7 CÁC HỆ Mà DÒNG 46 2.7.1 Sơ đồ chức hệ mật mã dòng 46 2.7.2 Tạo dãy giả ngẫu nhiên (M-dãy) 48 2.8 CHUẨN Mà DỮ LIỆU 53 2.8.1 Mở đầu 53 iii Chương 1: Nhập môn mật mà học CHNG NHẬP MÔN MẬT Mà HỌC 1.1 SƠ ĐỒ KHỐI ĐƠN GIẢN CỦA MỘT HỆ THỐNG THÔNG TIN SỐ Đầu vào rõ Biến đổi A/D (Tương tự - số) Bản rõ Mã nguồn Bản mã Mã bảo mật Mã kênh Nguồn tin tương tự Từ mã truyền IT Kênh truyền (Tạp âm, đa đường, giao thoa, nhiễu, nghe trộm…) Đầu số Biến đổi D/A (Số - tương tự) Giải mã nguồn PT Nhận tin Bản rõ Bản mã Giải mã bảo mật Từ mã nhận Giải mã kênh Hình 1.1 Sơ đồ hệ thống thơng tin số Trường hợp nguồn tin đầu vào nguồn tin số không cần biến đổi A/D đầu vào biến đổi D/A đầu Trong hệ thống khối mã bảo mật có chức bảo vệ cho thông tin không bị khai thác bất hợp pháp, chống lại công sau: - Thám mã thụ động: bao gồm hoạt động: + Thu chặn + Dị tìm + So sánh tương quan + Suy diễn - Thám mã tích cực: bao gồm hoạt động: + Giả mạo + Ngụy trang + Sử dụng lại + Sa i Chương 1: Nhập môn mật mà häc 1.2 SƠ LƯỢC VỀ MẬT Mà HỌC Khoa học mật mã (cryptology) bao gồm: - Mật mã học (cryptography) - Phân tích mật mã (cryptanalysis) Mật mã học khoa học nghiên cứu cách ghi bí mật thơng tin nhằm biến tin rõ thành mã Phân tích mã khoa học nghiên cứu cách phá hệ mật nhằm phục hồi rõ ban đầu từ mã Việc tìm hiểu thơng tin khóa phương pháp biến đổi thơng tin nhiệm vụ quan trọng phân tích mật mã Có ba phương pháp cơng thám mã:  Tìm khóa vét cạn  Phân tích thống kê  Phân tích tốn học IT Việc cơng thám mã thực với giả định:  Tấn công với mã  Tấn công với rõ biết  Tấn công với rõ chọn  Tấn công với mã chọn PT Chú ý:  Một hệ mật bị phá với mã thường hệ mật có độ an tồn thấp  Một hệ mật an toàn với kiểu cơng có rõ chọn thường hệ mật có độ an tồn cao Có loại hệ mật mã sau:  Hệ mật mã dòng  Hệ mật mã khối đối xứng  Hệ mật mã có hồi tiếp mật mã  Hệ mật mã khóa công khai (Bất đối xứng) Ta nghiên cứu loại hệ mật chương sau Khi xây dựng hệ mật người ta thường xem xét tới tiêu chuẩn sau:  Độ mật cần thiết  Kích thước khơng gian khóa  Tính đơn giản tốc dộ mã hóa giải mã  Tính lan truyền sai  Tính mở rộng tin Ch­¬ng 1: NhËp m«n mËt m· häc 1.3 THUẬT TỐN VÀ ĐỘ PHỨC TẠP 1.3.1 Khái niệm thuật toán 1.3.1.1 Định nghĩa thuật tốn Có thể định nghĩa thuật tốn theo nhiều cách khác Ở ta khơng có ý định trình bày chặt chẽ thuật tốn mà hiểu khái niệm thuật tốn theo cách thơng thường Định nghĩa 1.1: Thuật toán quy tắc để với liệu ban đầu cho, tìm lời giải tốn xét sau khoảng thời gian hữu hạn Để minh họa cách ghi thuật tốn tìm hiểu u cầu đề cho thuật toán, ta xét ví dụ cụ thể sau đây: Cho n số X 1 , X  2 , , X n  ta cần tìm m j cho: m  X  j   max X k  IT 1k n Và j lớn Điều có nghĩa cần tìm cực đại số cho số lớn số cực đại Với mục tiêu tìm số cực đại với số lớn nhất, ta xuất phát từ giá trị X [n ] Bước thứ nhất, có số ta tạm thời xem m  X [n ] j  n Tiếp theo ta so sánh PT X [n ] với X [n  1] Nếu X [n ] không nhỏ X [n  1] ta giữ nguyên, trường hợp ngược lại, X [n  1] số cực đại hai số xét ta phải thay đổi m j Đặt m  X [n  1] , j  1, , n  Với cách làm trên, bước ta nhận số cực đại số số xét Bước so sánh với số đứng trước kết thúc thuật tốn trường hợp khơng cịn số đứng trước 1.3.1.2 Thuật tốn tìm cực đại M1: [Bước xuất phát] đặt j  n , k  n  1, m  X [n ] M2: [Đã kiểm tra xong?] Nếu k  , thuật toán kết thúc M3: [So sánh] Nếu X [k ]  m , chuyển sang M5 M4: [Thay đổi m ] Đặt j  k , m  X [k ] (Tạm thời m cực đại) M5: [Giảm k ] Đặt k  k  quay M2 Dấu "  " dùng để phép toán quan trọng phép thay chỗ (replacement) Trên ta ghi thuật tốn ngơn ngữ thơng thường Trong trường hợp thuật tốn viết ngơn ngữ máy tính, ta cú mt chng trỡnh Chương 1: Nhập môn mËt m· häc Trong thuật tốn có số liệu ban đầu cho trước thuật toán bắt đầu làm việc gọi đầu vào (input) Trong thuật toán đầu vào số X [1], X [2], , X [n ] Một thuật toán có nhiều đầu (output) Trong thuật toán đầu m j Có thể thấy thuật tốn vừa mơ tả thỏa mãn u cầu thuật tốn nói chung, là: - Tính hữu hạn: Thuật tốn cần phải kết thúc sau số hữu hạn bước Khi thuật toán ngừng làm việc ta phải thu câu trả lời cho vấn đề đặt Thuật toán m rõ ràng thỏa mãn điều kiện này, bước ta từ việc xem xét số sang số đứng trước số số hữu hạn - Tính xác định: Ở bước thuật toán cần phải xác định, nghĩa rõ việc cần làm Nếu người đọc thuật toán chưa thỏa mãn điều kiện lỗi người viết IT Ngoài yếu tố kể trên, ta cịn phải xét đến tính hiệu thuật tốn Có nhiều thuật tốn mặt lý thuyết hữu hạn bước, nhiên thời gian “hữu hạn” vượt khả làm việc Những thuật tốn khơng xét đến đây, quan tâm thuật tốn sử dụng thực máy tính PT Cũng mục tiêu trên, ta phải ý đến độ phức tạp thuật toán Độ phức tạp thuật tốn đo không gian tức dung lượng nhớ máy tính cần thiết để thực thuật tốn thời gian, tức thời gian máy tính làm việc Ở nói đến độ phức tạp thuật tốn ta ln hiểu độ phức tạp thời gian 1.3.2 Độ phức tạp thuật toán Thời gian làm việc máy tính chạy thuật tốn khơng phụ thuộc vào thuật tốn mà cịn phụ thuộc vào máy tính sử dụng Vì thế, để có tiêu chuẩn chung, ta đo độ phức tạp thuật toán số phép tính phải làm thực thuật tốn Khi tiến hành thuật toán, số phép tính phải thực cịn phụ thuộc vào cỡ tốn, tức độ lớn đầu vào Vì độ phức tạp thuật toán hàm số độ lớn đầu vào Trong ứng dụng thực tiễn, khơng cần biết xác hàm mà cần biết “cỡ” chúng, tức cần có ước lượng đủ tốt chúng Trong làm việc, máy tính thường ghi chữ số bóng đèn “sáng, tắt”, bóng đèn sáng số 1, bóng đèn tắt số Vì để thuận tiện dùng hệ đếm số 2, để biểu diễn số, ta cần dùng hai ký hiệu Một ký hiệu gọi 1bit “viết tắt binary digit” Một số nguyên n biểu diễn k chữ số gọi số k  bit Độ phức tạp thuật tốn đo số phép tính bit Phép tính bit phép tính logic hay số học thực số bit Để ước lượng độ phức tạp thuật toán ta dùng khái niệm bậc O lớn Ch­¬ng 1: NhËp m«n mËt m· häc Định nghĩa 1.2: Giả sử f n  g n  hai hàm xác định tập hợp số nguyên dương Ta nói f n  có bậc O-lớn g n  viết f n   O  g n  , tồn số C  cho với n đủ lớn Các hàm f n  g n  dương f n   C g n  Ví dụ 1.1 : 1) Giả sử f n  đa thức: f n   ad n d  ad 1n d 1   a1n  a ad  Dễ   chứng minh f n   O n d     2) Nếu f n   O g n  , f2 n   O g n  f1  f2  O  g  3) Nếu f1  O  g1  , f2  O  g2  f1 f2  O  g1g2  lim n  f n  g n  f  O  g  IT 4) Nếu tồn giới hạn hữu hạn:   5) Với số   , log n  O n  PT Định nghĩa 1.3: Một thuật tốn gọi có độ phức tạp đa thức có thời gian đa thức, số   phép tính cần thiết để thực thuật tốn khơng vượt q O logd n , n độ lớn đầu vào d số nguyên dương   Nói cách khác đầu vào số k bit thời gian thực thuật tốn O k d , tức tương đương với đa thức k   Các thuật toán với thời gian O n  ,   gọi thuật toán với độ phức tạp mũ thời gian mũ Chú ý thuật toán có độ phức tạp O  g  nói có độ phức tạp O h  với hàm h  g Tuy nhiên ta ln ln cố gắng tìm ước lượng tốt để tránh hiểu sai độ phức tạp thực thuật tốn Cũng có thuật tốn có độ phức tạp trung gian đa thức mũ Ta thường gọi thuật tốn mũ Chẳng hạn thuật toán nhanh biết để phân tích số nguyên n thừa số thuật tốn có độ phức tạp: exp   log n log log n  Ch­¬ng 1: NhËp m«n mËt m· häc Khi giải tốn khơng ta cố gắng tìm thuật tốn đó, mà cịn muốn tìm thuật tốn “tốt nhất” Đánh giá độ phức tạp cách để phân tích, so sánh tìm thuật tốn tối ưu Tuy nhiên độ phức tạp khơng phải tiêu chuẩn để đánh giá thuật tốn Có thuật tốn lý thuyết có độ phức tạp cao thuật toán khác, sử dụng lại có kết (gần đúng) nhanh nhiều Điều cịn tùy thuộc tốn cụ thể, mục tiêu cụ thể kinh nghiệm người sử dụng Chúng ta cần lưu ý thêm số điểm sau Mặc dù định nghĩa thuật toán mà đưa chưa phải chặt chẽ, “cứng nhắc” ứng dụng thực tế Bởi cần đến thuật toán “xác suất”, tức thuật toán phụ thuộc vào hay nhiều tham số ngẫu nhiên Những “thuật tốn” ngun tắc khơng gọi thuật tốn chúng với xác suất bé, không kết thúc Tuy nhiên thực nghiệm rằng, thuật toán xác suất thường hữu hiệu thuật tốn khơng xác suất Thậm chí nhiều trường hợp, có thuật toán sử dụng IT Khi làm việc với thuật toán xác suất, ta thường hay phải sử dụng số “ngẫu nhiên” Khái niệm chọn số ngẫu nhiên cần xác hóa Thường người ta sử dụng “máy” sản xuất số giả ngẫu nhiên Tuy nhiên nói đến việc chọn số ngẫu nhiên ta hiểu thực máy Cần ý rằng, thuật tốn xác suất, khơng thể nói đến thời gian tuyệt đối, mà nói đến thời gian hy vọng (expected) PT Để hình dung phần “độ phức tạp” thuật toán làm việc với số lớn, ta xem Bảng 1.1 cho khoảng thời gian cần thiết để phân tích số nguyên n thừa số nguyên tố thuật toán nhanh biết Bảng 1.1 Độ phức tạp để phân tích số nguyên thừa số nguyên tố Số chữ số thập phân Số phép tính bit Thời gian 50 1, 4.1010 3,9 75 9.1012 104 ngày 100 2,3.1015 74 năm 200 1, 2.1023 3,8.109 năm 300 1,5.1029 4,9.1015 năm 500 1,3.1039 4, 2.1025 năm Từ Bảng 1.1 trên, ta thấy với thuật toán mũ, thời gian làm việc với số nguyên lớn lâu Vì nói chung người ta ln cố gắng tìm nhng thut toỏn a thc Chương 1: Nhập môn mËt m· häc 1.4 LÝ THUYẾT THÔNG TIN TRONG CÁC HỆ MẬT Năm 1949, Claude Shannon công bố báo có nhan đề “Lý thuyết thơng tin hệ mật” tạp chí “The Bell System Technical Journal” Bài báo có ảnh hưởng lớn đến việc nghiên cứu khoa học mật mã Trong chương ta thảo luận vài ý tưởng lý thuyết Shannon 1.4.1 Độ mật hồn thiện Có hai quan điểm độ an toàn hệ mật 1.4.1.1 Độ an tồn tính tốn IT Độ đo liên quan đến nỗ lực tính tốn cần thiết để phá hệ mật Một hệ mật an tồn mặt tính tốn thuật tốn tốt để phá cần N phép tốn, N số lớn Vấn đề chỗ, khơng có hệ mật thực tế biết chứng tỏ an toàn theo định nghĩa Trên thực tế, người ta gọi hệ mật "an tồn mặt tính tốn" có phương pháp tốt phá hệ yêu cầu thời gian lớn đến mức không chấp nhận (Điều tất nhiên khác với việc chứng minh độ an toàn) PT Một quan điểm chứng minh độ an tồn tính tốn quy độ an toàn hệ mật toán nghiên cứu kỹ tốn coi khó Ví dụ, ta chứng minh khẳng định có dạng “Một hệ mật cho an tồn khơng thể phân tích thừa số số nguyên n cho trước" Các hệ mật loại gọi “An toàn chứng minh được" Tuy nhiên cần phải hiểu rằng, quan điểm cung cấp chứng minh độ an tồn có liên quan để tốn khác khơng phải chứng minh hồn chỉnh độ an tồn (Tình hình tương tự việc chứng minh toán NP đầy đủ: Có thể chứng tỏ tốn cho chí khó tốn NP đầy đủ khác, song khơng phải chứng minh hồn chỉnh độ khó tính tốn tốn) 1.4.1.2 Độ an tồn khơng điều kiện Độ đo liên quan đến độ an tồn hệ mật khơng có hạn chế đặt khối lượng tính tốn mà Oscar phép thực Một hệ mật gọi an tồn khơng điều kiện khơng thể bị phá chí với khả tính tốn khơng hạn chế Khi thảo luận độ an toàn hệ mật, ta phải kiểu công xem xét Trong chương ta thấy rằng, không hệ mật hệ mã dịch vòng, mã thay mã Vigenère coi an tồn mặt tính tốn với phương pháp công với mã (Với khối lượng mã thích hợp) Điều mà ta làm phần để phát triển lý thuyết hệ mật có độ an tồn khơng điều kiện với phương pháp công với mã Có thể thấy rằng, ba hệ mật nêu hệ mật an tồn vơ điều kiện phần tử rõ mã hoá khoá cho trước Rõ ràng độ an tồn khơng điều kiện hệ mật khơng thể nghiên cứu theo quan điểm độ phức tạp tính tốn thời gian tính tốn cho phép khơng hn ch õy lý Chương 1: Nhập môn mËt m· häc thuyết xác suất tảng thích hợp để nghiên cứu độ an tồn khơng điều kiện Tuy nhiên ta cần số kiến thức sơ đẳng xác suất; định nghĩa nêu Định nghĩa 1.4: Giả sử X Y biến ngẫu nhiên Kí hiệu xác suất để X nhận giá trị x p(x) để Y nhận giá trị y p y  Xác suất đồng thời p  x , y  xác suất để X nhận giá trị x Y   nhận giá trị y Xác suất có điều kiện p x y xác suất để X nhận giá trị x với điều kiện Y nhận giá trị y Các biến ngẫu nhiên X Y gọi độc lập p  x , y   p  x  p y  với giá trị x X y Y Quan hệ xác suất đồng thời xác suất có điều kiện biểu thị theo công thức: p  x , y   p  x y  p y  (1.1) p  x , y   p y x  p  x  (1.2) IT Đổi chỗ x y ta có: Từ hai biểu thức ta rút kết sau:(được gọi định lý Bayes) Định lý 1.1: (Định lý Bayes) PT Nếu p y   thì: p x y   p  x  p y x  p y  (1.3) Hệ 1.1 x y biến độc lập khi: p  x y   p  x  , x , y Trong phần ta giả sử rằng, khoá cụ thể dùng cho mã Giả sử có phân bố xác suất khơng gian rõ P Kí hiệu xác suất tiên nghiệm để rõ xuất pP (x ) Cũng giả sử rằng, khóa K chọn (bởi Alice Bob) theo phân bố xác suất xác định (Thơng thường khố chọn ngẫu nhiên, tất khoá đồng khả năng, nhiên khơng phải điều bắt buộc) Kí hiệu xác suất để khóa K chọn pK (K ) Cần nhớ khóa chọn trước Alice biết rõ Bởi giả định khoá K rõ x kiện độc lập Hai phân bố xác suất P K tạo phân bố xác suất C Thật vậy, dễ dàng tính xác suất pP (y ) với y mã gửi Với khoá K K , ta xác định: C  K   eK  x  : x P  Ở C (K ) biểu thị tập mã K khóa Khi với y  C , ta có: Chương - Các chuẩn áp dụng KUC : Khóa chữ ký cơng khai khách hàng Nếu hai đại lượng nhà buôn kiểm tra chữ ký DS, P I, OIMD KU C Tương tự, ngân hàng có  Khi ngân hàng tính: H  H  P I  / /OIMD  D KU  DS  C Nếu hai đại lượng ngân hàng kiểm tra chữ ký PI PIMD … …… …… KRC H POMD H  OI E OIMD Chữ ký kép H IT … …… …… Hình 6.3 Cấu trúc chữ ký kép : Thông tin chi trả OI : Thông tin đặt hàng H : Hàm băm  : Phép ghép PIMD : Tóm lược thơng báo PI OIMD : Tóm lược thơng báo OI POMD: Tóm lược thông báo lệnh chi trả PT PI E : Phép mã hóa (RSA) KRC : Khóa chữ ký riêng khách hàng 6.3 ỨNG DỤNG XÁC THỰC - KERBEROS 6.3.1 Mở đầu Kerberos dịch vụ xác thực xây dựng từ dự án Athena MIT Vấn đề mà Kerberos muốn giải là: Trong môi trường phân tán mở, trạm làm việc muốn truy nhập dịch vụ máy chủ phân tán qua mạng Ta muốn máy chủ có khả hạn chế truy nhập người dùng hợp lệ xác thực yêu cầu dịch vụ Trong môi trường trạm làm việc tự xác định người dùng cho dịch vụ mạng Trên thực tế có ba nguy sau:  Người sử dụng sử dụng trạm làm việc giả mạo người dùng khác  Người sử dụng (user) thay đổi địa mạng trạm làm việc để yêu cầu gửi từ trạm xuất thể từ trạm mạo danh  User "nghe trộm" trao đổi sử dụng kiểu công sử dụng lại để truy nhập vào máy chủ phá vỡ hoạt động 215 Chương - Các chuẩn áp dụng Trong trường hợp người dùng bất hợp pháp truy nhập tới dịch vụ liệu mà không phép truy nhập Khác với việc xây dựng thủ tục xác thực máy chủ, Kerberos cung cấp dịch vụ xác thực tập trung có nhiệm vụ xác thực user máy chủ (server) ngược lại Cần ý Kerberos sử dụng mật mã đối xứng mà không dùng mật mã khóa cơng khai Có hai phiên Kerberos Kv.4 Kv.5 Kv.5 đệ trình xem chuẩn khuyến nghị cho Internet Các yêu cầu đặt cho Kerberos:  An toàn : Kẻ thu trộm mạng khơng có khả thu thơng tin cần thiết để mạo danh Hơn nữa, Kerberos phải đủ mạnh để đối phương mạnh khơng thể tìm thấy yếu điểm  Tin cậy: Đối với dịch vụ khống chế truy nhập có sử dụng Kerberos, việc thiếu tính sẵn sàng dịch vụ Kerberos có nghĩa thiếu tính sẵn sàng dịch vụ trợ giúp Bởi Kerberos phải tin cậy phải sử dụng kiến trúc máy chủ phân tán có hệ thống dự phịng IT  Trong suốt: Về mặt lý tưởng người dùng đưa mật vào họ khơng thể biết q trình xác thực xảy PT  Có khả mở rộng: Kerberos phải có khả phục vụ số lượng lớn máy chủ máy trạm Bởi Kerberos phải có kiến trúc phân tán mođun 216 Chương - Các chuẩn áp dụng 6.3.2 Kerberos V.4 (1) User đăng nhập yêu cầu dịch vụ máy chủ  (2) AS kiểm tra quyền truy nhập người dùng CSDL tạo thẻ cấp thẻ khóa phiên Một lần với phiên đăng nhập Kerberos Yêu cầu thẻ cấp thẻ Máy chủ Thẻ khóa phiên xác thực (AS) Yêu cầu thẻ cấp dịch vụ Máy chủ cấp thẻ (TGS) Cơ sở liệu Thẻ khóa phiên Kết khóa sử dụng mã phát sinh từ mật người dùng (2) TGS giải mã thẻ chứng xác thực, kiểm tra yêu cầu tạo thẻ cho máy chủ yêu cầu (6) Máy chủ kiểm tra phù hợp thẻ chứng xác thực cấp quyền truy nhập vào dịch vụ Nếu Server có yêu cầu xác thực lẫn máy chủ gửi chứng xác thực IT Một lần với (3) Trạm làm loại dịch vụ việc nhắc nhở người dùng đưa vào mật để giải mã thông tin tới gửi thẻ chứng xác Một lần thực có chứa tên với phiên user, địa mạng dịch vụ thời gian tới TGS CSDL PT (5) Trạm làm việc gửi thẻ chứng xác thực tới máy chủ Hình 6.4 Tóm lược trao đổi thông báo Kv.4 a) Trao đổi dịch vụ xác thực: Để thu nhận thẻ cấp thẻ (1) C  AS : ID C // ID tgs // TS1 (Nhãn thời gian) (2) AS  C: EKc KC, tgs // IDtgs // TS2 // LT2 (thời gian sống) // Thẻ tgs Thẻ tgs = EKtgs [KC, tgs // IDC // ADC // IDtgs // TS2 // LT2 ] b) Trao đổi dịch vụ cấp thẻ: Để thu nhận thẻ cung cấp dịch vụ (3) C  TGS : IDV Thẻ tgs // Authenticator C (IDV : ID dịch vụ yêu cầu) (4) TGS  C : EK,tgs KC, V // IDV // TS2 // Thẻ V Thẻ tgs = EKtgs [KC, tgs // IDC // ADC // IDtgs // TS2 // LT2 ] ThẻV = EKv [KC, v // IDC // ADC // IDV // TS2 // LT4 ] Authenticator C = EK,tgs [IDC // ADC // TS 3] 217 Chương - Các chuẩn áp dụng c) Trao đổi xác thực Máy trạm/ máy chủ: Để thu nhận dịch vụ (5) C  V : Thẻ V // Authenticator C (6) V  C : EKc,v TS5 H (để xác thực lẫn nhau) ThẻV = EKv [KC, v // IDC // ADC // IDV // TS2 // LT4 ] Authenticator C = EK,tgs [IDC // ADC // TS 5] Bảng cho ta thấy kỹ thuật phân phối khoá phiên IT Trước hết khách hàng (client) gửi thông báo tới AS yêu cầu truy nhập vào TGS AS trả lời thông báo mã khóa trích xuất từ mật người dùng (KC) có chứa thẻ Thơng báo chứa khoá phiên KC,tgs cho C TGS, khóa phiên nằm bên thơng báo mã KC nên có máy trạm người dùng đọc Khóa phiên nằm Thẻ tgs mà TGS đọc Như khóa phiên phân phối an toàn cho C TGS Cần ý số thông tin phụ thêm vào pha hội thoại Thông báo (1) chứa nhãn thời gian TS để AS biết thông báo lúc Thông báo (2) chứa số yếu tố thẻ dạng mà C truy nhập Điều cho phép C xác nhận thư TGS biết thời gian hết hạn Khi có thẻ khóa phiên C truy nhập vào TGS PT Trước hết C gửi tới TGS thông báo chứa thẻ + IDV (định danh dịch vụ yêu cầu) (thông báo (3)) Hơn nữa, C phát thẻ xác thực Authenticator bao gồm IDC ADC (địa người dùng C) nhãn thời gian TS Không giống thẻ dùng lại, thẻ xác thực dùng lần có thời gian sống ngắn TGS giải mã thẻ khóa mà chia sẻ với AS Thẻ báo người dùng C cung cấp khóa phiên K c,tgs Thực ra, thẻ báo "Người sử dụng khóa K c,tgs phải C " TGS dùng khóa phiên để giải mã thẻ xác thực Sau TGS kiểm tra tên địa từ thẻ xác thực từ nội dung thẻ từ địa mạng thông báo tới Nếu điều phù hợp TGS dã đảm bảo người gửi thẻ thực chủ nhân thẻ Thực thẻ báo "ở thời điểm TS3 sử dụng K c,tgs " Cần ý thẻ không chứng minh định danh phương pháp để phân phối khóa cách an tồn Chính thẻ xác thực chứng minh định danh client Vì thẻ xác thực dùng lần có thời gian dùng ngắn nên đối phương khó lịng ăn cắp thẻ thẻ xác thực để dùng lại TGS trả lời thông báo (4) có dạng thơng báo (2) Thơng báo mã khóa phiên chia sẻ TGS C, chứa khóa phiên cần chia sẻ C máy chủ V, định danh V; IDV, nhãn thời gian thẻ Bản thân thẻ chứa khóa phiên Lúc C có thẻ cấp dịch vụ dùng lại V Khi C trình thẻ thơng báo (5) gửi kèm theo thẻ xác thực (Authentication) 218 Chương - Các chuẩn áp dụng Máy chủ V giải mã thẻ, khơi phục khóa phiên giải mã thẻ xác thực cần xác thực lẫn nhau, máy chủ trả lời thơng báo (6) Máy chủ trả lại giá trị nhãn thời gian lấy từ thẻ xác thực tăng thêm mã khóa phiên C giải mã thơng báo để khôi phục lại nhãn thời gian tăng Vì thơng báo mã khóa phiên nên C đảm bảo tạo V Nội dung thông báo đảm bảo với C thông báo dùng lại thông báo cũ Cuối cùng, cuối trình, client server chia sẻ khóa bí mật Khóa dùng để mã hóa thông báo tương lai cho hai bên để trao đổi khóa phiên ngẫu nhiên Giải thích yếu tố thủ tục Kv.4 a) Trao đổi dịch vụ xác thực Thông báo (1) IDC Client yêu cầu thẻ cấp thẻ Báo cho AS định danh người dùng từ client ID tgs Báo cho AS biết người dùng yêu cầu truy nhập TGS TS Cho phép AS kiểm tra đồng hồ client đồng với AS AS trả thẻ cấp thẻ IT Thơng báo (2) Mã hóa dựa mật user, cho phép AS client kiểm tra mật bảo vệ nội dung thông báo (2) K C,tgs Bản khóa phiên tạo AS mà client sử dụng để thực trao đổi bí mật client TGS (khơng u cầu chúng phải chia sẻ khóa cố định) PT EKC ID tgs Xác nhận thẻ cho TGS TS Báo cho client thời gian mà thẻ đệ trình LT Báo cho client thời gian sống thẻ Thẻ tgs Thẻ cần client sử dụng để truy nhập TGS b) Trao đổi dịch vụ cấp thẻ Thông báo (3) IDV Thẻ tgs Client yêu cầu thẻ cấp dịch vụ Báo cho TGS user yêu cầu truy nhập tới máy chủ V Đảm bảo cho TGS user xác thực AS AuthenticatorC Được tạo client để xác nhận tính hợp lệ cho thẻ Thơng báo (4) TGS trả thẻ cấp dịch vụ E K C ,tgs Khóa chia sẻ C TGS dùng bảo vệ nội dung thông báo (4) K C,tgs Bản khoá phiên tạo AS IDV Xác nhận thẻ cho máy chủ V TS Báo cho client thời gian mà thẻ đệ trình 219 Chương - Các chuẩn áp dụng Thẻ V Thẻ tgs Thẻ dùng client để truy nhập vào máy chủ V Có khả dùng lại để người dùng khơng phải vào lại mật E Ktgs Thẻ mã hóa khóa có AS TGS biết nhằm tránh phá rối (thu trộm) K C,tgs Bản khóa phiên mà TGS truy nhập dùng để giải mã thẻ xác thực nhờ xác thực thẻ IDC Báo chủ sở hữu hợp lệ thẻ ADC Tránh việc dùng thẻ từ trạm làm việc khác với trạm yêu cầu thẻ ID tgs Đảm bảo cho máy chủ giải mã cho thẻ TS Báo cho TGS thời gian mà thẻ đệ trình LT Tránh dùng lại sau thẻ hết hạn Đảm bảo cho TGS người trình thẻ client mà thẻ trình cho nó, có thời gian sống ngắn để tránh dùng lại E K C ,tgs Thẻ xác thực mã khóa có client TGS biết nhằm tránh thu trộm IT AuthenticatorC ID C Phải phù hợp với ID thẻ để xác thực thẻ AD C Phải phù hợp với địa thẻ để xác thực thẻ TS Báo cho TGS thời gian mà thẻ xác thực tạo PT c) Trao đổi xác thực Máy trạm/ máy chủ (Client/Server) Thông báo (5) Thẻ V Client yêu cầu dịch vụ Đảm bảo với máy chủ người dùng AS xác nhận AuthenticatorC Được tạo client để xác nhận tính hợp lệ cho thẻ Thơng báo (6) Xác thực (tùy chọn) server client E K C ,v Đảm bảo cho C thông báo từ V TS 5+1 Đảm bảo cho C dùng lại hồi đáp cũ Thẻ V Có thể dùng lại để client không cần yêu cầu thẻ từ TGS truy nhập tới máy chủ E Kv Thẻ mã hóa khóa có TGS server biết nhằm tránh thu trộm K C,v Bản khóa phiên mà client truy nhập, dùng để giải mã thẻ xác thực nhằm xác thực thẻ IDC Báo chủ sở hữu hợp lệ thẻ ADC Tránh việc dùng thẻ từ trạm làm việc khác với trạm yêu cầu thẻ ID v Đảm bảo cho server giải mã cho thẻ TS Báo cho server thời gian mà thẻ đệ trình LT Tránh dùng lại sau thẻ hết hạn 220 Chương - Các chuẩn áp dụng AuthenticatorC Đảm bảo cho server người trình thẻ client mà thẻ đưa cho nó, có thời gian sống ngắn để tránh dùng lại E K C ,v Thẻ xác thực mã khóa có server client biết nhằm tránh thu trộm ID C Phải phù hợp với ID thẻ để xác thực thẻ AD C Phải phù hợp với địa thẻ để xác thực thẻ TS Báo cho server thời gian mà thẻ xác thực tạo BÀI TẬP CHƯƠNG Bài 6.1: Nêu ý tưởng thiết kế hệ mật bảo vệ file liệu sở phân tích PGP? IT Bài 6.2: Cấu tạo chữ ký kép? Ý nghĩa chữ ký kép thương mại điện tử? Bài 6.3: Vai trò máy chủ xác thực Kenberos? PT Bài 6.4: Hãy mô tả trình trao đổi dịch vụ xác thực K.V.4? 221 Phụ lục - Mã nguồn DES PHỤ LỤC - Mà NGUỒN DES #define EN0 #define DE1 /* MODE == encrypt */ /* MODE == decrypt */ typedef struct { unsigned long ek[32]; unsigned long dk[32]; } des_ctx; extern void deskey(unsigned char *, short); /* hexkey[8] MODE * Sets the internal key register according to the hexadecimal * key contained in the bytes of hexkey, according to the DES, * for encryption or decryption according to MODE */ IT extern void usekey(unsigned long *); /* cookedkey[32] * Loads the internal key register with the data in cookedkey */ PT extern void cpkey(unsigned long *); /* cookedkey[32] * Copies the contents of the internal key register into the storage * located at &cookedkey[0] */ extern void des(unsigned char *, unsigned char *); /* from[8] to[8] * Encrypts/Decrypts (according to the key currently loaded in the * internal key register) one block of eight bytes at address `from' * into the block at address `to' They can be the same */ static static static static static static static static void void void void scrunch(unsigned char *, unsigned long *); unscrun(unsigned long *, unsigned char *); desfunc(unsigned long *, unsigned long *); cookey(unsigned long *); unsigned long KnL[32] = { 0L }; unsigned long KnR[32] = { 0L }; unsigned long Kn3[32] = { 0L }; unsigned char Df_Key[24] = { 0ì01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef, 0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10, 0x89,0xab,0xcd,0xef,0ì01,0x23,0x45,0x67 }; static unsigned short bytebit[8] = { 0200, 0100, 040, 020, 010, 04, 02, 01 }; static unsigned long 0x800000L, 0x80000L, 0x8000L, 0x800L, bigbyte[24] = { 0x400000L, 0x200000L, 0x40000L, 0x20000L, 0x4000L, 0x2000L, 0x400L, 0x200L, 222 0x100000L, 0x10000L, 0x1000L, 0x100L, Phụ lục - Mã nguồn DES 0x80L, 0x8L, 0x40L, 0x4L, 0x20L, 0x2L, 0x10L, 0x1L }; /* Use the key schedule specified in the Standard (ANSI X3.92-1981) */ static unsigned char pc1[56] = 56, 48, 40, 32, 24, 16, 9, 1, 58, 50, 42, 34, 62, 54, 46, 38, 30, 22, 13, 5, 60, 52, 44, 36, { 8, 26, 14, 28, 0, 18, 6, 20, 57, 49, 41, 33, 25, 17, 10, 2, 59, 51, 43, 35, 61, 53, 45, 37, 29, 21, 12, 4, 27, 19, 11, }; static unsigned char totrot[16] = { 1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28 }; IT static unsigned char pc2[48] = { 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 }; void deskey(key, edf) /* Thanks to James Gillogly & Phil Karn! */ unsigned char *key; short edf; { register int i, j, l, m, n; unsigned char pc1m[56], pcr[56]; unsigned long kn[32]; PT for ( j = 0; j < 56; j++ ) { l = pc1[j]; m = l & 07; pc1m[j] = (key[l >> 3] & bytebit[m]) ? : 0; } for( i = 0; i < 16; i++ ) { if( edf == DE1 ) m = (15 - i) 6; *cook = (*raw0 & 0x0003f000L) 4; *cook++ |= (*raw1 & 0ì0000003fL); } usekey(dough); return; } IT void cpkey(into) register unsigned long *into; { register unsigned long *from, *endp; from = KnL, endp = &KnL[32]; while( from < endp ) *into++ = *from++; return; } PT void usekey(from) register unsigned long *from; { register unsigned long *to, *endp; to = KnL, endp = &KnL[32]; while( to < endp ) *to++ = *from++; return; } void des(inblock, outblock) unsigned char *inblock, *outblock; { unsigned long work[2]; scrunch(inblock, work); desfunc(work, KnL); unscrun(work, outblock); return; } static void scrunch(outof, into) register unsigned char *outof; register unsigned long *into; { *into = (*outof++ & 0xffL) 8) & 0xffL; *into++ = *outof++ & 0xffL; *into++ = (*outof >> 24) & 0xffL; *into++ = (*outof >> 16) & 0xffL; *into++ = (*outof >> 8) & 0xffL; *into = *outof & 0xffL; return; } static unsigned long SP1[64] = { 0#01010400L, 0#00000000L, 0#00010000L, 0#01010004L, 0#00010404L, 0#00000004L, 0#00000400L, 0#01010400L, 0#01010404L, 0#01000404L, 0#01010004L, 0#01000000L, 0#00000404L, 0#01000400L, 0#01000400L, 0#00010400L, 0#01010000L, 0#01010000L, 0#00010004L, 0#01000004L, 0#01000004L, 0#00000000L, 0#00000404L, 0#00010404L, 0#00010000L, 0#01010404L, 0#00000004L, 0#01010400L, 0#01000000L, 0#01000000L, 0#01010004L, 0#00010000L, 0#00010400L, 0#00000400L, 0#00000004L, 0#01000404L, 0#01010404L, 0#00010004L, 0#01010000L, 0#01000004L, 0#00000404L, 0#00010404L, 0#00000404L, 0#01000400L, 0#01000400L, 0#00010004L, 0#00010400L, 0#00000000L, 225 Phụ lục - Mã nguồn DES 0#08020200L, 0#00020008L, 0#00000200L, 0#00020000L, 0#00020208L, 0#08000208L, 0#00000008L, 0#08000200L, 0#08020208L, 0#00000000L, 0#08000000L, 0#00020200L, 0#00000208L, 0#08020008L, 0#00000000L, 0#08000200L, 0#08020008L, 0#08020208L, 0#08000008L, 0#08020000L, 0#00020200L }; static unsigned long SP4[64] = { 0#00802001L, 0#00002081L, 0#00802080L, 0#00800081L, 0#00000000L, 0#00802000L, 0#00000081L, 0#00000000L, 0#00000001L, 0#00002000L, 0#00000080L, 0#00800000L, 0#00800081L, 0#00000001L, 0#00002000L, 0#00802080L, 0#00800080L, 0#00800001L, 0#00000081L, 0#00000000L, 0#00002080L, 0#00800080L, 0#00802001L, 0#00002081L, 0#00802081L, 0#00000081L, 0#00800001L, 0#00002001L, 0#00002001L, 0#00002080L, 0#00000080L, 0#00800000L, 0#00002081L, 0#00800001L, 0#00802000L, 0#00800080L, 0#00800000L, 0#00002001L, 0#00002080L, 0#00802081L, 0#00802000L, 0#00000000L, 0#00800081L, 0#00002081L, 0#00000001L, 0#00802080L, 0#00800000L, 0#00002000L, 0#00000080L, 0#00002001L, 0#00802081L, 0#00800001L, 0#00802001L, 0#00002080L, 0#00800080L, 0#00000081L, 0#00802081L, 0#00802000L, 0#00000001L, 0#00000080L, 0#00002000L, 0#00800081L, 0#00802001L, 0#00802080L }; IT 0#00020000L, 0#00000200L, 0#08000008L, 0#08000208L, 0#00000008L, 0#08020000L, 0#00020208L, 0#02080000L, 0x40000000L, 0#02000100L, 0#00080100L, 0x40080000L, 0x42080100L, 0#00000000L, 0x42000000L, 0#00000100L, 0x42000100L, 0x42080000L, 0#02000000L, 0x42000000L, 0x40080000L, 0x40000100L, 0#02080100L, 0x42000100L, 0#02080000L, 0x40080100L, 0x40000000L, 0#00000000L, 0#02000100L, 0x42000000L, 0#00080100L, 0#02000000L, 0x40080100L, 0#02080100L, 0x42080000L, 0x42080100L, 0x42000000L, 0#00080000L, 0x40000100L }; static unsigned long SP6[64] = { 0x20000010L, 0x20400000L, 0x20400000L, 0#00000010L, 0x20004000L, 0#00404010L, 0#00400010L, 0x20004000L, 0#00000000L, 0#00400010L, 0#00404000L, 0x20004010L, 0x20400010L, 0#00000000L, 0#00004010L, 0#00404000L, 0x20004000L, 0#00000010L, 0x20404010L, 0#00400000L, 0#00400000L, 0x20004000L, 0x20000010L, 0x20404010L, 0#00404010L, 0x20404000L, 0#00000010L, 0#00004000L, 0#00004000L, 0#00400010L, 0x20404000L, 0x20000000L, 0#00004000L, 0x20404010L, 0#00400000L, 0x20000000L, 0x20004010L, 0#00000010L, 0#00404010L, 0x20404000L, 0x20400010L, 0#00004010L, 0x20000000L, 0#00404000L, 0#00000000L, 0x20400000L, 0x20004010L, 0#00400010L, 0x20404010L, 0#00400000L, 0x20000010L, 0#00004010L, 0#00004000L, 0x20400010L, 0x20404000L, 0x20000000L, 0#00404000L, 0x20000010L, 0#00004010L, 0x20400000L, 0x20400010L, 0#00404010L, 0#00000000L, 0x20004010L }; PT static unsigned long SP5[64] = { 0#00000100L, 0#02080100L, 0#00080000L, 0#00000100L, 0x40080100L, 0#00080000L, 0x42000100L, 0x42080000L, 0#02000000L, 0x40080000L, 0x40000100L, 0x42080100L, 0x42080000L, 0x40000100L, 0#02080100L, 0#02000000L, 0#00080000L, 0x42000100L, 0x40000000L, 0#02080000L, 0#02000100L, 0x40000000L, 0x40080100L, 0#00000100L, 0x42080100L, 0#00080100L, 0#02080000L, 0#00000000L, 0#00080100L, 0#02000100L, 0#00000000L, 0x40080000L, 226 Phụ lục - Mã nguồn DES 0#04000802L, 0#00200802L, 0#00000000L, 0#04200002L, 0#00200002L, 0#04200800L, 0#00000802L, 0#04000000L, 0#00200000L, 0#04200002L, 0#04000800L, 0#00200802L, 0#04200802L, 0#00000002L, 0#04200000L, 0#00000800L, 0#00000000L, 0#04200800L, 0#04000002L, 0#00000802L, 0#04000800L, 0#00200002L, 0#04200802L, 0#00200800L, 0#04000802L, 0#00000002L, 0#00200000L, 0#04200800L, 0#04200000L, 0#04200802L, 0#00000800L, 0#00200002L }; static unsigned long SP8[64] = { 0x10001040L, 0#00001000L, 0x10000000L, 0x10001040L, 0#00040040L, 0x10040000L, 0x10041000L, 0#00041040L, 0x10040000L, 0x10000040L, 0#00041000L, 0#00040040L, 0#00001040L, 0#00000000L, 0x10000040L, 0x10001000L, 0#00041040L, 0#00040000L, 0#00000040L, 0x10040040L, 0x10001000L, 0#00000040L, 0x10040040L, 0x10000000L, 0#00000000L, 0x10041040L, 0x10040000L, 0x10001000L, 0x10041040L, 0#00041000L, 0#00001040L, 0#00040040L, 0#00040000L, 0#00000040L, 0x10041040L, 0#00001000L, 0x10001000L, 0x10040040L, 0#00000000L, 0#00041040L, 0x10041000L, 0#00001000L, 0x10000040L, 0#00040000L, 0#00040040L, 0x10001040L, 0#00041000L, 0x10000000L, 0x10041040L, 0x10000000L, 0#00041000L, 0#00000040L, 0#00001040L, 0x10041000L, 0x10040040L, 0#00040000L, 0#00001000L, 0#00041040L, 0x10040000L, 0x10001040L, 0x10000040L, 0#00000000L, 0#00001040L, 0x10041000L }; PT IT static unsigned long SP7[64] = { 0#00200000L, 0#04200002L, 0#00000800L, 0#04000802L, 0#04200802L, 0#00200000L, 0#00000002L, 0#04000000L, 0#04000800L, 0#00200802L, 0#04000002L, 0#04200000L, 0#04200000L, 0#00000800L, 0#00200800L, 0#00000002L, 0#04000000L, 0#00200800L, 0#04000802L, 0#04200002L, 0#00200002L, 0#04000000L, 0#04200800L, 0#00000802L, 0#00000802L, 0#04000002L, 0#00200800L, 0#00000000L, 0#00000000L, 0#00200802L, 0#04000002L, 0#04000800L, static void desfunc(block, keys) register unsigned long *block, *keys; { register unsigned long fval, work, right, leftt; register int round; leftt = block[0]; right = block[1]; work = ((leftt >> 4) ^ right) & 0#0f0f0f0fL; right ^= work; leftt ^= (work > 16) ^ right) & 0#0000ffffL; right ^= work; leftt ^= (work > 2) ^ leftt) & 0x33333333L; leftt ^= work; right ^= (work > 8) ^ leftt) & 0#00ff00ffL; leftt ^= work; right ^= (work 31) & 1L)) & 0xffffffffL; work = (leftt ^ right) & 0xaaaaaaaaL; leftt ^= work; right ^= work; 227 Phụ lục - Mã nguồn DES leftt = ((leftt > 31) & 1L)) & 0xffffffffL; IT for( round = 0; round < 8; round++ ) { work = (right > 4); work ^= *keys++; fval = SP7[ work & 0x3fL]; fval |= SP5[(work >> 8) & 0x3fL]; fval |= SP3[(work >> 16) & 0x3fL]; fval |= SP1[(work >> 24) & 0x3fL]; work = right ^ *keys++; fval |= SP8[ work & 0x3fL]; fval |= SP6[(work >> 8) & 0x3fL]; fval |= SP4[(work >> 16) & 0x3fL]; fval |= SP2[(work >> 24) & 0x3fL]; leftt ^= fval; work = (leftt > 4); work ^= *keys++; fval = SP7[ work & 0x3fL]; fval |= SP5[(work >> 8) & 0x3fL]; fval |= SP3[(work >> 16) & 0x3fL]; fval |= SP1[(work >> 24) & 0x3fL]; work = leftt ^ *keys++; fval |= SP8[ work & 0x3fL]; fval |= SP6[(work >> 8) & 0x3fL]; fval |= SP4[(work >> 16) & 0x3fL]; fval |= SP2[(work >> 24) & 0x3fL]; right ^= fval; } PT right = (right > 1); work = (leftt ^ right) & 0xaaaaaaaaL; leftt ^= work; right ^= work; leftt = (leftt > 1); work = ((leftt >> 8) ^ right) & 0#00ff00ffL; right ^= work; leftt ^= (work > 2) ^ right) & 0x33333333L; right ^= work; leftt ^= (work > 16) ^ leftt) & 0#0000ffffL; leftt ^= work; right ^= (work > 4) ^ leftt) & 0#0f0f0f0fL; leftt ^= work; right ^= (work ek); deskey(key,DE1); cpkey(dc->dk); } /* Encrypt several blocks in ECB mode Caller is responsible for short blocks */ void des_enc(des_ctx *dc, unsigned char *data, int blocks){ unsigned long work[2]; int i; unsigned char *cp; cp = data; for(i=0;iek); unscrun(work,cp); cp+=8; } } void des_dec(des_ctx *dc, unsigned char *data, int blocks){ unsigned long work[2]; int i; unsigned char *cp; IT cp = data; for(i=0;idk); unscrun(work,cp); cp+=8; } PT } void main(void){ des_ctx dc; int i; unsigned long data[10]; char *cp,key[8] = {0#01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}; char x[8] = {0#01,0x23,0x45,0x67,0x89,0xab,0xcd,0xe7}; cp = x; des_key(&dc,key); des_enc(&dc,cp,1); printf("Enc(0 7,0 7) = "); for(i=0;i

Ngày đăng: 19/03/2021, 16:57

Tài liệu cùng người dùng

Tài liệu liên quan