原創 AES加密類使用方法

2022-05-21 01:46:50 字數 4552 閱讀 3045

很多時候會用到aes加密。下面是加密解密方法:

///

/// aes加密字串

///

/// 待加密的字串

/// 金鑰型別(金鑰位數)aes.keysize

/// 對稱金鑰

/// 加密成功返回加密後的字串,失敗返回源串

public static string encryptaes(string encryptstring, aes.keysize keysize, byte keybytes)

///

/// aes解密字串

///

/// 待解密的字串

/// 解密金鑰,要求為8位,和加密金鑰相同

/// 解密成功返回解密後的字串,失敗返源串

public static string decryptaes(string decryptstring, aes.keysize keysize, byte keybytes)

namespace aeslib

;  // key size, in bits, for construtor

private int nb;         // block size in 32-bit words.  always 4 for aes.  (128 bits).

private int nk;         // key size in 32-bit words.  4, 6, 8.  (128, 192, 256 bits).

private int nr;         // number of rounds. 10, 12, 14.

private byte key;     // the seed key. size will be 4 * keysize from ctor.

private byte[,] sbox;   // substitution box

private byte[,] isbox;  // inverse substitution box

private byte[,] w;      // key schedule array.

private byte[,] rcon;   // round constants.

private byte[,] state;  // state matrix

public aes(keysize keysize, byte keybytes)

// aes constructor

public void cipher(byte input, byte output)  // encipher 16-bit input

addroundkey(0);

for (int round = 1; round <= (nr - 1); ++round)  // main round loop

// main round loop

subbytes();

shiftrows();

addroundkey(nr);

// output = state

for (int i = 0; i < (4 * nb); ++i)

}  // cipher()

public void invcipher(byte input, byte output)  // decipher 16-bit input

addroundkey(nr);

for (int round = nr-1; round >= 1; --round)  // main round loop

// end main round loop for invcipher

invshiftrows();

invsubbytes();

addroundkey(0);

// output = state

for (int i = 0; i < (4 * nb); ++i)

}  // invcipher()

private void setnbnknr(keysize keysize)

else if (keysize == keysize.bits192)

else if (keysize == keysize.bits256)

}  // setnbnknr()

private void buildsbox()

,/*1*/  ,

/*2*/  ,

/*3*/  ,

/*4*/  ,

/*5*/  ,

/*6*/  ,

/*7*/  ,

/*8*/  ,

/*9*/  ,

/*a*/  ,

/*b*/  ,

/*c*/  ,

/*d*/  ,

/*e*/  ,

/*f*/  };

}  // buildsbox()

private void buildinvsbox()

,/*1*/  ,

/*2*/  ,

/*3*/  ,

/*4*/  ,

/*5*/  ,

/*6*/  ,

/*7*/  ,

/*8*/  ,

/*9*/  ,

/*a*/  ,

/*b*/  ,

/*c*/  ,

/*d*/  ,

/*e*/  ,

/*f*/  };

}  // buildinvsbox()

private void buildrcon()

,  ,,,

,,,,

,,};}  // buildrcon()

private void addroundkey(int round)

}}  // addroundkey()

private void subbytes()

}}  // subbytes

private void invsubbytes()

}}  // invsubbytes

private void shiftrows()

}for (int r = 1; r < 4; ++r)  // shift temp into state

}}  // shiftrows()

private void invshiftrows()

}for (int r = 1; r < 4; ++r)  // shift temp into state

}}  // invshiftrows()

private void mixcolumns()

}for (int c = 0; c < 4; ++c)

}  // mixcolumns

private void invmixcolumns()

}for (int c = 0; c < 4; ++c)

}  // invmixcolumns

private static byte gfmultby01(byte b)

private static byte gfmultby02(byte b)

private static byte gfmultby03(byte b)

private static byte gfmultby09(byte b)

private static byte gfmultby0b(byte b)

private static byte gfmultby0d(byte b)

private static byte gfmultby0e(byte b)

private void keyexpansion()

byte temp = new byte[4];

for (int row = nk; row < nb * (nr+1); ++row)

else if ( nk > 6 && (row % nk == 4) ) 

// w[row] = w[row-nk] xor temp

this.w[row,0] = (byte) ( (int)this.w[row-nk,0] ^ (int)temp[0] );

this.w[row,1] = (byte) ( (int)this.w[row-nk,1] ^ (int)temp[1] );

this.w[row,2] = (byte) ( (int)this.w[row-nk,2] ^ (int)temp[2] );

this.w[row,3] = (byte) ( (int)this.w[row-nk,3] ^ (int)temp[3] );

}  // for loop

}  // keyexpansion()

private byte subword(byte word)

private byte rotword(byte word)

public  void dump()

public string dumpkey()

public string dumptwobytwo(byte[,] a)

s += "\n";

}return s;

}}  // class aes

AES加密解密前端使用方法

npm install crypto jsimport cryptojs from crypto js var key cryptojs.enc.latin1.parse 秘鑰 秘鑰 後端提供 var iv cryptojs.enc.latin1.parse 常量 常量 後端提供 export de...

理解AES加密解密的使用方法

很多人對於aes加密並不是很了解,導致互相之間進行加密解密困難。本文用簡單的方式來介紹aes在使用上需要的知識,而不涉及內部演算法。最後給出例子來幫助理解aes加密解密的使用方法。相比於其他加密,aes加密似乎模式很多,包括ecb cbc等等等等,每個模式又包括iv引數和padding引數,並且,不...

理解AES加密解密的使用方法

很多人對於aes加密並不是很了解,導致互相之間進行加密解密困難。本文用簡單的方式來介紹aes在使用上需要的知識,而不涉及內部演算法。最後給出例子來幫助理解aes加密解密的使用方法。相比於其他加密,aes加密似乎模式很多,包括ecb cbc等等等等,每個模式又包括iv引數和padding引數,並且,不...