中南大學(xué)現(xiàn)代密碼學(xué)實驗報告_第1頁
中南大學(xué)現(xiàn)代密碼學(xué)實驗報告_第2頁
中南大學(xué)現(xiàn)代密碼學(xué)實驗報告_第3頁
中南大學(xué)現(xiàn)代密碼學(xué)實驗報告_第4頁
中南大學(xué)現(xiàn)代密碼學(xué)實驗報告_第5頁
已閱讀5頁,還剩37頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、信息安全1302-郁博文-0906130205中南大學(xué)現(xiàn) 代 密 碼 學(xué)實 驗 報 告學(xué)生姓名 郁博文學(xué) 號 0906130205專業(yè)班級 信息安全1302指導(dǎo)教師 段桂華 學(xué) 院 信息科學(xué)與工程學(xué)院 完成時間 2015年5月 AES1 背景 AES,密碼學(xué)中的高級加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES),又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個標(biāo)準(zhǔn)用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。經(jīng)過五年的甄選流程,高級加密標(biāo)準(zhǔn)由美國國家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)于2001年11月26日發(fā)布于FIPS PUB 197,

2、并在2002年5月26日成為有效的標(biāo)準(zhǔn)。2006年,高級加密標(biāo)準(zhǔn)已然成為對稱密鑰加密中最流行的算法之一。AES 有一個固定的128位的塊大小和128,192或256位大小的密鑰大小。Rijndael算法匯聚了安全性、效率高、易實現(xiàn)性和靈活性等優(yōu)點,是一種較DES更好的算法。該算法為比利時密碼學(xué)家Joan Daemen和Vincent Rijmen所設(shè)計,結(jié)合兩位作者的名字,以Rijndael之命名之,投稿高級加密標(biāo)準(zhǔn)的甄選流程。(Rijdael的發(fā)音近于 "Rhine doll"。)AES在軟體及硬件上都能快速地加解密,相對來說較易于實作,且只需要很少的記憶體。作為一個新的

3、加密標(biāo)準(zhǔn),目前正被部署應(yīng)用到更廣大的范圍.1.1 Rijndael密碼的設(shè)計標(biāo)準(zhǔn):抵抗所有已知的攻擊。在多個平臺上速度快,編碼緊湊。設(shè)計簡單。Ø 當(dāng)前的大多數(shù)分組密碼,其輪函數(shù)是Feistel結(jié)構(gòu)。Ø Rijndael沒有這種結(jié)構(gòu)。Ø Rijndael輪函數(shù)是由3個不同的可逆均勻變換1.2 設(shè)計思想n 分組和密鑰長度可變,各自可獨立指定為128、192、256比特。n 狀態(tài)n 算法中間的結(jié)果也需要分組,稱之為狀態(tài),狀態(tài)可以用以字節(jié)為元素的矩陣陣列表示,該陣列有4行,列數(shù)Nb為分組長度除32n 種子密鑰n 以字節(jié)為元素的矩陣陣列描述,陣列為4行,列數(shù)Nk為密鑰長度除

4、322.系統(tǒng)設(shè)計2.1系統(tǒng)主要目標(biāo)基本要求部分:1 在深入理解AES加密/解密算法理論的基礎(chǔ)上,設(shè)計一個AES加密/解密軟件系統(tǒng);2.2功能模塊與系統(tǒng)結(jié)構(gòu)主要功能模塊如下:2.2.1字節(jié)替換SubByte非線性代換是可逆的,由以下兩個變換的合成得到: 首先,將字節(jié)看作GF(28)上的元素,映射到自己的乘法逆元,00映射到自己。 其次,對字節(jié)做如下仿射變換:圖 1 字節(jié)代換示意圖2.2.2行移位ShiftRow將狀態(tài)陣列的各行進(jìn)行循環(huán)移位,移位量與分組長度的關(guān)系0行:不動NbC1C2C3412361238134圖2 行移位示意圖2.2.3 列混合MixColumn圖3 列混合示意圖狀態(tài)陣列的每個

5、列a(x)與一個固定的多項式c(x)進(jìn)行模x4+1乘法后混淆為b(x).記為c(x)是模x4+1可逆的多項式03x3+01x2+01x+02逆d(x)=0Bx3+0Dx2+09x+0E2.2.4 輪密鑰加AddRoundKey圖4 輪密鑰加示意圖密鑰加:輪密鑰與狀態(tài)進(jìn)行逐比特異或。輪密鑰長度等于分組長度Nb。密鑰加運算的逆運算是其自身。2.2.5 逆字節(jié)替換 通過逆S盒的映射變換得到2.2.6逆行移位InvShiftRow圖5 逆行移位示意圖與加密時的行移位區(qū)別在于移位方向相反。2.2.7 逆列混淆圖6 逆列混合示意圖加密與解密系統(tǒng)流程圖如下所示,3.AES算法java實現(xiàn)3.1 代碼見附錄1

6、3.2測試結(jié)果: RC41.背景 RC4加密算法是大名鼎鼎的RSA三人組中的頭號人物Ronald Rivest在1987年設(shè)計的密鑰長度可變的流加密算法簇。之所以稱其為簇,是由于其核心部分的S-box長度可為任意,但一般為256字節(jié)。該算法的速度可以達(dá)到DES加密的10倍左右,且具有很高級別的非線性。RC4起初是用于保護(hù)商業(yè)機(jī)密的。但是在1994年9月,它的算法被發(fā)布在互聯(lián)網(wǎng)上,也就不再有什么商業(yè)機(jī)密了。RC4也被叫做ARC42.系統(tǒng)設(shè)計2.1系統(tǒng)主要目標(biāo)基本要求部分: 分析RC4的實現(xiàn)過程。 用程序設(shè)計語言將算法過程編程實現(xiàn)。 完成字符串?dāng)?shù)據(jù)的加密運算和解密運算2.2功能模塊與系統(tǒng)結(jié)構(gòu)主要功

7、能模塊如下: RC4算法的原理很簡單,包括初始化算法(KSA)和偽隨機(jī)子密碼生成算法(PRGA)兩大部分。 開始輸入明文輸入密鑰初始化S盒并打印i=0;j=0;i=(i+1)%256j=(j+si)%256交換Si,Sj;t=(si+sj)%256k=St;加密明文,并輸出加密后的密文解密,并輸出 結(jié)束3.RC4算法java實現(xiàn)2.1 代碼見附錄22.2測試結(jié)果:問題討論 1. 改變明文或密鑰中的一個比特值可能影響AES值中的多少比特? 答:明文和密鑰在S盒置換時,不同的字節(jié)會替換出不同的結(jié)果。算法過程 中一共進(jìn)行了10輪加密,所以改變一個比特值可能影響AES值中的80比特(8 x 10)。

8、2. 在RC4的密鑰流生成中,改變初始密鑰的一個比特值可能影響輸出中的多少比特? 答:初始密鑰的不同會導(dǎo)致S盒的不同,所以可能影響輸出中的256比特。 3. 分析實驗中在編輯編譯運行等各環(huán)節(jié)中所出現(xiàn)的問題及解決方法。 答:在算法的實現(xiàn)過程中,對于異或等平時很難接觸到的位操作不熟悉導(dǎo)致在輪密鑰加密等過程的實現(xiàn)變得很艱難,并且使用java這種面向?qū)ο蟮母呒壵Z言來處理數(shù)據(jù)從速度上就會慢很多。最難處理的是字符串對的補(bǔ)足長度問題,這個問題在設(shè)計之初并沒有想到過導(dǎo)致最后測試時出現(xiàn)了很多問題,最后通過查閱資料等方式解決了這些問題。SKEY1.SKEY協(xié)議的作用  身份認(rèn)證,是任何網(wǎng)絡(luò)安全方案的一個

9、基礎(chǔ)。如在大部分情況下,需要認(rèn)證的實體是通信的發(fā)送者,即需要確定訪問者的合法性問題。 S/KEY協(xié)議主要是用于身份認(rèn)證。2.SKEY協(xié)議的安全性分析。  S/KEY身份認(rèn)證解決方案,可以有效解決重放攻擊。重放攻擊是指攻擊者通過某種方式在網(wǎng)絡(luò)連接中獲取他人的登陸賬戶與口令,然后利用它多某個網(wǎng)絡(luò)資源的訪問權(quán)限。而現(xiàn)在S/Key協(xié)議分配給訪問者的口令每次都不同,所以,就可以有效解決口令泄漏問題。因此,可以避免重放攻擊。3.SKEY協(xié)議的實現(xiàn)過程。3.1實現(xiàn)過程分析:  為了實現(xiàn)起來簡單明了一些,我采用了一個比較簡單的方式進(jìn)行。要模擬客戶端保存數(shù)據(jù)比較不容易實現(xiàn)

10、,對服務(wù)器生成的hash值,保存在本地文件中,當(dāng)然這個hash的值是動態(tài)的,每次hash都會加上相應(yīng)的登陸次數(shù)(這個hash方式和一般的s/key協(xié)議有些不同),這樣可以動態(tài)的獲取。通過文件讀寫的方式獲得。對于生成的hash值從100到0次訪問的問題也是使用一個文件來儲存,每次驗證完成后,都會把前一次存的數(shù)據(jù)減1然后重新的寫入文件中。 為了模擬登陸過程,我用到了兩個文件client.txt,sever.txt分別模擬客戶端和服務(wù)器端,分別存儲客戶端和服務(wù)器端密鑰3.1實現(xiàn)過程流程圖: 4.SKEY協(xié)議的java實現(xiàn)4.1 Java實現(xiàn) 代碼見附錄三4.2實現(xiàn)結(jié)果: 服務(wù)器端返回true表明認(rèn)證

11、成功附錄1/* * AES字節(jié)數(shù)組加密算法類 * * author DC 2011/11/5 */public class Aes/* 成員變量 */private int Nb;/ 以32位為單位的字長private int Nk;/ 以32位為單位的密鑰長度private int Nr;/ 輪數(shù)private byte key;/ 密鑰private byte Sbox;/ S盒矩陣private byte iSbox;/ s盒逆矩陣private byte w;/ 密鑰調(diào)度表private byte Rcon;/ 輪常數(shù)表private byte State;/ 狀態(tài)矩陣/* * 構(gòu)造方

12、法 * * param keySize * param keyBytes */public Aes(int keySize, byte keyBytes, int Nb)SetNbNkNr(keySize, Nb);this.key = new bytethis.Nk * 4;this.key = keyBytes;BuildSbox();BuildInvSbox();BuildRcon();KeyExpansion();/* 私有方法 */* * 生成Rcon輪常數(shù)矩陣 */private void BuildRcon()/ 0x00,0x01,0x02,0x04,/ 0x08,0x10,0

13、x20,0x40,/ 0x80,0x1b,0x36,0x6c,/ 0xd8,0xab,0x4d,0x9a,/ 0x2f,0x5e,0xbc,0x63,/ 0xc6,0x97,0x35,0x6a,/ 0xd4,0xb3,0x7d,0xfa,/ 0xef,0xc5,0x91,0x39;this.Rcon = new byte1004;Rcon00=0x00;/Rcon10=0x01;for(int i=1;i<100;i+)Rconi0=gfmultby02(Rconi-10);/* * 設(shè)置Nb,Nk,Nr * * param keysize */private void SetNbNkN

14、r(int keysize, int Nb)this.Nb = Nb;switch (keysize)case KEYSIZE.Bit128:this.Nk = 4;this.Nr = 10;break;case KEYSIZE.Bit192:this.Nk = 6;this.Nr = 12;break;case KEYSIZE.Bit256:this.Nk = 8;this.Nr = 14;break;/* * 生成S盒矩陣 */private void BuildSbox()this.Sbox = new byte /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */

15、* 0 */ 0x63, 0x7c, 0x77, 0x7b, (byte) 0xf2, 0x6b, 0x6f,(byte) 0xc5, 0x30, 0x01, 0x67, 0x2b, (byte) 0xfe,(byte) 0xd7, (byte) 0xab, 0x76 ,/* 1 */ (byte) 0xca, (byte) 0x82, (byte) 0xc9, 0x7d,(byte) 0xfa, 0x59, 0x47, (byte) 0xf0, (byte) 0xad,(byte) 0xd4, (byte) 0xa2, (byte) 0xaf, (byte) 0x9c,(byte) 0xa4

16、, 0x72, (byte) 0xc0 ,/* 2 */ (byte) 0xb7, (byte) 0xfd, (byte) 0x93, 0x26, 0x36,0x3f, (byte) 0xf7, (byte) 0xcc, 0x34, (byte) 0xa5,(byte) 0xe5, (byte) 0xf1, 0x71, (byte) 0xd8, 0x31, 0x15 ,/* 3 */ 0x04, (byte) 0xc7, 0x23, (byte) 0xc3, 0x18,(byte) 0x96, 0x05, (byte) 0x9a, 0x07, 0x12,(byte) 0x80, (byte)

17、0xe2, (byte) 0xeb, 0x27,(byte) 0xb2, 0x75 ,/* 4 */ 0x09, (byte) 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a,(byte) 0xa0, 0x52, 0x3b, (byte) 0xd6, (byte) 0xb3,0x29, (byte) 0xe3, 0x2f, (byte) 0x84 ,/* 5 */ 0x53, (byte) 0xd1, 0x00, (byte) 0xed, 0x20,(byte) 0xfc, (byte) 0xb1, 0x5b, 0x6a, (byte) 0xcb,(byte) 0xbe,

18、 0x39, 0x4a, 0x4c, 0x58, (byte) 0xcf ,/* 6 */ (byte) 0xd0, (byte) 0xef, (byte) 0xaa, (byte) 0xfb,0x43, 0x4d, 0x33, (byte) 0x85, 0x45, (byte) 0xf9, 0x02,0x7f, 0x50, 0x3c, (byte) 0x9f, (byte) 0xa8 ,/* 7 */ 0x51, (byte) 0xa3, 0x40, (byte) 0x8f, (byte) 0x92,(byte) 0x9d, 0x38, (byte) 0xf5, (byte) 0xbc,(b

19、yte) 0xb6, (byte) 0xda, 0x21, 0x10, (byte) 0xff,(byte) 0xf3, (byte) 0xd2 ,/* 8 */ (byte) 0xcd, 0x0c, 0x13, (byte) 0xec, 0x5f,(byte) 0x97, 0x44, 0x17, (byte) 0xc4, (byte) 0xa7,0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73 ,/* 9 */ 0x60, (byte) 0x81, 0x4f, (byte) 0xdc, 0x22, 0x2a,(byte) 0x90, (byte) 0x88, 0x46,

20、(byte) 0xee,(byte) 0xb8, 0x14, (byte) 0xde, 0x5e, 0x0b, (byte) 0xdb ,/* a */ (byte) 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,(byte) 0xc2, (byte) 0xd3, (byte) 0xac, 0x62,(byte) 0x91, (byte) 0x95, (byte) 0xe4, 0x79 ,/* b */ (byte) 0xe7, (byte) 0xc8, 0x37, 0x6d, (byte) 0x8d,(byte) 0xd5, 0x4e, (by

21、te) 0xa9, 0x6c, 0x56,(byte) 0xf4, (byte) 0xea, 0x65, 0x7a, (byte) 0xae, 0x08 ,/* c */ (byte) 0xba, 0x78, 0x25, 0x2e, 0x1c, (byte) 0xa6,(byte) 0xb4, (byte) 0xc6, (byte) 0xe8, (byte) 0xdd,0x74, 0x1f, 0x4b, (byte) 0xbd, (byte) 0x8b, (byte) 0x8a ,/* d */ 0x70, 0x3e, (byte) 0xb5, 0x66, 0x48, 0x03,(byte)

22、0xf6, 0x0e, 0x61, 0x35, 0x57, (byte) 0xb9,(byte) 0x86, (byte) 0xc1, 0x1d, (byte) 0x9e ,/* e */ (byte) 0xe1, (byte) 0xf8, (byte) 0x98, 0x11, 0x69,(byte) 0xd9, (byte) 0x8e, (byte) 0x94, (byte) 0x9b,0x1e, (byte) 0x87, (byte) 0xe9, (byte) 0xce, 0x55,0x28, (byte) 0xdf ,/* f */ (byte) 0x8c, (byte) 0xa1, (

23、byte) 0x89, 0x0d,(byte) 0xbf, (byte) 0xe6, 0x42, 0x68, 0x41,(byte) 0x99, 0x2d, 0x0f, (byte) 0xb0, 0x54,(byte) 0xbb, 0x16 ;/* * 生成逆s盒矩陣 */private void BuildInvSbox()/ this.Sbox = new byte ;/ 0x52,0x09,0x6A,0xD5,0x30,0x36,0xA5,0x38,0xBF,0x40,0xA3,0x9E,0x81,0xF3,0xD7,0xFB,/ 0x7C,0xE3,0x39,0x82,0x9B,0x2

24、F,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,/

25、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

26、,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,0

27、x07,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,

28、int x, y;this.iSbox = new byte1616;for (int i = 0; i < 16; i+)/ System.out.println("i="+i);for (int j = 0; j < 16; j+)x = (int) (this.Sboxij >> 4) & 0x0f);y = (int) (this.Sboxij & 0x0f);/ System.out.println("x="+x+" y="+y);this.iSboxxy = (byte) (16 *

29、 i + j);/* * 擴(kuò)展密鑰 */private void KeyExpansion()this.w = new byteNb * (Nr + 1)4;for (int row = 0; row < Nk; +row)this.wrow0 = this.key4 * row;this.wrow1 = this.key4 * row + 1;this.wrow2 = this.key4 * row + 2;this.wrow3 = this.key4 * row + 3;byte temp = new byteNb;for (int row = Nk; row < Nb * (

30、Nr + 1); +row)temp0 = this.wrow - 10;temp1 = this.wrow - 11;temp2 = this.wrow - 12;temp3 = this.wrow - 13;if (row % Nk = 0)temp = SubWord(RotWord(temp);temp0 = (byte) (temp0 this.Rconrow / Nk0);temp1 = (byte) (temp1 this.Rconrow / Nk1);temp2 = (byte) (temp2 this.Rconrow / Nk2);temp3 = (byte) (temp3

31、this.Rconrow / Nk3); else if (Nk > 6 && (row % Nk = 4)temp = SubWord(temp);this.wrow0 = (byte) (this.wrow - Nk0 temp0);this.wrow1 = (byte) (this.wrow - Nk1 temp1);this.wrow2 = (byte) (this.wrow - Nk2 temp2);this.wrow3 = (byte) (this.wrow - Nk3 temp3);/* * SubWord方法 * * param subWord * ret

32、urn */private byte SubWord(byte subWord)for (int c = 0; c < subWord.length; +c)subWordc = this.Sbox(subWordc >> 4) & 0x0f(subWordc & 0x0f);return subWord;/* * RotWord方法 * * param rotWord * return */private byte RotWord(byte rotWord)byte temp = rotWord;byte b = new byte4;for (int i =

33、 0; i < 4; i+)bi = temp(i + 1) % 4;return b;/* * 輪密鑰加 * * param round */private void AddRoundKey(int round)for (int r = 0; r < 4; +r)for (int c = 0; c < Nb; +c)this.Staterc = (byte) (this.Staterc w(round * Nb)+ cr);/* * SubBytes方法 */private void SubBytes()for (int r = 0; r < 4; +r)for (i

34、nt c = 0; c < Nb; +c)this.Staterc = this.Sbox(this.Staterc >> 4) & 0x0f(this.Staterc & 0x0f);/* * InvSubBytes方法 */private void InvSubBytes()for (int r = 0; r < 4; +r)for (int c = 0; c < Nb; +c)this.Staterc = this.iSbox(this.Staterc >> 4) & 0x0f(this.Staterc & 0x0

35、f);/* * 行移位 */private void ShiftRows()byte temp = new byte4Nb;for (int r = 0; r < 4; +r)for (int c = 0; c < Nb; +c)temprc = this.Staterc;for (int r = 1; r < 4; +r)for (int c = 0; c < Nb; +c)this.Staterc = tempr(c + r) % Nb;/ System.out.println();/ for (int r = 0; r < 4; r+)/ / for (in

36、t c = 0; c < 4; c+)/ / System.out.print(Staterc+" ");/ / System.out.println();/ /* * 逆行移位 */private void InvShiftRows()byte temp = new byte4Nb;for (int r = 0; r < 4; +r)for (int c = 0; c < Nb; +c)temprc = this.Staterc;for (int r = 1; r < 4; +r)for (int c = 0; c < Nb; +c)this

37、.Staterc = tempr(c - r + Nb) % Nb;/ System.out.println();/ for (int r = 0; r < 4; +r)/ / for (int c = 0; c < 4; +c)/ / System.out.print(this.Staterc + " ");/ / System.out.println();/ /* * 列混合 */private void MixColumns()byte temp = new byte4Nb;for (int r = 0; r < 4; +r)for (int c =

38、 0; c < Nb; +c)temprc = this.Staterc;for (int c = 0; c < Nb; +c)this.State0c = (byte) (gfmultby02(temp0c) gfmultby03(temp1c) gfmultby01(temp2c) gfmultby01(temp3c);this.State1c = (byte) (gfmultby01(temp0c) gfmultby02(temp1c) gfmultby03(temp2c) gfmultby01(temp3c);this.State2c = (byte) (gfmultby0

39、1(temp0c) (gfmultby01(temp1c) gfmultby02(temp2c) gfmultby03(temp3c);this.State3c = (byte) (gfmultby03(temp0c) gfmultby01(temp1c) (gfmultby01(temp2c) gfmultby02(temp3c);/* * 逆列混合 */private void InvMixColumns()byte temp = new byte4Nb;for (int r = 0; r < 4; +r)for (int c = 0; c < Nb; +c)temprc =

40、this.Staterc;for (int c = 0; c < Nb; c+)this.State0c = (byte) (gfmultby0e(temp0c) gfmultby0b(temp1c) gfmultby0d(temp2c) gfmultby09(temp3c);this.State1c = (byte) (gfmultby09(temp0c) gfmultby0e(temp1c) gfmultby0b(temp2c) gfmultby0d(temp3c);this.State2c = (byte) (gfmultby0d(temp0c) (gfmultby09(temp1

41、c) gfmultby0e(temp2c) gfmultby0b(temp3c);this.State3c = (byte) (gfmultby0b(temp0c) gfmultby0d(temp1c) (gfmultby09(temp2c) gfmultby0e(temp3c);/ 有限域GF(28)部分變換private byte gfmultby01(byte b)return b;private byte gfmultby02(byte b)/ if (b < 0x80 && b >= 0) / !這里比較大小的時候注意符號位/ return (byte)

42、(b << 1);/ else/ return (byte) (b << 1) (byte) 0x1b);if (b >> 7) & 0x01) = 0) / !這里比較大小的時候注意符號位return (byte) (b << 1);elsereturn (byte) (b << 1) (byte) 0x1b);/ 消除符號位可以用b&0xffprivate byte gfmultby03(byte b)return (byte) (gfmultby02(b) gfmultby01(b);private byte g

43、fmultby09(byte b)return (byte) (gfmultby02(gfmultby02(gfmultby02(b) gfmultby01(b);private byte gfmultby0b(byte b)return (byte) (gfmultby02(gfmultby02(gfmultby02(b) gfmultby02(b) gfmultby01(b);private byte gfmultby0d(byte b)return (byte) (gfmultby02(gfmultby02(gfmultby02(b) gfmultby02(gfmultby02(b) g

44、fmultby01(b);private byte gfmultby0e(byte b)return (byte) (gfmultby02(gfmultby02(gfmultby02(b) gfmultby02(gfmultby02(b) gfmultby02(b);/* 公有方法 */* * 加密過程 * * param input * param output */public void Cipher(byte input, byte output)this.State = new byte4Nb;for (int i = 0; i < (4 * Nb); i+)this.State

45、i / Nbi % Nb = inputi;/ 初始化狀態(tài)矩陣AddRoundKey(0);/ 輪密鑰加for (int round = 1; round < Nr; +round)SubBytes();/ S盒變換ShiftRows();/ 行移位MixColumns();/ 列混合AddRoundKey(round);SubBytes();/ S盒置換ShiftRows();/ 行移位AddRoundKey(Nr);/ 輪密鑰加for (int i = 0; i < (4 * Nb); i+)outputi = this.Statei / Nbi % Nb; System.ou

46、t.println(i%Nb);/ 輸出密文public void Cipher(String input, String output)/* * 解密過程 * * param inputs * param output */public void Invcipher(byte input, byte output)this.State = new byte4Nb;for (int i = 0; i < (4 * Nb); +i)this.Statei / Nbi % Nb = inputi;/ 初始化狀態(tài)矩陣AddRoundKey(Nr);/ 輪密鑰加for (int round =

47、Nr - 1; round > 0; round-)InvShiftRows();/ 逆行移位InvSubBytes();/ 逆S盒置換AddRoundKey(round);/ 輪密鑰加InvMixColumns();/ 逆列混合InvShiftRows();/ 逆行移位InvSubBytes();/ 逆S盒置換AddRoundKey(0);/ 輪密鑰加for (int i = 0; i < (4 * Nb); +i)outputi = this.Statei / Nbi % Nb;/ 輸出結(jié)果/* * 輔助類 處理明文字符輸入字節(jié)數(shù)不匹配等問題 * * author DC * */public class AesCipherAndInvCipherprivate byte key;/ 密鑰private byte pt;/ 明文字節(jié)數(shù)組private byte ct;private int mode;private int Nb = 0;private int dataLength;private int blockSize = 4;/ 分組大小32位,4bytespublic AesCipherAndInvCipher(byte kb)this.key=kb;/* * 加密 * *

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論