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

正文內(nèi)容

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

2024-12-06 13:06本頁(yè)面

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

  

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