久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

通信網絡與信息安全論壇邀請函

時間:2019-05-14 22:11:12下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《通信網絡與信息安全論壇邀請函》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《通信網絡與信息安全論壇邀請函》。

第一篇:通信網絡與信息安全論壇邀請函

第五屆通信網絡和信息安全高層論壇

參會邀請函

尊敬的女士/先生:

在工業和信息化部通信保障局的指導下,由中國通信學會普及與教育工作委員會、人民郵電出版社主辦,北京信通傳媒有限責任公司承辦的“2013通信網絡和信息安全高層論壇”將于2013年4月11日在北京鴻翔大廈舉辦。

論壇將以“協作創新應對安全變革新時代”為主題,針對實名制下的網絡安全、云計算公共服務網絡安全、基于云的第三方災難備份、IDC類應用系統安全防護、電信網絡的安全防護評測和管理、IPv6網絡安全保障體系研究、Web應用安全、移動互聯網的安全和挑戰等議題展開深入研討和交流。

聯系人:

電話:

郵件:

北京信通傳媒有限責任公司

2013年4月6日

第二篇:網絡與信息安全

《網絡與信息安全》復習資料

信息安全特征:完整性、保密性、可用性、不可否認性、可控性。保密學是研究信息系統安全保密的科學。

網絡信息安全體系結構框架:安全控制單元、安全服務層面、協議層次。公鑰密碼:由兩個密碼組成,每個用戶擁有一對選擇密鑰:加密密鑰與解密密鑰。公鑰密碼特點:(1)加密密鑰和解密密鑰在本質上是不同的,即使知道一個密鑰,也不存在可以輕易地推導出另一個密鑰的有效算法。(2)不需要增加分發密鑰的額外信道。公布公鑰空間,不影響公鑰系統的保密性,因為保密的僅是解密密鑰。公鑰密碼系統應具備兩個條件:(1)加密和解密交換必須滿足在計算上是容易的。(2)密碼分析必須滿足在計算機上是困難的。協議:兩個或兩個以上的主體為完成某一特定任務共同發起的某種協約或采取的一系列步驟。協議的特征:(1)至始至終有序進行。(2)協議成立至少要有兩個主體。(3)協議執行要通過實體操作來實現。數字簽名與手寫簽名的區別:(1)簽名實體對象不同。(2)認證方式不同。(3)拷貝形式不同。

簽名算法的三個條件:(1)簽名者事后不能否認自己的簽名。(2)任何其他人都不能偽造簽名,接收者能驗證簽名。(3)當簽名雙方發生爭執時,可由公正的第三方通過驗證辨別真偽。

不可否認數字簽名:沒有簽名者的合作,接收者就無法驗證簽名,某種程度上保護了簽名者的利益,從而可防止復制或散布簽名文件的濫用。

不可否認數字簽名方案由三部分組成:數字簽名算法、驗證協議、否認協議。

散列函數:一種將任意長度的消息壓縮為某一固定長度的消息摘要的函數。消息認證碼:滿足某種安全性質帶有密鑰功能的單向散列函數。身份證明分兩大婁:身份證實、身份識別。信息隱藏:把一個有含義的信息隱藏在另一個載體信息中得到隱密載體的一種新型加密方式。

信息隱藏的兩種主要技術:信息隱秘術、數字水印術。數字水印技術:指用信號處理的方法在數字化的多媒體數據中嵌入隱藏標識的技術。

三種數字水?。海?)穩健的不可見的水印。(2)不穩健的不可見的水印。(3)可見的水印。

數字水印三個特征:(1)穩健性。(2)不可感知性。(3)安全可靠性。

數字水印三個部分:(1)水印生成。(2)水印嵌入。(3)水印提取(檢測)。

密鑰管理的基本原則:(1)脫離密碼設備的密鑰數據應絕對保密。(2)密碼設備內部的密鑰數據絕對不外泄。(3)密鑰使命完成,應徹底銷毀、更換。常用密鑰種類:(1)工作密鑰。(2)會話密鑰。(3)密鑰加密密鑰。(4)主機主密鑰。

公開密鑰分發:(1)廣播式密鑰分發。(2)目錄式密鑰分發。(3)公開密鑰機構分發。(4)公開密鑰證書分發。密鑰保護方法:(1)終端密鑰保護。(2)主機密鑰保護。(3)密鑰分級保護管理。

秘密共享方案:將一個密鑰K分成n個共享密鑰K1、K2……Kn,并秘密分配給n個對象保管。密鑰托管技術:為用戶提供更好的安全通信方式,同時允許授權者為了國家等安全利益,監聽某些通信和解密有關密文。密鑰托管加密體制由三部分組成:用戶安全分量、密鑰托管分量、數據恢復分量。密鑰管理:指對于網絡中信息加密所需要的各種密鑰在產生、分配、注入、存儲、傳送及使用過程中的技術和管理體制。

保密通信的基本要求:保密性、實時性、可用性、可控性。密碼保護技術:密碼校驗、數字簽名、公證消息。通信保密技術:(1)語音保密通信(模擬置亂技術、數字加密技術)。(2)數據保密通信。(3)圖像保密通信(模擬置亂、數字化圖象信號加密)。網絡通信加密的形式:(1)鏈路加密。(2)端-端加密。(3)混合加密。網絡通信訪問基本控制方式:(1)連接訪問控制。(2)網絡數據訪問控制。(3)訪問控制轉發。(4)自主訪問控制與強制訪問控制。接入控制功能:(1)阻止非法用戶進入系統。(2)允許合法用戶進入系統。(3)使合法用戶按其權限進行活動。接入控制策略:(1)最小權限策略。(2)最小泄漏策略。(3)多級安全策略。接入控制技術方法:(1)用戶標識與認證。(2)身份認證特征(口令認證方式、協議驗證身份)。

PGP的五種功能:認證性、機密性、壓縮、Email兼容性、分段與重組。IP層安全功能:鑒別服務、機密性、密鑰管理。

安全套接層SSL提供的安全服務:信息保密、信息完整性、相互認證。

PPDR-A模型五要素:安全策略、安全監測、安全反應、安全防御、安全對抗。操作系統安全訪問控制:測試程序訪問控制、操作系統的訪問權限控制、保護機制的訪問控制、用戶認證訪問控制。

安全操作系統設計四環節:安全模型、安全設計、安全確認、正確實施。安全網絡平臺種類:Windows NT、UNIX、Linux。(Linux兼容性好、源代碼開放、安全透明)。

數據庫安全條件:數據獨立性、數據安全性、數據完整性、數據使用性、備份與恢復。

VPN(虛擬專用網)核心技術:隧道技術、密碼技術、管理技術。

政務網的特點:信息公眾化、信息機關化、信息存儲量大、保密程度高、訪問密級多樣化。

政務網建設的三個安全域:(1)涉密域。(2)非涉密域。(3)公共服務域。

黑客攻擊:指黑客利用系統漏洞和非常規手段,進行非授權的訪問行為和非法運行系統或非法操作數據。

防黑客攻擊幾種防范技術:安全性設計保護、先進的認證技術、掃描檢測審計技術。

常規網絡掃描工具:SATAN掃描工具、Nessus安全掃描器、nmap掃描器、strobe掃描器。網絡監聽工具:NetXRay、Sniffit。防火墻:在網絡安全邊界控制中,用來阻止從外網想進入給定網絡的非法訪問對象的安全設備。包括網絡級包過濾防火墻和應用級代理防火墻。

密罐:用來觀察黑客如何入侵計算機網絡系統的一個軟件“陷阱”,通常稱為誘騙系統。

計算機病毒:指編制或者在計算機程序中插入的破壞計算機功能或者數據,影響計算機使用并且能夠自我復制的一組計算機指令或者程序代碼。病毒檢測方法:比較法、搜索法、辨別法、分析法。

電子商務安全要求:可靠性、真實性、機密性、完整性、有效性、不可抵賴性、可控性。

電子商務安全服務:鑒別服務、訪問控制服務、機密性服務、不可否認服務。電子商務基本密碼協議:密鑰安全協議、認證安全協議、認證的密鑰安全協議。國際通用電子商務安全協議:SSL安全協議、SET安全協議、S-HTTP安全協議、STT安全協議。

電子商務實體要素:持卡人、發卡機構、商家、銀行、支付網關、認證機構。

第三篇:信息安全論壇

2011中國信息安全高峰論壇

舉辦地點:上海華夏賓館

會議報到:2011年10月15日

會議時間:2011年10月15-16日

2011年10月15日13:00-17:00高峰論壇

2011年10月16日9:00-12:00 14:00-17:00高峰論壇

具體演講嘉賓和演講題目于2011年9月20日前公布在展會網站上。

優惠方案

1、非參展企業8000元/場

2、參展企業6000元/場 參會對象:

大型企業中小型企業以及行業的IT及業務決策者

海關稅務系統科教與科研

國內外銀行金融證券部門

公安部門國防部門郵政電信部門

鐵路航空物流

政府部門政企商業網絡系統集成公司

互聯網服務應用軟件服務商網絡服務提供商

軟件設計人員網絡專家技術維護人員

軟件經銷商代理商政府網管人員政府IT信息管理人員等

石油石化電力能源化工

各省市密碼管理辦公室機要保密局檔案管理等部門

第四篇:《信息安全與系統管理》邀請函

《信息安全與系統管理》邀請函

今天信息安全問題正在與各種方式廣泛深刻應影響著我們的商務工作和生活。對信息安全問題關注以成為國際潮流。中國的政府企業正在著手建立起積極防御的信息安全要求的,首先就是技術與人才并重?,F在微軟公司正在以前所未有的關度與深度,集結公司范圍內個部門的力量,通力配合,制定有效的安全措施,幫助 廣大用戶戰勝信息安全威脅,提高商務工作環境性,為大眾獲得最為快捷和優質的信息作出我們的努力,并為您了解微軟最新的信息安全管理念,成為中國信息安全管理的翹楚。

這正是我們向您提供一系列信息安全培訓目的。

在信息安全培訓中,我們將把微軟自身用于解決信息安全問題的有效管理方法和嶄新理念 以形象生動、深入淺出的形式展示給廣大聽眾。

在2010年2月到6月間,微軟安排了全國各地舉辦一系列以 信息安全為主題的培訓。培訓將涵蓋構建信息安全的3工人階段:

第一階段:桌面安全—補丁分發管理解決方案。

第二階段:信息系統架構 安全。

第三階段:信息安全與管理

現在你就可以在合同談判//www.shdnhhhgfrGGF/獲取想關資源信息,作好準備迎接更為安全的網絡工作和安全管理理念。在此,我們誠摯邀請 來參加本次活動,與我們一起分享成功經驗

第五篇:AES-CMAC實驗報告 -信息與通信安全

課程名稱:姓

名:選擇課題:系:專

業:學

號:指導教師:

本科實驗報告

信息與通信安全

C/C++實現加解密算法及其應用(實驗一)

信電系 信息與通信工程

****年**月**日

目錄

1.實驗內容與要求.......................................................................................................................3 2.實驗原理....................................................................................................................................3

2.1 AES原理..........................................................................................................................3

2.1.1 AES總體結構.......................................................................................................3 2.1.2 AES詳細結構.......................................................................................................4 1.1 2.CMAC原理................................................................................................................7

實驗環境...........................................................................................................................9

4. 代碼實現...............................................................................................................................9

4.1字節代替變換.................................................................................................................9 4.2 行移位變換..................................................................................................................11 4.3列混淆變換...................................................................................................................14 4.4 輪密鑰加......................................................................................................................17 4.5 AES的加密與解密的實現............................................................................................22 4.6 CMAC代碼實現............................................................................................................23 5.思考題...................................................................................................................................27 6.心得體會...............................................................................................................................27 附錄(完整程序).....................................................................................................................28

1.實驗內容與要求

(1).復習AES原理。

(2).用C/C++編寫AES算法并調試通過。(3).復習CMAC原理。

(4).在實現AES基礎上,用C/C++編寫CMAC算法并調試通過。(5).回答下列思考題。

? AES解密算法和AES的逆算法之間有什么不同? ? CMAC與HMAC相比,有什么優點?

2.實驗原理

2.1 AES原理 2.1.1 AES總體結構

下圖展示了AES加密過程的總體結構。明文分組長度為128位即16字節密鑰長度可以為16,24或32字節(在本次設計中選擇16字節)。

加密和解密算法是輸入是一個128位的分組。在FIPS PUB 197中,這個分組被描述為4*4的字節方陣。這個分組被復制到state數組,餅子啊加密或解密的各個階段被修改。同樣,密鑰也被描述為字節的方陣,并被擴展為44字的密鑰字序列。

密碼由N輪組成,其中輪數依賴于密鑰長度,16字節密鑰是10輪,前N-1輪由4個不同的變換組成:字節代替,行位移,列混淆,輪密鑰加。最后一輪包含三個變換,而在第一輪的前面有一個起始的單變換(輪密鑰加),可視為第0輪。每一個變換輸入一個活多個4*4的矩陣,并輸出一個4*4的矩陣,最后一輪輸出為密文。同樣,密鑰擴展函數為N+1輪密鑰,它們是互不相同的4*4矩陣。每一個輪密鑰作為每輪的輪密鑰加變換的一種輸入。

2.1.2 AES詳細結構

1)

AES算法未使用Feisel結構,而是在每一輪都使用代替和混淆將整個數據分組作為一個單一的矩陣處理。

2)輸入的密鑰被擴展為44個32位字所組成的數組w[i],每輪由四個不同的字作為該輪的輪密鑰。3)由四個不同的階段組成,包括一個置換和三個代替。字節代替:

用一個S盒完成分組的字節到字節的代替。行位移:

一個簡單的置換。列混淆:

利用GF(2^8)上的算術特性的一個代替。輪密鑰加:

當前分組和擴展秘鑰的一部分進行按位異或。

(一)字節代替變換

如上圖,字節代替變換是一個簡單的查表操作。AES定義了一個S盒,它由16*16個字節組成的矩陣,包含了8位所能表示的256個數的一個置換。State中 的每個字節按照如下的方式映射為一個新的字節,把改字節的搞4位作為行值,低四位作為列值,以這些行列值作為索引從S盒的對應位置取出元素作為輸出。而其逆向操作則是有對應的逆S盒可進行查表。

(二)行移位變換

如上圖,其正向行移位變換中,state的第一行保持不變,把state的第二行循環左移一個字節,state的第三行循環左移兩個字節,state的第四行循環左移四個字節。例如:

逆向行移位變換將state中的后三行執行相反方向的一位操作即可。

(三)列混淆變換

如上圖,列混淆的正向變換是對每列單獨進行操作。每列中的每個字節被映射為一個新值,此值由該列中的4個字通過函數變換得到。這個變換可有下面基于state的矩陣乘法表示:

乘積矩陣中的每個元素軍事一行和一列中對應元素的乘積之和。這里的乘法和假發都是定義在GF(2^n)上的。狀態中單列的列混淆變換可表示為:

其中一個例子如下:

(四)輪密鑰加變換

如上圖,在輪密鑰加變換中,128位的state按位與128位的輪秘鑰XOR。該操作可以視為state的一列中的四個字節與輪秘鑰的一個字進行列間的操作,例如:

(五)AES密鑰擴展

AES密鑰擴展算法的輸入值是一個4個字,輸出值是一個由44個字組成的移位線性數組。

輸入密鑰字節被復制到擴展密鑰數組的前4個字。然后每次用四個字填充擴展密鑰數組余下的部分。在擴展數組中,每一個新增的字w[i]的值依賴于w[i-1]和w[i-4]。在4

個情形中,三個使用了異或。對w數組中下標為4的倍數的的元素采用了更復雜的函數來計算:

(1)字循環的功能時使一個字中的四個字節的循環左移一個字節,即將輸入字[B0,B1,B2,B3]變成為[B1,B2,B3,B0].(2)字代替利用S盒對輸入字中的每個字節進行字節代替。(3)步驟1和步驟2的結果再與輪常量Rcon[j]相異或。

1.1 CMAC原理

基于密碼的消息認證碼(CMAC)對于AES,3DES適用,它使用三個密鑰:一個密鑰長為K,用在密文分組鏈接的每一步,兩個長度為n的密鑰,其中k是密鑰長度,n為密文分組長度。并且兩個n位的密鑰可以從加密密鑰導出,而不是單獨提供。首先,當消息長度是分組長度b的n倍時,我們考慮CMAC的運算情況。對AES,b=128,對于3DES,b=64.這個消息被劃分為n組,(M1,M2…,Mn)。算法使用了k比特的加密密鑰K和n比特的常數K1。對于AES,密鑰長度k為128,192和256比特,對于3DES,密鑰長度為112或168比特。CMAC按如下方式計算:

C1?E(K,M1)C2?E(K,[M2?C1])C3?E(K,[M3?C2])...Cn?E(K,[MN?Cn?1?K1])T?MSBTlen(Cn)其中:

T——消息認證碼,也稱為tag Tlen——T的比特長度

MSBs(X)——比特串X最左邊的s位

如果消息不是密文分組長度的整數倍,則最后分組的右邊(低有效位)填充一個1和若干個0,使得最后的分組長度為b。除了使用一個不同的n比特密鑰K2代替K1外,與前面所述一樣進行CMAC運算。

兩個n比特的密鑰由k比特的加密密鑰按如下方式導出:

L?E(K,0n)K1?L?xK2?L?X2?(L?x)?x其中乘法(·)是在域GF(2^n)內進行,X和X^2是該域的一次和二次多項式。因此X的二元表示為n-2個0,后跟10,X^2的二元表示為n-3個0,后跟100。對于AES,已獲批準的分組長度為X^128 +X^7 +X^2 +X+2.。

當消息長度是分組長度的整數倍:

當消息長度不是分組長度的整數倍:

2.實驗環境

裝有C_Free 的筆記本

4. 代碼實現

首先是實現AES的各個子模塊,在驗證其正確以后,再進行CMAC的認證算法的實現。

4.1字節代替變換

#include

static unsigned char Sbox[256] =

{ //AES的S盒

0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 };

static unsigned char InvSbox[256] = { // AES的逆S盒

0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d };

//字節代替變換

void Sub_Byte(unsigned char state[4][4]){ int i,j;

for(i=0;i<4;i++)

for(j=0;j<4;j++)

state[i][j]=Sbox[state[i][j]];

} //逆向字節代替

void Inv_Sub_Byte(unsigned char state[4][4]){ int i,j;

for(i=0;i<4;i++)

for(j=0;j<4;j++)

state[i][j]=InvSbox[state[i][j]];

}

int main(){ unsigned char state[4][4]={

{0xea,0x04,0x65,0x85},{0x83,0x45,0x5d,0x96},{0x5c,0x33,0x98,0xb0},{0xf0,0x2d,0xad,0xc5}

};int i,j;//正向替換 Sub_Byte(state);

printf(“正向代替結果:n”);for(i=0;i<4;i++)

{

for(j=0;j<4;j++)

printf(“%x ”,state[i][j]);

printf(“n”);

}

printf(“n”);//反向替換

Inv_Sub_Byte(state);

printf(“反向代替結果:n”);

for(i=0;i<4;i++)

{

for(j=0;j<4;j++)

printf(“%x ”,state[i][j]);

printf(“n”);

}

}

其測試結果如下,可見該功能可實現是正確的。

4.2 行移位變換

#include

//行移位

void Row_Shift(unsigned char state[4][4]){ int i;unsigned char temp;

} //第一行保持不變,第二行左移一位

temp=state[1][0];for(i=0;i<3;i++)state[1][i]=state[1][i+1];state[1][3]=temp;

//第三行左移2位 temp=state[2][0];state[2][0]=state[2][2];state[2][2]=temp;

temp=state[2][1];state[2][1]=state[2][3];state[2][3]=temp;

//第四行左移3位

temp=state[3][3];for(i=3;i>0;i--)state[3][i]=state[3][i-1];state[3][0]=temp;

//逆向行移位

void Inv_Row_Shift(unsigned char state[4][4]){ int i;unsigned char temp;

//第一行保持不變,第二行右移一位

temp=state[1][3];for(i=3;i>0;i--)state[1][i]=state[1][i-1];state[1][0]=temp;

//第三行右移二位 temp=state[2][0];state[2][0]=state[2][2];state[2][2]=temp;

temp=state[2][1];state[2][1]=state[2][3];state[2][3]=temp;

//第四行右移三位 temp=state[3][0];for(i=0;i<3;i++)state[3][i]=state[3][i+1];state[3][3]=temp;}

int main(){ int i,j;unsigned char state[4][4]={

{0x87,0xf2,0x4d,0x97},{0xec,0x6e,0x4c,0x90},{0x4a,0xc3,0x46,0xe7},{0x8c,0xd8,0x95,0xa6}

};

Row_Shift(state);printf(“正向行移位變換:n”);for(i=0;i<4;i++)

{

for(j=0;j<4;j++)

printf(“%02x ”,state[i][j]);

printf(“n”);

}

printf(“n”);

Inv_Row_Shift(state);

printf(“反向向行移位變換:n”);

for(i=0;i<4;i++)

{

for(j=0;j<4;j++)

printf(“%02x ”,state[i][j]);

printf(“n”);

} } 測試結果如下

通過比較,可知結果正確,因此該子模塊實現。

4.3列混淆變換

#include //乘法處理部分

unsigned char x_time2(unsigned char state)//乘2處理

{

unsigned char temp;

if(state>=0x80)

temp=(state<<1)^0x1b;//判斷b7=1?

else

temp=(state<<1);

return temp;}

unsigned char x_time3(unsigned char state)//乘3處理

{

state=state^x_time2(state);

return state;}

unsigned char x_time4(unsigned char state)//乘4處理

{

state=x_time2(x_time2(state));

return state;}

unsigned char x_time8(unsigned char state)//乘8處理14

{

state=x_time2(x_time2(x_time2(state)));

return state;}

unsigned char x_time9(unsigned char state)//乘9處理

{

state=state^x_time8(state);

return state;}

unsigned char x_timeB(unsigned char state)//乘B處理

{

state=state^x_time2(state)^x_time8(state);

return state;}

unsigned char x_timeD(unsigned char state)//乘D處理

{

state=state^x_time4(state)^x_time8(state);

return state;}

unsigned char x_timeE(unsigned char state)//乘E處理

{

state=x_time2(state)^x_time4(state)^x_time8(state);

return state;}

void MixColumns(unsigned char state[4][4]){

int i,j;unsigned char state_1[4][4];

for(i=0;i<4;i++)for(j=0;j<4;j++)

state_1[i][j]=state[i][j];

for(j=0;j<4;j++)

{

state[0][j]=x_time2(state_1[0][j])^x_time3(state_1[1][j])^state_1[2][j]^state_1[3][j];

state[1][j]=state_1[0][j]^x_time2(state_1[1][j])^x_time3(state_1[2][j])^state_1[3][j];

state[2][j]=state_1[0][j]^state_1[1][j]^x_time2(state_1[2][j])^x_time3(state_1[3][j]);

state[3][j]=x_time3(state_1[0][j])^state_1[1][j]^state_1[2][j]^x_time2(state_1[3][j]);} } //逆向列混淆

void Inv_MixColumns(unsigned char state[4][4]){ int i,j;unsigned char state_1[4][4];

for(i=0;i<4;i++)for(j=0;j<4;j++)

state_1[i][j]=state[i][j];

for(j=0;j<4;j++){

state[0][j]=x_timeE(state_1[0][j])^x_timeB(state_1[1][j])^x_timeD(state_1[2][j])^x_time9(state_1[3][j]);

state[1][j]=x_time9(state_1[0][j])^x_timeE(state_1[1][j])^x_timeB(state_1[2][j])^x_timeD(state_1[3][j]);

state[2][j]=x_timeD(state_1[0][j])^x_time9(state_1[1][j])^x_timeE(state_1[2][j])^x_timeB(state_1[3][j]);

state[3][j]=x_timeB(state_1[0][j])^x_timeD(state_1[1][j])^x_time9(state_1[2][j])^x_timeE(state_1[3][j]);} } int main(){ int i,j;unsigned char state[4][4]={

{0x87,0xf2,0x4d,0x97},{0x6e,0x4c,0x90,0xec},{0x46,0xe7,0x4a,0xc3},{0xa6,0x8c,0xd8,0x95}

};

MixColumns(state);

printf(“正向列混淆結果: n”);

for(i=0;i<4;i++)

{

for(j=0;j<4;j++)

printf(“%x ”,state[i][j]);

printf(“n”);

}

printf(“n”);

Inv_MixColumns(state);

printf(“逆向列混淆結果: n”);

for(i=0;i<4;i++)

{

for(j=0;j<4;j++)

printf(“%x ”,state[i][j]);

printf(“n”);

}

} 其測試結果如下:

通過比較,可知結果正確,因此該子模塊實現。

4.4 輪密鑰加

#include static unsigned char key[16];static unsigned char ex_key[176];static unsigned char round_key[11][16];static unsigned char Sbox[256] =

{ //AES的S盒

0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 };

//秘鑰擴展

void key_Expansion(unsigned char key[16]){ int i,j,k;

unsigned char temp[4];//用于寄存w[i-1]

unsigned char t;

unsigned char RC[10]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36};

unsigned char Rcon[10][4]={{0x01,0x0,0x0,0x0},{0x02,0x0,0x0,0x0},{0x04,0x0,0x0,0x0},{0x08,0x0,0x0,0x0},{0x10,0x0,0x0,0x0},{0x20,0x0,0x0,0x0},{0x40,0x0,0x0,0x0},{0x80,0x0,0x0,0x0},{0x1b,0x0,0x0,0x0},{0x36,0x0,0x0,0x0},};

//輪常量

for(i=0;i<16;i++)//將輸入秘鑰復制到擴展秘鑰數組的前四個字

{

ex_key[i]=key[i];

}

for(i=16;i<176;i+=4)//秘鑰擴展

{

for(j=0;j<4;j++)

temp[j]=ex_key[i-4+j];//用于寄存w[i-1]

if(i%16==0)//對于w[i]中下標為的4的倍數要使用函數g來計算

{

//循環左移

t=temp[0];

for(k=0;k<3;k++)

temp[k]=temp[k+1];

temp[3]=t;

//字代替

for(k=0;k<4;k++)

temp[k]=Sbox[temp[k]];

//與輪常量相異或

for(k=0;k<4;k++)

temp[k]=temp[k]^Rcon[i/16-1][k];}

// 得到最后的w[i],w[i]=w[i-1]^w[i-4]

for(k=i;k

ex_key[k]=ex_key[k-16]^temp[k-i];

}

} //第k輪的輪密鑰加

void RoundKey(unsigned char state[4][4],int k){ int i,j;

for(i=0;i<16;i++)round_key[k][i]=ex_key[16*k+i];//第k輪的輪密鑰生成 for(i=0;i<4;i++)

for(j=0;j<4;j++)

state[i][j]=state[i][j]^round_key[k][4*j+i];

}

int main(){

unsigned char key[16]={0x0f,0x15,0x71,0xc9,0x47,0xd9,0xe8,0x59,0x0c,0xb7,0xad,0xd6,0xaf,0x7f,0x67,0x98};unsigned char state[4][4]={

{0xb9,0x94,0x57,0x75},{0xe4,0x8e,0x16,0x51},{0x47,0x20,0x9a,0x3f},{0xc5,0xd6,0xf5,0x3b}

};int i,j;

key_Expansion(key);

for(i=0;i<11;i++)

{

for(j=0;j<16;j++)round_key[i][j]=ex_key[16*i+j];//第k輪的輪密鑰生成}

for(i=0;i<11;i++)

{

printf(“第%d輪密鑰:n”,i);

for(j=0;j<16;j++)

{

printf(“%02x ”,round_key[i][j]);

if((j+1)%4==0)

printf(“n”);

}

printf(“n”);

}

RoundKey(state,1);

printf(“第一輪結束后的state輸出:n”);

for(i=0;i<4;i++)

{

for(j=0;j<4;j++)

printf(“%02x ”,state[i][j]);

printf(“n”);

}

return 0;} 擴展密鑰數組如下:

經過比對,可知,密鑰擴展是正確的。我又選取了第一輪的輪密鑰加:

測試結果如下:

經過比對,可知道輪密鑰加的結果是正確的。

4.5 AES的加密與解密的實現

(程序請見附錄)參照書上給的例子: Plaintext[16]={ 0x01,0x23,0x45,0x67, 0x89,0xab,0xcd,0xef, 0xfe.0xdc,0xba,0x98, 0x76,0x54,0x32,0x10 } key[16]={ 0x0f,0x15,0x71,0xc9, 0x47,0xd9,0xe8,0x59, 0x0c,0xb7,0xad,0xd6, 0xaf,0x7f,0x67,0x98 };其理論結果為:

測試結果如下,經過比對可知結果正確。

4.6 CMAC代碼實現

//先用k=128的加密秘鑰key產生兩個n位的秘鑰key_1,key_2 void k1_k2(unsigned char key[16],unsigned char key_1[16],unsigned char key_2[16]){ unsigned char L[16];unsigned char zero_n[16]={0x00};int i;Encryption(zero_n,key,L);//即L=E(K,0^n)

//計算k1=L*x,其中多項式為x^128+x^7+x^2+x+1

if(L[0]>=0x80)

//判斷最高位是否是1,若是,則需要約化,即左移一位后,再異或1000 0111=0x87

{

for(i=0;i<16;i++)

key_1[i]=L[i]<<1;//左移一位

key_1[15]=key_1[15]^0x87;

} else {

for(i=0;i<16;i++)

key_1[i]=L[i]<<1;}

//產生key_2=L*x^2=key_1*x

if(key_1[0]>=0x80){

for(i=0;i<16;i++)

key_2[i]=key_1[i]<<1;//左移一位

key_2[15]=key_2[15]^0x87;

}

} else {

for(i=0;i<16;i++)

key_2[i]=key_1[i]<<1;}

//對消息不是密文分組的整數倍,要在分組最后右邊填充1及若干個0 //*last_text是最后一個不完整分組,length是最后一組的長度,out_text是填充后的輸出

void fill(unsigned char *last_text,int length, unsigned char out_text[16]){ int i;

for(i=0;i<16;i++){

if(i

out_text[i]=last_text[i];

else if(i==length)

out_text[i]=0x80;

else

out_text[i]=0x00;

}

}

void AES_CMAC(unsigned char Mass[],unsigned char key[16],int length, unsigned char mac[]){ int i,j,n,last_l;int flag=0;//用于標記密文分組是否完整

unsigned char M_C1[16]={0x00},M_C2[16], M_C_K[16];//用于存放中間數據

unsigned char key_1[16],key_2[16];//分組密鑰

unsigned char last[16],Cn[16];

n=(length+15)/16;//用于確定分幾組

last_l=length%16;

k1_k2(key,key_1,key_2);

if(last_l==0)

flag=1;//表明是分組長度b=128的整數倍

if(flag==0)

fill(&Mass[16*(n-1)],last_l,last);//對前n-1輪

for(i=0;i

for(j=0;j<16;j++)

M_C2[j]=M_C1[j]^Mass[16*i+j];

Encryption(M_C2,key,M_C1);

}

if(flag==1)

{

for(i=0;i<16;i++)

M_C_K[i]=Mass[16*(n-1)+i]^M_C1[i]^key_1[i];

Encryption(M_C_K,key,Cn);

}

else {

for(i=0;i<16;i++)

M_C_K[i]=last[i]^M_C1[i]^key_2[i];

Encryption(M_C_K,key,Cn);

} for(i=0;i<16;i++)mac[i]=Cn[i];}

int main(){

unsigned char key[16],Mass[64],T[16];

int i,j,length;

printf(“請輸入消息(64byte):n”);//輸入消息

for(i=0;i<64;i++)

scanf(“%x”,&Mass[i]);

printf(“請輸入密鑰: n”);//輸入密鑰

for(i=0;i<16;i++)

scanf(“%x”,&key[i]);

printf(“需要使用的次數repeat=:n”);

scanf(“%d”,&repeat);

for(i=0;i

{

printf(“請輸入不同的密文分組長度length:n”);

scanf(“%d”,&length);

printf(“AES-CMAC輸出結果: n”);AES_CMAC(Mass,key,length,T);for(i=0;i<16;i++)

printf(“%x ”, T[i]);printf(“n”);} } 測試結果如下:

根據查閱的資料,可知測試結果是正確的。且從上述結果可知,對于不同的分組長度,輸出結果相差很大。

5.思考題

1.AES解密算法和AES的逆算法之間有什么不同?

AES解密算法與其逆算法不同點在于解密算法對密文是先進行輪密鑰加(對AES-128而言其擴展密鑰是w[40,43])然后開始第一輪的逆向求解,而逆算法時對加密算法的求逆,即將第十輪的算法倒推回去,所以這里有區別。這是由AES特定結構所決定的。

2.CMAC與HMAC相比,有什么優點?

CMAC使用分組密碼算法,而HMAC使用散列函數。因為HMAC是基于其所應用的hash函數的,若hash函數的結構存在缺陷,則HMAC的安全性就會大大降低。而CMAC的安全性采用的是分組密碼算法,其安全性在于密鑰的長度。CMAC的長度可以通過Tlen的變化而變化,輸出位數更加靈活。

6.心得體會

首先,剛開始由于這方面知識掌握不是很好,在看完書后又查閱了大量資料,包括一些程序。在這樣的一個基礎上,對整個編程的思路有了一些認識,按照書本上的AES加密順序,最先做的就是密鑰擴展和輪密鑰加。這個部分也是難度最大的部分,主要是輸入的都是字節大小的,但密鑰擴展后要求是以字為單位輸出的。剛開始這個方面糾結了很久,最后為了整個程序比較清晰,還是決定全都以字節為單位,經過一定轉換來得到相當于字的效果。

在完成密鑰擴展且測試正確后,就開始按順序設計,字節代替,行移位,列混淆。其中3盒和逆S盒是直接從網上下載的,其他的就是按照書上給的公式和流程圖來完成,還是比較順利的。其解密算法和加密算法也是大同小異的,只是在每個函數中修改一下相應的代碼即可。在加密和解密算法都寫完后,就是寫main函數進行測試,剛開始發現結果總是不對,經過較長時間的查錯,發現還是錯在輪密鑰加中數組轉置引起的問題。

在AES設計萬仇就是設計CMAC。關于這個程序書上涉及的也較少,但算法還是比較簡單的,主要涉及產生兩個子密鑰和對不完整的分組填充。由于書上沒有現有的例子可以參考,因此,我是參照其他同學的例子,進行比較,驗證結果是正確的。

附錄(完整程序)

#include #include #include #include

static unsigned char key[16];//輸入秘鑰

static unsigned char ex_key[176];//擴展密鑰,其中每四個拼成的就是一個字的秘鑰數組

//即w[i]=(ex_key[4*i],ex_key[4*i+1],ex_key[4*i+2],ex_key[4*i+3])static unsigned char round_key[11][16];//輪密鑰

static unsigned char Sbox[256] =

{ //AES的S盒

0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 };

static unsigned char InvSbox[256] = { // AES的逆S盒

0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d };

//乘法處理部分

unsigned char x_time2(unsigned char state)//乘2處理

{

unsigned char temp;

if(state>=0x80)

temp=(state<<1)^0x1b;//判斷b7=1?

else

temp=(state<<1);

return temp;}

unsigned char x_time3(unsigned char state)//乘3處理

{

state=state^x_time2(state);

return state;}

unsigned char x_time4(unsigned char state)//乘4處理

{

state=x_time2(x_time2(state));

return state;}

unsigned char x_time8(unsigned char state)//乘8處理

{

state=x_time2(x_time2(x_time2(state)));

return state;}

unsigned char x_time9(unsigned char state)//乘9處理

{

state=state^x_time8(state);

return state;}

unsigned char x_timeB(unsigned char state)//乘B處理

{

state=state^x_time2(state)^x_time8(state);

return state;}

unsigned char x_timeD(unsigned char state)//乘D處理

{

state=state^x_time4(state)^x_time8(state);

return state;}

unsigned char x_timeE(unsigned char state)//乘E處理

{

state=x_time2(state)^x_time4(state)^x_time8(state);

return state;}

//秘鑰擴展

void key_Expansion(unsigned char key[16]){ int i,j,k;

unsigned char temp[4];//用于寄存w[i-1]

unsigned char t;

unsigned char RC[10]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36};

unsigned char Rcon[10][4]={{0x01,0x0,0x0,0x0},{0x02,0x0,0x0,0x0},{0x04,0x0,0x0,0x0},{0x08,0x0,0x0,0x0},{0x10,0x0,0x0,0x0},{0x20,0x0,0x0,0x0},{0x40,0x0,0x0,0x0},{0x80,0x0,0x0,0x0},{0x1b,0x0,0x0,0x0},{0x36,0x0,0x0,0x0}, };

//輪常量

for(i=0;i<16;i++)//將輸入秘鑰復制到擴展秘鑰數組的前四個字

{

ex_key[i]=key[i];

}

for(i=16;i<176;i+=4)//秘鑰擴展

{

for(j=0;j<4;j++)

temp[j]=ex_key[i-4+j];//用于寄存w[i-1]

if(i%16==0)//對于w[i]中下標為的4的倍數要使用函數g來計算

{

//循環左移

t=temp[0];

for(k=0;k<3;k++)

temp[k]=temp[k+1];

temp[3]=t;

//字代替

for(k=0;k<4;k++)

temp[k]=Sbox[temp[k]];

//與輪常量相異或

for(k=0;k<4;k++)

temp[k]=temp[k]^Rcon[i/16-1][k];}

// 得到最后的w[i],w[i]=w[i-1]^w[i-4]

for(k=i;k

ex_key[k]=ex_key[k-16]^temp[k-i];

}

}

//第k輪的輪密鑰加

void RoundKey(unsigned char state[4][4],int k){ int i,j;

for(i=0;i<16;i++)

round_key[k][i]=ex_key[16*k+i];//第k輪的輪密鑰生成 for(i=0;i<4;i++)

for(j=0;j<4;j++)

state[i][j]=state[i][j]^round_key[k][4*j+i];

}

//字節代替變換

void Sub_Byte(unsigned char state[4][4]){ int i,j;

for(i=0;i<4;i++)

for(j=0;j<4;j++)

state[i][j]=Sbox[state[i][j]];

}

//行移位

void Row_Shift(unsigned char state[4][4]){ int i;unsigned char temp;

//第一行保持不變,第二行左移一位

temp=state[1][0];for(i=0;i<3;i++)state[1][i]=state[1][i+1];state[1][3]=temp;

//第三行左移二位

temp=state[2][0];state[2][0]=state[2][2];state[2][2]=temp;

temp=state[2][1];state[2][1]=state[2][3];state[2][3]=temp;

//第四行左移三位,即右移一位

temp=state[3][3];for(i=3;i>0;i--)state[3][i]=state[3][i-1];

state[3][0]=temp;}

//列混淆變換

void MixColumns(unsigned char state[4][4]){

int i,j;unsigned char state_1[4][4];

for(i=0;i<4;i++)for(j=0;j<4;j++)

state_1[i][j]=state[i][j];

for(j=0;j<4;j++){

state[0][j]=x_time2(state_1[0][j])^x_time3(state_1[1][j])^state_1[2][j]^state_1[3][j];

state[1][j]=state_1[0][j]^x_time2(state_1[1][j])^x_time3(state_1[2][j])^state_1[3][j];

state[2][j]=state_1[0][j]^state_1[1][j]^x_time2(state_1[2][j])^x_time3(state_1[3][j]);

state[3][j]=x_time3(state_1[0][j])^state_1[1][j]^state_1[2][j]^x_time2(state_1[3][j]);} }

//前9輪每輪有4個步驟

void Round_4(unsigned char state[4][4], int k){ Sub_Byte(state);Row_Shift(state);MixColumns(state);RoundKey(state,k);}

//第10輪有3個步驟

void Round_3(unsigned char state[4][4]){ Sub_Byte(state);Row_Shift(state);RoundKey(state,10);}

//加密算法,明文 Plaintext,密文CipherText,密鑰 key

void Encryption(unsigned char Plaintext[16], unsigned char key[16], unsigned CipherText[16])

char

{

int i,j;unsigned char state[4][4];

for(i=0;i<4;i++)

for(j=0;j<4;j++)

state[j][i]=Plaintext[4*i+j];

key_Expansion(key);//密鑰擴展

//初始輪秘鑰加

RoundKey(state,0);//1~10輪

for(i=1;i<10;i++)

Round_4(state,i);

Round_3(state);

//產生密文

for(i=0;i<4;i++)

for(j=0;j<4;j++)

CipherText[4*i+j]=state[j][i];

}

/*////////////////////////////解密////////////////////////////////*/

//逆向行移位

void Inv_Row_Shift(unsigned char state[4][4]){ int i;unsigned char temp;

//第一行保持不變,第二行右移一位

temp=state[1][3];for(i=3;i>0;i--)state[1][i]=state[1][i-1];state[1][0]=temp;

//第三行右移2位

temp=state[2][0];state[2][0]=state[2][2];state[2][2]=temp;

temp=state[2][1];state[2][1]=state[2][3];

} state[2][3]=temp;

//第四行右移三位,即左移1位

temp=state[3][0];for(i=0;i<3;i++)state[3][i]=state[3][i+1];state[3][3]=temp;//逆向字節代替

void Inv_Sub_Byte(unsigned char state[4][4]){ int i,j;

for(i=0;i<4;i++)

for(j=0;j<4;j++)

state[i][j]=InvSbox[state[i][j]];

}

//逆向列混淆

void Inv_MixColumns(unsigned char state[4][4]){ int i,j;unsigned char state_1[4][4];

for(i=0;i<4;i++)for(j=0;j<4;j++)

state_1[i][j]=state[i][j];

for(j=0;j<4;j++){

state[0][j]=x_timeE(state_1[0][j])^x_timeB(state_1[1][j])^x_timeD(state_1[2][j])^x_time9(state_1[3][j]);

state[1][j]=x_time9(state_1[0][j])^x_timeE(state_1[1][j])^x_timeB(state_1[2][j])^x_timeD(state_1[3][j]);

state[2][j]=x_timeD(state_1[0][j])^x_time9(state_1[1][j])^x_timeE(state_1[2][j])^x_timeB(state_1[3][j]);

state[3][j]=x_timeB(state_1[0][j])^x_timeD(state_1[1][j])^x_time9(state_1[2][j])^x_timeE(state_1[3][j]);

} }

//前9輪每輪有4個步驟

void Inv_Round_4(unsigned char state[4][4], int k){

Inv_Row_Shift(state);Inv_Sub_Byte(state);RoundKey(state,k);Inv_MixColumns(state);}

//第10輪有3個步驟

void Inv_Round_3(unsigned char state[4][4]){ Inv_Row_Shift(state);Inv_Sub_Byte(state);RoundKey(state,0);}

//解密算法,明文 Plaintext,密文CipherText,密鑰 key

void Dencryption(unsigned char CipherText[16], unsigned char key[16], unsigned char Plaintext[16]){ int i,j;unsigned char state[4][4];

for(i=0;i<4;i++)

for(j=0;j<4;j++)

state[i][j]=CipherText[4*j+i];

key_Expansion(key);//密鑰擴展

//初始輪密鑰加

RoundKey(state,10);

//1~10輪

for(i=9;i>0;i--)

Inv_Round_4(state,i);Inv_Round_3(state);

//產生明文 for(i=0;i<4;i++)

for(j=0;j<4;j++)

Plaintext[4*i+j]=state[j][i];

}

/*/////////////////////////CMAC////////////////////////////*/ //先用k=128的加密秘鑰key產生兩個n位的秘鑰key_1,key_2 void k1_k2(unsigned char key[16],unsigned char key_1[16],unsigned char key_2[16]){ unsigned char L[16];unsigned char zero_n[16]={0x00};int i;Encryption(zero_n,key,L);//即L=E(K,0^n)

//計算k1=L*x,其中多項式為x^128+x^7+x^2+x+1

if(L[0]>=0x80)

//判斷最高位是否是1,若是,則需要約化,即左移一位后,再異或1000 0111=0x87

{

for(i=0;i<16;i++)

key_1[i]=L[i]<<1;//左移一位

key_1[15]=key_1[15]^0x87;

} else {

for(i=0;i<16;i++)

key_1[i]=L[i]<<1;}

//產生key_2=L*x^2=key_1*x

if(key_1[0]>=0x80){

for(i=0;i<16;i++)

key_2[i]=key_1[i]<<1;//左移一位

key_2[15]=key_2[15]^0x87;

} else {

for(i=0;i<16;i++)

key_2[i]=key_1[i]<<1;}

}

//對消息不是密文分組的整數倍,要在分組最后右邊填充1及若干個0 //*last_text是最后一個不完整分組,length是最后一組的長度,out_text是填充后的輸出

void fill(unsigned char *last_text,int length, unsigned char out_text[16]){ int i;

for(i=0;i<16;i++){

if(i

out_text[i]=last_text[i];

else if(i==length)

out_text[i]=0x80;

else

out_text[i]=0x00;

}

}

void AES_CMAC(unsigned char Mass[],unsigned char key[16],int length, unsigned char mac[]){ int i,j,n,last_l;

int flag=0;//用于標記密文分組是否完整

unsigned char M_C1[16]={0x00},M_C2[16], M_C_K[16];//用于存放中間數據 unsigned char key_1[16],key_2[16];//分組密鑰 unsigned char last[16],Cn[16];

n=(length+15)/16;//用于確定分幾組

last_l=length%16;

k1_k2(key,key_1,key_2);

if(last_l==0)

flag=1;//表明是分組長度b=128的整數倍

if(flag==0)

fill(&Mass[16*(n-1)],last_l,last);//對前n-1輪

for(i=0;i

for(j=0;j<16;j++)

M_C2[j]=M_C1[j]^Mass[16*i+j];

Encryption(M_C2,key,M_C1);

}

if(flag==1)

{

for(i=0;i<16;i++)

M_C_K[i]=Mass[16*(n-1)+i]^M_C1[i]^key_1[i];

Encryption(M_C_K,key,Cn);

}

else {

for(i=0;i<16;i++)

M_C_K[i]=last[i]^M_C1[i]^key_2[i];

Encryption(M_C_K,key,Cn);

} for(i=0;i<16;i++)mac[i]=Cn[i];}

/*///////////////////////////主函數//////////////////////*/ int main(){

unsigned char Plaintext_1[16]={0x00};unsigned char Ciphertext[16]={0x00};unsigned char Plaintext_2[16]={0x00};unsigned char Mass[64],T[16];

int i,j,length,repeat;//輸入明文

printf(“請輸入需要加密的明文 :n”);

for(i=0;i<16;i++)scanf(“%x”,&Plaintext_1[i]);

//輸入密鑰

printf(“請輸入密鑰:n”);for(i=0;i<16;i++)scanf(“%x”,&key[i]);

//加密

Encryption(Plaintext_1,key,Ciphertext);

printf(“加密后的輸出密文:n”);

for(i=0;i<16;i++)

printf(“%02x ”,Ciphertext[i]);

printf(“n”);

//解密

Dencryption(Ciphertext,key,Plaintext_2);

printf(“解密后的輸出明文:n”);

for(i=0;i<16;i++)

printf(“%02x ”,Plaintext_2[i]);

printf(“n”);

//CMAC

printf(“請輸入消息(64byte):n”);//輸入消息

for(i=0;i<64;i++)

{

printf(“%02x ”,Mass[i]);

if((i+1)%8==0)

printf(“n”);

}

printf(“需要使用的次數repeat=:n”);

scanf(“%d”,&repeat);

for(j=0;j

{

printf(“請輸入不同的密文分組長度length:n”);

scanf(“%d”,&length);

printf(“AES-CMAC輸出結果: n”);

AES_CMAC(Mass,key,length,T);

for(i=0;i<16;i++)

printf(“%02x ”, T[i]);

printf(“n”);

}

return 0;}

下載通信網絡與信息安全論壇邀請函word格式文檔
下載通信網絡與信息安全論壇邀請函.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    網絡與信息安全自查報告

    網絡與信息安全自查報告 (參考格式) 一、自查報告名稱 ×××(部門/單位名稱)信息安全自查報告 二、自查報告組成 自查報告包括主報告和檢查情況報告表兩部分。 三、主報告內容......

    網絡與信息安全自查報告

    網絡與信息安全自查報告 接供電局《開展網絡信息安全生產專項檢查》的通知,我公司深刻領會文件精神,積極組織落實,認真對照,對網絡安全基礎設施建設情況,網絡與信息安全防范技術......

    網絡與信息安全實驗報告

    計算機科學與技術學院 網絡與信息安全課程設計 學號: 專業:計算機科學與技術 學生姓名:任課教師:*** 2017年3月 FTP服務器的設計與實現 *** 計算機科學與技術學院,哈爾濱工程大......

    網絡與信息安全自查報告范文大全

    網絡與信息安全自查報告 為了貫徹落實今年6月份出臺的《網絡安全法》,以及省委網信辦關于做好黨的十九大期間吉林省關鍵信息基礎設施安全保障工作的實施方案和省衛計委7月份......

    網絡與信息安全自查報告范文

    根據上級相關通知精神要求,為進一步加強我鎮社網絡與信息安全工作,認真查找我鎮社網絡與信息安全工作中存在的隱患及漏洞,完善安全管理措施,減少安全風險,提高應急處置能力,確保全......

    2011年度網絡與信息安全情況報告

    2011年網絡與信息安全檢查情況的報告 2011年,在省政府辦公廳和省工信廳的指導下,我局進一步加強了網絡信息安全制度建設,不斷強化日常檢查與防護管理,配備健全了網絡信息安全設......

    網絡與信息安全承諾書

    網絡安全維護責任承諾書 為了落實網絡安全維護責任制,積極落實對網絡安全的規范要求,確保“和“”平臺在試運行及運行維護期間,實現網絡安全零事故。公司特此簽訂網絡安全維護......

    網絡與信息安全承諾書

    網絡與信息安全承諾書 為確保本單位信息網絡、重要信息系統和網站安全、可靠、穩定地運行,作為本單位網絡與信息安全工作的主要負責人,對本單位的網絡與信息安全工作負總責,并......

主站蜘蛛池模板: 亚洲精品乱码久久久久久中文字幕| 色哟哟最新在线观看入口| av无码久久久久不卡网站蜜桃| 日韩伦人妻无码| 蜜臀98精品国产免费观看| 亚洲欧美成人精品香蕉网| 熟女少妇丰满一区二区| 国产亚洲欧美精品永久| 亚洲欧美第一成人网站7777| 久久久久夜夜夜精品国产| 全部孕妇毛片丰满孕妇孕交| 成人毛片100免费观看| 久久久久久人妻毛片a片| 成人区人妻精品一区二区三区| 97无码精品综合| 久久精品国产一区二区三区不卡| 久久精品国产国产精| 亚洲中文字幕日本无线码| 国产成人亚洲欧美日韩| 人人玩人人添人人澡欧美| 高清国产一区二区三区在线| 亚洲精品av无码喷奶水糖心| 无码人妻丰满熟妇区毛片18| 国产精品人妻一码二码尿失禁| 最新精品国偷自产在线| av人摸人人人澡人人超碰妓女| 亚洲综合色视频在线观看| 国产精品毛片大码女人| 九一九色国产| 三级在线看中文字幕完整版| 中国精品少妇hd| 伊人久久无码中文字幕| 日韩一区二区三区北条麻妃| 7777久久亚洲中文字幕蜜桃| 国产偷窥盗摄一区二区| 国内精品九九久久精品| 久久免费精品国自产拍网站| 中文字幕日韩一区二区三区不卡| 国产无遮挡裸体免费视频| 老师粉嫩小泬喷水视频90| 国产精品成人久久久久久久|