Thiết kế vi mạch thực hiện thuật toán AES dựa trên công nghệ FPGA

108 7 0
Thiết kế vi mạch thực hiện thuật toán AES dựa trên công nghệ FPGA

Đ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

Mẫu bìa luận văn có in chữ nhũ Khổ 210 x 297 mm Đ inh kim chi Bộ giáo dục đào tạo Trường đại học bách khoa hà néi - Luận văn thạc sĩ khoa học 0B Đ iện tử viễn thông Thiết kế vi mạch thực thuật toán AES dựa công nghệ FPGA đinh kim chi B 2004 - 2006 Hµ Néi 2006 Hµ néi 2006 Môc lôc Môc lôc T 15T Danh mục bảng T 15T Danh mục hình vẽ, đồ thÞ T T C¸c tõ viÕt t¾t T 15T Lêi nãi ®Çu T 15T Ch­¬ng Tổng quan vấn đề nghiên cứu 11 T 1.1 Giíi thiƯu bảo mật thông tin 11 T T 15T T 1.2 LÜnh vùc b¶o mËt 12 T T T 15T 1.3 Các thuật toán bảo mật áp dụng 13 T T T T 1.4 VÊn ®Ị qu¶n lý khãa 16 T T T 15T 1.4.1 Cách tạo khóa 16 T 15T 1.4.2 Các khóa ngẫu nhiên 18 T T 1.4.3 Ph©n phèi khãa 18 T 15T 1.4.4 Quản lý khóa theo mô hình tập trung theo mô hình điểm - điểm 19 T T 1.5 C¸c tiêu chuẩn bảo mật số liệu thông dụng 20 T T 1.5.1 Tiªu chuÈn DES 20 T 15T 1.5.2 Tiªu chuÈn Triple-DES 21 T T 1.5.3 Tiªu chuÈn AES 22 T 15T 1.6 So sánh bảo mật cứng bảo mật mềm 23 T T 1.7 Các yêu cầu thiết bị bảo mật cứng 24 T T 1.8 Các hệ thống bảo mật cứng ®­ỵc øng dơng hiƯn 24 T T 1.9 Đề xuất giải pháp chế tạo vi mạch thực thuật toán bảo mËt AES 25 T T Chương Tiêu chuẩn bảo mật số liệu AES 28 T 2.1 Các định nghĩa 28 T 15T 2.2 C¸c quy ­íc 31 T 15T 2.3 Cơ sở toán học 34 T 15T 2.4 ThuËt to¸n AES 39 T 15T Chương Thiết kế vi mạch thực thuật to¸n AES 52 T 3.1 Thiết kế phần cứng vi mạch AES 52 T T 3.1.1 Đề xuất kiến trúc phần cứng vi m¹ch AES 52 T T 3.1.2 Mô tả chi tiết chu trình mà hóa, giải mà 54 T T 3.2 LËp tr×nh cho vi m¹ch AES 58 T T 3.2.1 C«ng lËp tr×nh 58 T T 3.2.2 Phương pháp lập trình 61 T T 3.2.3 Kiến trúc phần mềm vi mạch AES 61 T T 3.2.4 C¸ch thùc hiƯn 63 T 15T 3.2.5 Giao diện vào/ra module mà hóa giải mà 65 T T Chương Kết thực nghiệm 66 T 4.1 Kết thực ngôn ngữ mô tả phần cøng 66 T T 4.2 Kết thực phần cứng 67 T T 4.2.1 §Ị xt kiÕn tróc phần cứng mạch thử nghiệm 67 T T 4.2.2 Lùa chän linh kiÖn 69 T T 4.2.3 Sơ đồ nguyªn lý 70 T 15T 4.2.4 ThiÕt kÕ m¹ch in PCB 70 T T 4.2.5 KÕt thực chip FPGA toàn module AES số module giao tiếp khác cho mạch thư nghiƯm 72 T T 4.3 Một số kết khác 73 T 15T 4.3.1 Thực thuật toán AES m¸y tÝnh 73 T T 4.3.2 Phần mềm điều khiển cho m¹ch thư nghiƯm 84 T T 4.4 KÕt ln vµ h­íng ph¸t triĨn 85 T T 4.4.1 KÕt luËn 85 T 15T 4.4.2 H­íng ph¸t triĨn 85 T T Tµi liƯu tham kh¶o 87 T 15T Phô lôc - T¹o khãa m· 88 T 15T Phô lôc - M· hãa 93 T 15T Phô lục - Phần mềm thực thuật toán AES máy tính 95 T T 5 Danh mục bảng Bảng 1.1 Số khóa trường hợp khóa độ dài khác 17 U T T U Bảng 1.2 Thời gian tìm kiếm nhiều với trường hợp khóa có độ dài khác 17 U T 15T U B¶ng 3.1 Giá trị số D[31 0] 58 U T T U Bảng 3.2 Giao diện vào/ra module mà hóa giải mà 65 U T T U B¶ng 4.1 Kết biên dịch module mà hóa 66 U T T U Bảng 4.2 Kết biên dịch module giải m· 67 U T T U Bảng 4.3 Tính chÝnh cña chip FPGA EP1C6Q240-C8 69 U T T U B¶ng 4.4 KÕt biên dịch module AES module giao tiếp khác trªn cïng mét chip FPGA EP1C6Q240-C8 72 U T T U Danh mục hình vẽ, đồ thị Hình 1.1 Mô hình phân phối khóa đơn giản 19 U T T U Hình 2.1 Biểu diễn mẫu bit theo hÖ hex 32 U T T U H×nh 2.2 Các số Byte Bit 33 U T T U Hình 2.3 Mảng Trạng thái, đầu vào đầu 33 U T T U Hình 2.4 Mối quan hệ Khóa - Khối - Chu tr×nh 39 U T T U H×nh 2.5 ThuËt to¸n m· hãa 40 U T T U Hình 2.6 SubBytes() sử dụng bảng S-box biến đổi byte mảng Trạng thái 41 U T 15T U H×nh 2.7 S-box: giá trị thay cho byte xy (dạng hex) 42 U T T U Hình 2.8 ShiftRows() thực dịch vòng ba hàng cuối mảng Trạng thái 43 U T 15T U H×nh 2.9 MixColumns() thực mảng Trạng thái theo cột 44 U T T U H×nh 2.10 AddRoundKey() thùc hiƯn phÐp XOR tõng cét mảng Trạng thái với từ chuỗi khóa 45 U T T U Hình 2.11 Thuật toán t¹o khãa 46 U T T U Hình 2.12 Thuật toán giải mà 47 U T T U Hình 2.13 InvShiftRows() dịch vòng ba hàng cuối mảng Trạng thái 48 U T T U Hình 2.14 Bảng S-box đảo: giá trị thay cho byte xy (d¹ng hex) 48 U T T U Hình 2.15 Thuật toán giải mà tương đương 51 U T T U H×nh 3.1 Khèi m· hãa vi m¹ch AES 53 U T T U Hình 3.2 Khối giải mà vi mạch AES 53 U T T U H×nh 3.3 Chu tr×nh m· hãa 54 U T 15T U H×nh 3.4 Chu trình giải mà 55 U T T U Hình 3.5 Phép biến đổi ShiftRow 56 U T T U H×nh 3.6 PhÐp biÕn ®ỉi InvShiftRow 56 U T T U H×nh 3.7 Khèi Logic KeyRound 57 U T T U H×nh 3.8 Khèi Logic InvKeyRound 57 U T T U Hình 3.9 Cấu trúc chương tr×nh m· hãa 62 U T T U H×nh 3.10 Cấu trúc chương trình giải mà 62 U T T U Hình 3.11 Đồ thị thời gian trình mà hóa AES 63 U T T U H×nh 3.12 Đồ thị thời gian trình nạp khóa gi¶i m· AES 64 U T T U Hình 3.13 Đồ thị thời gian trình giải mà AES 64 U T T U H×nh 4.1 Kết chạy mô trình mà hóa 66 U T T U Hình 4.2 Kết chạy mô trình giải mà 67 U T T U H×nh 4.3 Kiến trúc phần cứng mạch thử nghiệm AES 68 U T T U Hình 4.4 Sơ đồ mạch in sau thiÕt kÕ 71 U T T U H×nh 4.5 Bảng mạch thử nghiệm AES sau đà hàn 72 U T T U Hình 4.6 Sơ đồ khối phần mềm thực thuật toán AES máy tính 74 U T T U H×nh 4.7 Lưu đồ thuật toán trình mà hóa 75 U T T U Hình 4.8 Lưu đồ thuật toán trình giải mà 76 U T T U Hình 4.9 Lưu đồ thuật toán trình tạo khóa 77 U T T U Hình 4.10 Giao diện phần mềm thực thuật toán AES máy tính 78 U T T U Hình 4.11 Chi tiết trình mà hóa 78 U T T U Hình 4.12 Chi tiết trình giải mà 79 U T T U Hình 4.13 Giao diện chương trình điều khiển giám sát phÇn cøng 84 U T T U Các từ viết tắt Tiếng Anh A AES TiÕng ViƯt Advanced Encryption Standard Tiªu chn m· hóa tiên tiến Analog Hardware Description Language Ngôn ngữ lập trình mô tả phần cứng tương tự D DES Data Encryption Standard Tiªu chn m· hãa sè liƯu F FPGA Field-Programmable Gate Array Thiết bị có khả lập trình H HDL Hardware Description Language Ngôn ngữ lập trình mô tả phần cứng Integrated Development Environment Môi trường phát triĨn tÝch hỵp Key Distribution Center Key Translation Center Trung tâm phân phối khóa Trung tâm biên dịch khóa Ron Rivest, Adi Shamir and Leonard Adleman Thuật toán bảo mật khãa c«ng khai Very high scale IC Hardware Description Language Ngôn ngữ lập trình mô tả phần cứng mật độ tÝch hỵp cao AHDL I IDE K KDC KTC R RSA V VHDL Lời nói đầu Bảo mật phương pháp, kỹ thuật công nghệ nhằm bảo vệ thông tin bí mật thông tin giao dịch, thông tin cá nhân nhằm ngăn cản việc đánh cắp hay truy cập bất hợp pháp vào nguồn tài nguyên không phép Bảo mật thông tin đà đời từ lâu, lúc đầu sử dụng quân Nhưng nay, bảo mật đà áp dụng rộng rÃi dân sự, đặc biệt ngành kinh tế, tài chính, ngân hàng nghiên cứu khoa học Cuộc cách mạng công nghệ thông tin đà tạo bước ngoặt lớn cho nhân loại Cơ hội phát triển cho quốc gia vô thuận lợi Sự giao lưu hội nhập toàn cầu đà mở rộng trước mắt tất quốc gia kể quốc gia phát triển Thông tin tri thức lực cạnh tranh mạnh mẽ kỷ nguyên mới, kỷ nguyên Internet thông tin số Tuy nhiên, ta lạm dụng môi trường thông tin mức mà biện pháp kiểm soát hay bảo vệ lường hết tác động xấu mà đem lại Vì thế, vấn đề cần giải vấn đề an toàn, bảo mật tin cậy cho thông tin góc độ kỹ thuật pháp lý Tại Việt Nam, sách đà tạo điều kiện cho doanh nghiệp phát triển mạng thông tin sở hạ tầng Trong thời gian tới, công nghệ WAN đáp ứng tốt yêu cầu băng thông, chất lượng dịch vụ, đồng thời nạn công mạng với mục đích trị kinh tế gia tăng nhanh chóng việc bảo mật thông tin ngày trọng Không nhà cung cấp dịch vụ mà quan phủ, quân đội, khối ngân hàng doanh nghiệp bắt đầu có ý thức an toàn thông tin Tuy nhiên, sản phẩm bảo mật sản xuất nước thường có giá thành đắt, dành cho doanh nghiệp lớn ngân hàng, tài Với doanh nghiệp vừa nhỏ, họ có nhu cầu bảo mật thông tin họ đủ khả để mua sản phẩm Bên cạnh đó, ngành an ninh quốc phòng lại không muốn 10 mua sản phẩm bảo mật nước lại xuất phát từ vấn đề bảo mật thông tin Trên sở đó, tác giả đà nghiên cứu phát triển thành đề tài Thiết kế vi mạch thực thuật toán AES dựa công nghệ FPGA sử dụng cho nhiều mục đích khác AES tiêu chuẩn bảo mật ứng dụng rộng rÃi nay, mét nhãm hai kü s­ ng­êi BØ lµ Joan Daemen, Vincent Rijmen nghiên cứu đề xuất vào tháng năm 1998 Viện tiêu chuẩn công nghệ quốc gia Hoa Kỳ NIST thông qua tháng 11 năm 2001 tiêu chuẩn thức áp dụng cho bảo mật số liệu Bên cạnh đó, tác giả đà sử dụng phương pháp thiết kế phần cứng tiên tiến dựa công nghệ FPGA Với công nghệ nhiều chức điều khiển, logic thiết kế chip Bố cục luận văn sau: Chương trình bày tổng quan vấn đề nghiên cứu đề xuất giải pháp, Chương giới thiệu tiêu chuẩn bảo mật AES, Chương trình bày vấn đề thiết kế phần cứng phần mềm vi mạch AES, Chương đưa kết thu lý thuyết thực tế đề xuất hướng phát triển đề tài Trong thời gian qua, để hoàn thiện luận văn, em đà nhận tận tình hướng dẫn T.S Nguyễn Hữu Trung Tuy nhiên, thời gian có hạn, luận văn khó tránh khỏi thiếu sót, em mong nhận đóng góp ý kiến thày cô giáo để hoàn thiện Xin chân thành cảm ơn 101 hexciphertxtin.Text = hexciphertxtin.Text + Byte2Hex(tmp) Next i hexdeckey.Text = "" For i = To 15 tmp = key(i) hexdeckey.Text = hexdeckey.Text + Byte2Hex(tmp) Next i End If If Option4.Value Then 'Hex ciphertxt_in = hexciphertxtin.Text dec_key = hexdeckey.Text For i = To 15 textin(i) = (Hex2Byte(Mid$(ciphertxt_in, * i + 1, 2))) Next i For i = To 15 key(i) = (Hex2Byte(Mid$(dec_key, * i + 1, 2))) Next i 2))) ciphertxtin.Text = "" 'ASCII For i = To 15 ciphertxtin.Text = ciphertxtin.Text + Chr$(Hex2Byte(Mid$(ciphertxt_in, * i + 1, Next i deckey.Text = "" 'ASCII For i = To 15 deckey.Text = deckey.Text + Chr$(Hex2Byte(Mid$(dec_key, * i + 1, 2))) Next i End If For i = To 43 key_buff(i) = "" Next i For i = To ctw(i) = "" Next i For col = To 'rows For row = To 'colums cb(row, col) = textin(col * + row) ctw(col) = ctw(col) + Byte2Hex(cb(row, col)) Next row Next col 102 For col = To 'rows For row = To 'colums kb(row, col) = key(col * + row) Next row Next col 'Key Schedule Call Key_Expansion(kb) Call AddRoundKey(ctw, sw, nr) 'Nr=10 test = sw(0) + sw(1) + sw(2) + sw(3) 'update buffer frmdecipherdetail.rtb.Text = "" 'iinput frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + "round[ 0].iinput " For i = To 15 tmp = textin(i) frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + Byte2Hex(tmp) Next i frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + Chr$(13) + Chr$(10) 'ik_sch frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + "round[ 0].ik_sch " For i = To frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + key_buff(10 * + i) Next i frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + Chr$(13) + Chr$(10) 'istart frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + "round[ 0].istart " frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + test frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + Chr$(13) + Chr$(10) 'from 1->9 For nr_cnt = To Call Inv_Shift_Rows(sw, sr_sw) test = sr_sw(0) + sr_sw(1) + sr_sw(2) + sr_sw(3) 'is_row frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + "round[ " Trim(Str(nr_cnt)) + "].is_row " frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + test frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + Chr$(13) + Chr$(10) Call InvSubBytes(sr_sw, sub_sw) test = sub_sw(0) + sub_sw(1) + sub_sw(2) + sub_sw(3) 'is_box + 103 frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + "round[ " Trim(Str(nr_cnt)) + "].is_box " frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + test frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + Chr$(13) + Chr$(10) + Call AddRoundKey(sub_sw, ar_sw, 10 - nr_cnt) 'Nr=9->1 test = ar_sw(0) + ar_sw(1) + ar_sw(2) + ar_sw(3) 'ik_sch frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + "round[ " + Trim(Str(nr_cnt)) + "].ik_sch " For i = To frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + key_buff(4 * (10 nr_cnt) + i) Next i frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + Chr$(13) + Chr$(10) 'ik_add frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + "round[ " + Trim(Str(nr_cnt)) + "].ik_add " frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + test frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + Chr$(13) + Chr$(10) Call InvMixColumns(ar_sw, sw) test = sw(0) + sw(1) + sw(2) + sw(3) 'istart frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + "round[ " Trim(Str(nr_cnt)) + "].istart " frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + test frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + Chr$(13) + Chr$(10) Next nr_cnt Call Inv_Shift_Rows(sw, sr_sw) test = sr_sw(0) + sr_sw(1) + sr_sw(2) + sr_sw(3) 'is_row frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + "round[10].is_row " frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + test frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + Chr$(13) + Chr$(10) Call InvSubBytes(sr_sw, sub_sw) test = sub_sw(0) + sub_sw(1) + sub_sw(2) + sub_sw(3) 'is_box frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + "round[10].is_box " frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + test frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + Chr$(13) + Chr$(10) Call AddRoundKey(sub_sw, sw, 0) 'Nr=9->1 test = sw(0) + sw(1) + sw(2) + sw(3) 'ik_sch frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + "round[10].ik_sch " + 104 For i = To frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + key_buff(i) Next i frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + Chr$(13) + Chr$(10) 'ioutput frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + "round[10].ioutput " frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + test frmdecipherdetail.rtb.Text = frmdecipherdetail.rtb.Text + Chr$(13) + Chr$(10) 'display plain text output hexplaintxtout.Text = test 'Hex plaintxtout.Text = "" 'ASCII For i = To 15 plaintxtout.Text = plaintxtout.Text + Chr$(Hex2Byte(Mid$(test, * i + 1, 2))) Next i End Sub C¸c hàm xử lý Private Function Hex2Num(Hex_Val As String) As Byte Select Case Hex_Val Case "0" Hex2Num = Case "1" Hex2Num = Case "2" Hex2Num = Case "3" Hex2Num = Case "4" Hex2Num = Case "5" Hex2Num = Case "6" Hex2Num = Case "7" Hex2Num = Case "8" Hex2Num = Case "9" Hex2Num = Case "A", "a" Hex2Num = 10 Case "B", "b" Hex2Num = 11 Case "C", "c" Hex2Num = 12 Case "D", "d" 105 Hex2Num = 13 Case "E", "e" Hex2Num = 14 Case "F", "f" Hex2Num = 15 End Select End Function Private Function Hex2Byte(Byte_Val As String) As Byte Dim tmpstr1 As String Dim tmpstr2 As String tmpstr1 = Mid$(Byte_Val, 1, 1) tmpstr2 = Mid$(Byte_Val, 2, 1) Hex2Byte = Hex2Num(tmpstr1) * 16 + Hex2Num(tmpstr2) End Function Private Function Byte2Hex(number As Byte) As String If (number < 16) Then Byte2Hex = "0" + Hex(number) Else Byte2Hex = Hex(number) End If End Function Private Sub Key_Expansion(wk_in As Variant) 'input key wk_in(3,3) 'expanded key: key_buff(43) Dim i As Integer Dim j As Integer Dim k As Integer Dim temp As String Dim tmp1 As Byte Dim tmpRcon As String tmpRcon = Rcon(1) For i = To For j = To tmp1 = wk_in(j, i) key_buff(i) = key_buff(i) + Byte2Hex(tmp1) Next j Next i For i = To 43 temp = key_buff(i - 1) If (i Mod 4) = Then temp1 = (SubWord(RotWord(temp))) temp = StrXor(SubWord(RotWord(temp)), Rcon(i \ 4)) tmpRcon = Rcon(i \ 4) k=0 End If key_buff(i) = StrXor(key_buff(i - 4), temp) 106 Next i End Sub Private Function RotWord(w1 As String) As String 'input word: [a0,a1,a2,a3] 'output word: [a1,a2,a3,a0] Dim sub_byte(3) As String For i = To sub_byte(i) = Mid$(w1, * i + 1, 2) Next i RotWord = sub_byte(1) + sub_byte(2) + sub_byte(3) + sub_byte(0) End Function Private Function SubWord(w1 As String) As String 'input word: [a0,a1,a2,a3] 'output word: [b1,b2,b3,b0]=[sbox(a0),sbox(a1),sbox(a2),sbox(a3)] Dim sub_byte(3) As String For i = To sub_byte(i) = Byte2Hex(sbox(Hex2Byte(Mid$(w1, * i + 1, 2)))) Next i SubWord = sub_byte(0) + sub_byte(1) + sub_byte(2) + sub_byte(3) End Function Private Sub AddRoundKey(input_txt As Variant, state_word As Variant, nr As Byte) Dim tmp(3) As String tmp(0) = input_txt(0) tmp(1) = input_txt(1) tmp(2) = input_txt(2) tmp(3) = input_txt(3) state_word(0) = StrXor(tmp(0), key_buff(4 * nr)) state_word(1) = StrXor(tmp(1), key_buff(4 * nr + 1)) state_word(2) = StrXor(tmp(2), key_buff(4 * nr + 2)) state_word(3) = StrXor(tmp(3), key_buff(4 * nr + 3)) End Sub Private Sub Inv_Shift_Rows(w_in As Variant, w_out As Variant) Dim tmp As String Dim sub_byte0(3, 3) As String Dim sub_byte1(3, 3) As String 'word col tmp = w_in(0) For i = To sub_byte0(i, 0) = Mid$(tmp, * i + 1, 2) Next i 'word col 107 tmp = w_in(1) For i = To sub_byte0(i, 1) = Mid$(tmp, * i + 1, 2) Next i 'word col tmp = w_in(2) For i = To sub_byte0(i, 2) = Mid$(tmp, * i + 1, 2) Next i 'word col tmp = w_in(3) For i = To sub_byte0(i, 3) = Mid$(tmp, * i + 1, 2) Next i 'Inv Shift Row sub_byte1(0, 0) = sub_byte0(0, 0) sub_byte1(0, 1) = sub_byte0(0, 1) sub_byte1(0, 2) = sub_byte0(0, 2) sub_byte1(0, 3) = sub_byte0(0, 3) sub_byte1(1, 0) = sub_byte0(1, 3) sub_byte1(1, 1) = sub_byte0(1, 0) sub_byte1(1, 2) = sub_byte0(1, 1) sub_byte1(1, 3) = sub_byte0(1, 2) sub_byte1(2, 0) = sub_byte0(2, 2) sub_byte1(2, 1) = sub_byte0(2, 3) sub_byte1(2, 2) = sub_byte0(2, 0) sub_byte1(2, 3) = sub_byte0(2, 1) sub_byte1(3, 0) = sub_byte0(3, 1) sub_byte1(3, 1) = sub_byte0(3, 2) sub_byte1(3, 2) = sub_byte0(3, 3) sub_byte1(3, 3) = sub_byte0(3, 0) w_out(0) = sub_byte1(0, 0) + sub_byte1(1, 0) + sub_byte1(2, 0) + sub_byte1(3, 0) w_out(1) = sub_byte1(0, 1) + sub_byte1(1, 1) + sub_byte1(2, 1) + sub_byte1(3, 1) w_out(2) = sub_byte1(0, 2) + sub_byte1(1, 2) + sub_byte1(2, 2) + sub_byte1(3, 2) w_out(3) = sub_byte1(0, 3) + sub_byte1(1, 3) + sub_byte1(2, 3) + sub_byte1(3, 3) End Sub Private Sub Shift_Rows(w_in As Variant, w_out As Variant) Dim tmp As String Dim sub_byte0(3, 3) As String Dim sub_byte1(3, 3) As String 108 'word col tmp = w_in(0) For i = To sub_byte0(i, 0) = Mid$(tmp, * i + 1, 2) Next i 'word col tmp = w_in(1) For i = To sub_byte0(i, 1) = Mid$(tmp, * i + 1, 2) Next i 'word col tmp = w_in(2) For i = To sub_byte0(i, 2) = Mid$(tmp, * i + 1, 2) Next i 'word col tmp = w_in(3) For i = To sub_byte0(i, 3) = Mid$(tmp, * i + 1, 2) Next i 'shift row sub_byte1(0, 0) = sub_byte0(0, 0) sub_byte1(0, 1) = sub_byte0(0, 1) sub_byte1(0, 2) = sub_byte0(0, 2) sub_byte1(0, 3) = sub_byte0(0, 3) sub_byte1(1, 0) = sub_byte0(1, 1) sub_byte1(1, 1) = sub_byte0(1, 2) sub_byte1(1, 2) = sub_byte0(1, 3) sub_byte1(1, 3) = sub_byte0(1, 0) sub_byte1(2, 0) = sub_byte0(2, 2) sub_byte1(2, 1) = sub_byte0(2, 3) sub_byte1(2, 2) = sub_byte0(2, 0) sub_byte1(2, 3) = sub_byte0(2, 1) sub_byte1(3, 0) = sub_byte0(3, 3) sub_byte1(3, 1) = sub_byte0(3, 0) sub_byte1(3, 2) = sub_byte0(3, 1) sub_byte1(3, 3) = sub_byte0(3, 2) w_out(0) = sub_byte1(0, 0) + sub_byte1(1, 0) + sub_byte1(2, 0) + sub_byte1(3, 0) w_out(1) = sub_byte1(0, 1) + sub_byte1(1, 1) + sub_byte1(2, 1) + sub_byte1(3, 1) w_out(2) = sub_byte1(0, 2) + sub_byte1(1, 2) + sub_byte1(2, 2) + sub_byte1(3, 2) w_out(3) = sub_byte1(0, 3) + sub_byte1(1, 3) + sub_byte1(2, 3) + sub_byte1(3, 3) 109 End Sub Private Sub InvSubBytes(w_in As Variant, w_out As Variant) Dim tmp As String Dim sub_byte(3) As String Dim tmp1 As String 'word tmp1 = "" tmp = w_in(0) For i = To sub_byte(i) = Mid$(tmp, * i + 1, 2) tmp1 = tmp1 + Byte2Hex(inv_sbox(Hex2Byte(sub_byte(i)))) Next i w_out(0) = tmp1 'word tmp1 = "" tmp = w_in(1) For i = To sub_byte(i) = Mid$(tmp, * i + 1, 2) tmp1 = tmp1 + Byte2Hex(inv_sbox(Hex2Byte(sub_byte(i)))) Next i w_out(1) = tmp1 'word tmp1 = "" tmp = w_in(2) For i = To sub_byte(i) = Mid$(tmp, * i + 1, 2) tmp1 = tmp1 + Byte2Hex(inv_sbox(Hex2Byte(sub_byte(i)))) Next i w_out(2) = tmp1 'word tmp1 = "" tmp = w_in(3) For i = To sub_byte(i) = Mid$(tmp, * i + 1, 2) tmp1 = tmp1 + Byte2Hex(inv_sbox(Hex2Byte(sub_byte(i)))) Next i w_out(3) = tmp1 End Sub Private Sub SubBytes(w_in As Variant, w_out As Variant) Dim tmp As String Dim sub_byte(3) As String 110 Dim tmp1 As String 'word tmp1 = "" tmp = w_in(0) For i = To sub_byte(i) = Mid$(tmp, * i + 1, 2) tmp1 = tmp1 + Byte2Hex(sbox(Hex2Byte(sub_byte(i)))) Next i w_out(0) = tmp1 'word tmp1 = "" tmp = w_in(1) For i = To sub_byte(i) = Mid$(tmp, * i + 1, 2) tmp1 = tmp1 + Byte2Hex(sbox(Hex2Byte(sub_byte(i)))) Next i w_out(1) = tmp1 'word tmp1 = "" tmp = w_in(2) For i = To sub_byte(i) = Mid$(tmp, * i + 1, 2) tmp1 = tmp1 + Byte2Hex(sbox(Hex2Byte(sub_byte(i)))) Next i w_out(2) = tmp1 'word tmp1 = "" tmp = w_in(3) For i = To sub_byte(i) = Mid$(tmp, * i + 1, 2) tmp1 = tmp1 + Byte2Hex(sbox(Hex2Byte(sub_byte(i)))) Next i w_out(3) = tmp1 End Sub Private Sub InvMixColumns(w_in As Variant, w_out As Variant) 'inv_mix_col[31:24]=pmul_e(s0)^pmul_b(s1)^pmul_d(s2)^pmul_9(s3); 'inv_mix_col[23:16]=pmul_9(s0)^pmul_e(s1)^pmul_b(s2)^pmul_d(s3); 'inv_mix_col[15:08]=pmul_d(s0)^pmul_9(s1)^pmul_e(s2)^pmul_b(s3); 'inv_mix_col[07:00]=pmul_b(s0)^pmul_d(s1)^pmul_9(s2)^pmul_e(s3); Dim inv_mix_col(3) As Byte Dim sub_byte(3) As Byte Dim tmp As String 111 'word0 tmp = w_in(0) For i = To sub_byte(i) = Hex2Byte(Mid$(tmp, * i + 1, 2)) Next i inv_mix_col(0) = pmul_e(sub_byte(0)) Xor pmul_b(sub_byte(1)) Xor pmul_d(sub_byte(2)) Xor pmul_9(sub_byte(3)) inv_mix_col(1) = pmul_9(sub_byte(0)) Xor pmul_e(sub_byte(1)) Xor pmul_b(sub_byte(2)) Xor pmul_d(sub_byte(3)) inv_mix_col(2) = pmul_d(sub_byte(0)) Xor pmul_9(sub_byte(1)) Xor pmul_e(sub_byte(2)) Xor pmul_b(sub_byte(3)) inv_mix_col(3) = pmul_b(sub_byte(0)) Xor pmul_d(sub_byte(1)) Xor pmul_9(sub_byte(2)) Xor pmul_e(sub_byte(3)) w_out(0) = Byte2Hex(inv_mix_col(0)) + Byte2Hex(inv_mix_col(1)) + Byte2Hex(inv_mix_col(2)) + Byte2Hex(inv_mix_col(3)) 'word1 tmp = w_in(1) For i = To sub_byte(i) = Hex2Byte(Mid$(tmp, * i + 1, 2)) Next i inv_mix_col(0) = pmul_e(sub_byte(0)) Xor pmul_b(sub_byte(1)) Xor pmul_d(sub_byte(2)) Xor pmul_9(sub_byte(3)) inv_mix_col(1) = pmul_9(sub_byte(0)) Xor pmul_e(sub_byte(1)) Xor pmul_b(sub_byte(2)) Xor pmul_d(sub_byte(3)) inv_mix_col(2) = pmul_d(sub_byte(0)) Xor pmul_9(sub_byte(1)) Xor pmul_e(sub_byte(2)) Xor pmul_b(sub_byte(3)) inv_mix_col(3) = pmul_b(sub_byte(0)) Xor pmul_d(sub_byte(1)) Xor pmul_9(sub_byte(2)) Xor pmul_e(sub_byte(3)) w_out(1) = Byte2Hex(inv_mix_col(0)) + Byte2Hex(inv_mix_col(1)) + Byte2Hex(inv_mix_col(2)) + Byte2Hex(inv_mix_col(3)) 'word2 tmp = w_in(2) For i = To sub_byte(i) = Hex2Byte(Mid$(tmp, * i + 1, 2)) Next i inv_mix_col(0) = pmul_e(sub_byte(0)) Xor pmul_b(sub_byte(1)) Xor pmul_d(sub_byte(2)) Xor pmul_9(sub_byte(3)) inv_mix_col(1) = pmul_9(sub_byte(0)) Xor pmul_e(sub_byte(1)) Xor pmul_b(sub_byte(2)) Xor pmul_d(sub_byte(3)) inv_mix_col(2) = pmul_d(sub_byte(0)) Xor pmul_9(sub_byte(1)) Xor pmul_e(sub_byte(2)) Xor pmul_b(sub_byte(3)) inv_mix_col(3) = pmul_b(sub_byte(0)) Xor pmul_d(sub_byte(1)) Xor pmul_9(sub_byte(2)) Xor pmul_e(sub_byte(3)) w_out(2) = Byte2Hex(inv_mix_col(0)) + Byte2Hex(inv_mix_col(1)) + Byte2Hex(inv_mix_col(2)) + Byte2Hex(inv_mix_col(3)) 'word3 tmp = w_in(3) For i = To sub_byte(i) = Hex2Byte(Mid$(tmp, * i + 1, 2)) 112 Next i inv_mix_col(0) = pmul_e(sub_byte(0)) Xor pmul_b(sub_byte(1)) pmul_d(sub_byte(2)) Xor pmul_9(sub_byte(3)) inv_mix_col(1) = pmul_9(sub_byte(0)) Xor pmul_e(sub_byte(1)) pmul_b(sub_byte(2)) Xor pmul_d(sub_byte(3)) inv_mix_col(2) = pmul_d(sub_byte(0)) Xor pmul_9(sub_byte(1)) pmul_e(sub_byte(2)) Xor pmul_b(sub_byte(3)) inv_mix_col(3) = pmul_b(sub_byte(0)) Xor pmul_d(sub_byte(1)) pmul_9(sub_byte(2)) Xor pmul_e(sub_byte(3)) w_out(3) = Byte2Hex(inv_mix_col(0)) + Byte2Hex(inv_mix_col(1)) Byte2Hex(inv_mix_col(2)) + Byte2Hex(inv_mix_col(3)) Xor Xor Xor Xor + End Sub Private Sub MixColumns(w_in As Variant, w_out As Variant) 'mix_col[31:24]=xtime(s0)^xtime(s1)^s1^s2^s3; 'mix_col[23:16]=s0^xtime(s1)^xtime(s2)^s2^s3; 'mix_col[15:08]=s0^s1^xtime(s2)^xtime(s3)^s3; 'mix_col[07:00]=xtime(s0)^s0^s1^s2^xtime(s3); Dim mix_col(3) As Byte Dim sub_byte(3) As Byte Dim tmp As String 'word0 tmp = w_in(0) For i = To sub_byte(i) = Hex2Byte(Mid$(tmp, * i + 1, 2)) Next i mix_col(0) = xtime(sub_byte(0)) Xor xtime(sub_byte(1)) Xor sub_byte(1) Xor sub_byte(2) Xor sub_byte(3) mix_col(1) = sub_byte(0) Xor xtime(sub_byte(1)) Xor xtime(sub_byte(2)) Xor sub_byte(2) Xor sub_byte(3) mix_col(2) = sub_byte(0) Xor sub_byte(1) Xor xtime(sub_byte(2)) Xor xtime(sub_byte(3)) Xor sub_byte(3) mix_col(3) = xtime(sub_byte(0)) Xor sub_byte(0) Xor sub_byte(1) Xor sub_byte(2) Xor xtime(sub_byte(3)) w_out(0) = Byte2Hex(mix_col(0)) + Byte2Hex(mix_col(1)) + Byte2Hex(mix_col(2)) + Byte2Hex(mix_col(3)) 'word1 tmp = w_in(1) For i = To sub_byte(i) = Hex2Byte(Mid$(tmp, * i + 1, 2)) Next i mix_col(0) = xtime(sub_byte(0)) Xor xtime(sub_byte(1)) Xor sub_byte(1) Xor sub_byte(2) Xor sub_byte(3) mix_col(1) = sub_byte(0) Xor xtime(sub_byte(1)) Xor xtime(sub_byte(2)) Xor sub_byte(2) Xor sub_byte(3) mix_col(2) = sub_byte(0) Xor sub_byte(1) Xor xtime(sub_byte(2)) Xor xtime(sub_byte(3)) Xor sub_byte(3) 113 mix_col(3) = xtime(sub_byte(0)) Xor sub_byte(0) Xor sub_byte(1) Xor sub_byte(2) Xor xtime(sub_byte(3)) w_out(1) = Byte2Hex(mix_col(0)) + Byte2Hex(mix_col(1)) + Byte2Hex(mix_col(2)) + Byte2Hex(mix_col(3)) 'word2 tmp = w_in(2) For i = To sub_byte(i) = Hex2Byte(Mid$(tmp, * i + 1, 2)) Next i mix_col(0) = xtime(sub_byte(0)) Xor xtime(sub_byte(1)) Xor sub_byte(1) Xor sub_byte(2) Xor sub_byte(3) mix_col(1) = sub_byte(0) Xor xtime(sub_byte(1)) Xor xtime(sub_byte(2)) Xor sub_byte(2) Xor sub_byte(3) mix_col(2) = sub_byte(0) Xor sub_byte(1) Xor xtime(sub_byte(2)) Xor xtime(sub_byte(3)) Xor sub_byte(3) mix_col(3) = xtime(sub_byte(0)) Xor sub_byte(0) Xor sub_byte(1) Xor sub_byte(2) Xor xtime(sub_byte(3)) w_out(2) = Byte2Hex(mix_col(0)) + Byte2Hex(mix_col(1)) + Byte2Hex(mix_col(2)) + Byte2Hex(mix_col(3)) 'word3 tmp = w_in(3) For i = To sub_byte(i) = Hex2Byte(Mid$(tmp, * i + 1, 2)) Next i mix_col(0) = xtime(sub_byte(0)) Xor xtime(sub_byte(1)) Xor sub_byte(1) Xor sub_byte(2) Xor sub_byte(3) mix_col(1) = sub_byte(0) Xor xtime(sub_byte(1)) Xor xtime(sub_byte(2)) Xor sub_byte(2) Xor sub_byte(3) mix_col(2) = sub_byte(0) Xor sub_byte(1) Xor xtime(sub_byte(2)) Xor xtime(sub_byte(3)) Xor sub_byte(3) mix_col(3) = xtime(sub_byte(0)) Xor sub_byte(0) Xor sub_byte(1) Xor sub_byte(2) Xor xtime(sub_byte(3)) w_out(3) = Byte2Hex(mix_col(0)) + Byte2Hex(mix_col(1)) + Byte2Hex(mix_col(2)) + Byte2Hex(mix_col(3)) End Sub Private Function xtime(b As Byte) As Byte Dim tmp As Integer Dim tmp1 As Byte tmp = b * If (tmp < 256) Then xtime = b * Else tmp1 = tmp Mod &H100 xtime = tmp1 Xor &H1B End If End Function 114 Private Function pmul_e(b As Byte) As Byte Dim two As Byte, four As Byte, eight As Byte two = xtime(b) four = xtime(two) eight = xtime(four) pmul_e = eight Xor four Xor two End Function Private Function pmul_9(b As Byte) As Byte Dim two As Byte, four As Byte, eight As Byte two = xtime(b) four = xtime(two) eight = xtime(four) pmul_9 = eight Xor b End Function Private Function pmul_d(b As Byte) As Byte Dim two As Byte, four As Byte, eight As Byte two = xtime(b) four = xtime(two) eight = xtime(four) pmul_d = eight Xor four Xor b End Function Private Function pmul_b(b As Byte) As Byte Dim two As Byte, four As Byte, eight As Byte two = xtime(b) four = xtime(two) eight = xtime(four) pmul_b = eight Xor two Xor b End Function Private Function Rcon(i As Byte) As String Select Case i Case Rcon = "01000000" Case Rcon = "02000000" Case Rcon = "04000000" Case Rcon = "08000000" Case Rcon = "10000000" Case Rcon = "20000000" Case Rcon = "40000000" Case 115 Rcon = "80000000" Case Rcon = "1b000000" Case 10 Rcon = "36000000" Case Else ' default Rcon = "00000000" End Select End Function Private Function StrXor(w1 As String, w2 As String) As String 'input word1:[a0,a1,a2,a3] 'input word2:[b0,b1,b2,b3] 'output word:[c0,c1,c2,c3]=[a0,a1,a2,a3]^[b0,b1,b2,b3] Dim sub_byte1(3) As String Dim sub_byte2(3) As String Dim sub_byte3(3) As String Dim temp1 As String Dim temp2 As String Dim temp3 As String temp1 = w1 temp2 = w2 For i = To sub_byte1(i) = Mid$(temp1, * i + 1, 2) Next i For i = To sub_byte2(i) = Mid$(temp2, * i + 1, 2) Next i For i = To sub_byte3(i) = Byte2Hex(Hex2Byte(sub_byte2(i)) Xor Hex2Byte(sub_byte1(i))) Next i For i = To temp3 = temp3 + sub_byte3(i) Next i StrXor = temp3 End Function ... TripleDES Công nghệ FPGA công nghệ thiết kế vi mạch sử dụng phổ biến nay: có ưu điểm tốc độ, giá thành tiện dụng Các tiêu chí cần đạt thực giải pháp trên: Thực vi mạch thực thuật toán AES (mà hóa... trắng lập trình dễ dàng không tốn Dựa sở đó, tác giả đề xuất giải pháp Thiết kế vi mạch thực thuật toán AES dựa công nghệ FPGA, hai lý sau: Thuật toán bảo mật liệu AES sử dụng rộng rÃi, tương lai... ThuËt to¸n AES 39 T 15T Chương Thiết kế vi mạch thực thuật to¸n AES 52 T 3.1 Thiết kế phần cứng vi mạch AES 52 T T 3.1.1 Đề xuất kiến trúc phần cứng vi m¹ch AES 52 T

Ngày đăng: 28/02/2021, 08:37

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

Tài liệu liên quan