freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

aes算法的實現(xiàn)與分析課程設計word格式-資料下載頁

2024-12-06 13:06本頁面

【導讀】問服務器、高速ATM/以太路由器、移動通信、衛(wèi)星通信、電子金融業(yè)務等的加密算法,并逐漸取代DES在IPSec、SSL和ATM中的加密功能。目前,IEEE草案已經(jīng)定。義了AES加密的兩種不同運行模式,成功解決了無限局域網(wǎng)標準中的諸多安全問題。面的論述,希望能為有意進行這一方面研究和應用的同行提供有益的參考。些理論分析成果,描述了AES算法采用軟件和硬件實現(xiàn)方案。此外,本文章從數(shù)學基。礎(chǔ)的知識上闡明了AES算法的四個步驟。從AES算法抵抗強力攻擊能力,抵抗差分分。擊能力,弱密鑰的分析這幾個方面進行了分析從而說明AES的安全性能。析了密鑰的設計準則和選取。

  

【正文】 21 第三章 AES 的實現(xiàn) 1. 軟件系統(tǒng)概述 AES 不但具有良好的安全性 ,但 而且適合在多種處理器辦軟件編程上方便快捷的實現(xiàn)。本文是基于 32 位操作系統(tǒng)下,用 Visual C++ 軟件開放了一個界面友好的 MFC 平臺。 下面介紹 AES 的典型 軟件實現(xiàn) 的主要 方法和遇到的問題 。 程序界面: 程序功能介紹: 本程序分為兩部分,一部分是字符串加密解密,另一部份是文本加密 解密 。 字符串加密部分,可以選擇密鑰長度:分別為 128 、 19 256 比特,并且可以自己設置密碼。然后只要在待加密的字符串窗口中輸入要加密的字符串,就可以相應的進行加密解密。 22 以密碼長度選 128bits,設置為 1234. 文本加密部分能夠入 *.txt 格式的文本,然后 按 128 比特每組 分組進行加密,再 保存為 *. 文本,以和原來文本區(qū)分 。解密時即需要導入以 *. 為后綴的文本,解密后保存為 *. 文本。如下圖所示: 23 2. AES的 C++實現(xiàn) 對 AES 的 C++實現(xiàn),這里只 做加密過程,解密過程是按相反的順序進行逆變換的加密。 cipher 是加密和解密時使用的算法。首先對出現(xiàn)在代碼中的變量和函數(shù)做一下介紹,如表 3, 4, 5 所示,以便讀程序的過程更加方便。 24 1. 首先聲明一個 Aes 的類 功能描述:以面向?qū)ο蟮姆绞?,建立了一個類對象,包含了 AES 加密過程中要實現(xiàn)各項功能的函數(shù),這樣能夠清晰的看到整個加密程序的結(jié)構(gòu),有利于對程序的模塊化管理。 實現(xiàn)代碼: class Aes { public: ~Aes()。 表 3 變量和函數(shù)( 1) 變量 含義 Nk 用 4 字節(jié)的用戶保密密鑰的長度 bL Nb 用 4 字節(jié)的分組長度 bL Nr 輪數(shù) rL 表 4 變量和函數(shù)( 2) 區(qū) 字節(jié)規(guī)模 含義 CipherKey 4*Nk 保密用戶的密鑰 ExpandedKey 4*Nb*(Nr+1) 接受輪密鑰的 4 字節(jié)字的區(qū) Rcon 4*Nb*(Nr+1)/Nk 作為輪常量的 4 字節(jié)字的區(qū) State 4*Nb 輸入和輸出明文和密文分組的區(qū) RoundKey 4*Nb ExpandedKey 的片斷 表 5 變量和函數(shù)( 3) 函數(shù) 含義 KeyExpansion 產(chǎn)生輪密鑰 Rotbytes 4 字節(jié)字循環(huán)左移 1 字節(jié) SutBytes 通過區(qū)的所有字節(jié)的 S 盒替代 S Round 正常輪 FinalRound 最后輪 ShiftRows ShiftRows 變換 MixColumns MixColumns 變換 AddRoundkey 一個輪密鑰的加法 25 Aes()。 Aes()。 //構(gòu)造函數(shù)用密鑰長度 keySize 和密鑰內(nèi)容 keyBytes 作為參數(shù)。 void Cipher()。 // 加密函數(shù), input 為 16 位為要加密的明文 InvCipher()。 // 解密函數(shù), input 為 16 位要解密的密文 private: int Nb。 int Nk。 int Nr。 unsigned char key[32]。 unsigned char w[16*15]。 SetNbNkNr(int keySize)。 //設置 輪數(shù) AddRoundKey(int round)。 //輪密鑰加 SubBytes()。 //S 盒字節(jié)代換 InvSubBytes()。 //逆 S 盒字節(jié)代換 ShiftRows()。 //行移位 InvShiftRows()。 MixColumns()。 //列混淆 InvMixColumns()。 KeyExpansion()。 //密鑰擴展 unsigned char* SubWord(unsigned char* word)。 //密鑰 S 盒字代換 unsigned char* RotWord(unsigned char* word)。 //密鑰移位 } 2. 成員函數(shù)的實現(xiàn): (1) 迭代分組列數(shù)、密鑰列數(shù)、迭代次數(shù)設置函數(shù) 功能描述:因為 AES 分組長度為 128 bits, Nb 固定為 4。再根據(jù)界面密鑰長度窗口keySize 的選擇,判斷是密鑰是 12 19 256 比特,然后設置密鑰列數(shù) Nk,然后可得到 Nr。( 根據(jù)第 2 章 “輪數(shù)的確定 ”一節(jié)) 實現(xiàn)代碼: Aes::SetNbNkNr(int keySize) { Nb=4。 26 if(keySize==Bits128) { Nk=4。 //4*4 字節(jié), 128 位密鑰, 10 輪加密 Nr=10。 } else if(keySize==Bits192) { Nk=6。 //6*4 字節(jié), 192 位密鑰, 12 輪加密 Nr=12。 } else if(keySize==Bits256) { Nk=8。 //8*4 字節(jié), 256 位密 鑰, 14 輪加密 Nr=14。 } } (2) 構(gòu)造函數(shù) 功能描述:實現(xiàn)了設置密鑰塊數(shù),輪數(shù),并且將設定了密碼,和為密鑰擴展提前做的初始化。 實現(xiàn)代碼: Aes::Aes(int keysize,unsigned char* keyBytes) { SetNbNkNr(keysize)。 //設置密鑰塊數(shù),輪數(shù) memcpy(key,keyBytes,keysize)。 //字符串拷貝函數(shù),把 keyBytes 的keysize 個字符復制到 key 中 KeyExpansion()。 //密鑰擴展,必須提前做的初始化 } (3) 密鑰擴展函數(shù) 功能描述:加密和解密過程分別需要 Nr+1 個子密鑰。所以需要對密鑰進行擴展。 27 實現(xiàn)方式:主密鑰的擴展首先將從界面輸入的子密鑰拷貝,并按一維數(shù)組排成 4*Nk矩陣,然后取 Nk列,進行 RotWord()移位變換,將第一位移到第四位,再進行 SubWord() 字節(jié)代換,最后再和上一個密鑰的第 1 列做模二加法,得到新的子密鑰塊的第 1 列密鑰,然后第 4 列是直接由前一列和上一子密鑰模二加法得到。 實現(xiàn) 代 碼 : Aes::KeyExpansion() { memset(w,0,16*15)。 for(int row=0。rowNk。row++) //拷貝 seed 密鑰 { w[4*row+0] = key[4*row]。 w[4*row+1] = key[4*row+1]。 w[4*row+2] = key[4*row+2]。 w[4*row+3] = key[4*row+3]。 } byte* temp = new byte[4]。 for(row=Nk。row4*(Nr+1)。row++) { temp[0]=w[4*row4]。 //當前列的前一列 temp[1]=w[4*row3]。 temp[2]=w[4*row2]。 temp[3]=w[4*row1]。 if(row%Nk==0) //逢 nk 時,對當前列的前一列作特殊處理 { temp=SubWord(RotWord(temp))。//先移位,再代換,最后和輪常量異或 temp[0] = (byte)( (int)temp[0] ^ (int) AesRcon[4*(row/Nk)+0] )。 temp[1] = (byte)( (int)temp[1] ^ (int) AesRcon[4*(row/Nk)+1] )。 temp[2] = (byte)( (int)temp[2] ^ (int) AesRcon[4*(row/Nk)+2] )。 temp[3] = (byte)( (int)temp[3] ^ (int) AesRcon[4*(row/Nk)+3] )。 } else if ( Nk 6 amp。amp。 (row % Nk == 4) ) //這個還沒有搞清楚 { temp = SubWord(temp)。 } // w[row] = w[rowNk] xor temp w[4*row+0] = (byte) ( (int) w[4*(rowNk)+0] ^ (int)temp[0] )。 w[4*row+1] = (byte) ( (int) w[4*(rowNk)+1] ^ (int)temp[1] )。 w[4*row+2] = (byte) ( (int) w[4*(rowNk)+2] ^ (int)temp[2] )。 w[4*row+3] = (byte) ( (int) w[4*(rowNk)+3] ^ (int)temp[3] )。 } // for loop } 28 (4) 輪密鑰加 功能描述:在每一輪的加密過程實現(xiàn)了將分組的待加密字符串的第一列與一個密鑰字進行按位異或。 實現(xiàn)代碼: Aes::AddRoundKey(int round) { int i,j。 //i 行 j 列 //因為密鑰 w 是一列一列排列的,即 k0 k4 k8 k12 for(j=0。j4。j++) // k1 k5 k9 k13 { // k2 k6 k10k14 for(i=0。i4。i++) // k3 k7 k11k15 { // 所以 i 行 j 列的下標是 4*((round*4)+j)+i 即16*round+4*j+i State[i][j]=(unsigned char)((int)State[i][j]^(int)w[4*((round*4)+j)+i])。 } } } (5) 字節(jié)代換函數(shù) 功能描述:字節(jié)代換是基于 S 盒(見附錄)的非線性轉(zhuǎn)換,它用于將輸入的每一個字節(jié)通過一個簡單的查表操作,將其映射為別一個字節(jié)。映射方法是:把輸入的字節(jié)高4 位作為 S 盒的行值,低 4 位作為列值,然后取出對應行和列的元素作為輸出。 代碼實現(xiàn): Aes::SubBytes() { int i,j。 for(j=0。j4。j++) { for(i=0。i4。i++) { State[i][j]=AesSbox[State[i][j]]。 //因為 16*(State[i][j]4)+State[i][j]amp。0x0f=State[i][j] 29 } } } (6) 行移位函數(shù) 功能描述:實現(xiàn)了行的循環(huán)移位操作,變換方法為:第 0 行不動,第 1 行循環(huán)左移一個字節(jié),第 2 行循環(huán)左移 2 個字節(jié),第 3 行循環(huán)左移 3 個字節(jié)。 代碼實現(xiàn): Aes::ShiftRows() { unsigned char temp[4*4]。 int i,j。 for(j=0。j4。j++) { for(i=0。i4。i++) { temp[4*i+j]=State[i][j]。 } } for(i=1。i4。i++) { for(j=0。j4。j++) { if(i==1)State[i][j]=temp[4*i+(j+1)%4]。 //第二行左移 1 位 else if(i==2)State[i][j]=temp[4*i+(j+2)%4]。 //第三行左移 2 位 else if(i==3)State[i][j]=temp[4*i+(j+3)%4]。 //第四行左移 3 位 } } } (7) 列混合變換函數(shù) 30 功能描述:列混合變換是一個替代操作,將原矩陣中的每個元素都是一行和一列對應元素的乘積之和。在 MixColumns 變換中,乘法和加法都是定義在 GF( 82 )上的。(詳細原理請參考經(jīng) “第二章 節(jié) ”) 實現(xiàn)偽碼: Aes::MixColumns(byte state[4,Nc]) { begin byte t[4] for c=0 step Nc 1 for r=0
點擊復制文檔內(nèi)容
研究報告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1