當前位置:成語大全網 - 書法字典 - 如何使用Python加密和解密Rijndael

如何使用Python加密和解密Rijndael

Rijndael,高級加密標準(AES)中使用的基本加密算法。

美國國家標準與技術研究所(NIST)選擇Rijndael作為美國政府加密標準(AES)的加密算法,取代了早期的數據加密標準(DES)。由比利時計算機科學家文森特·裏門和瓊·代蒙開發的Rijndael可以使用128位、192位或256位的密鑰長度,這使它比56位DES更健壯和可靠。Rijndael還有壹個非常小的版本(52位),適用於手機、個人數字處理器(PDA)和其他小型設備。

近似發音:Rijn【rain】dael【del】(Ryndale)Rijn在荷蘭語中的發音來自萊茵【萊茵】。

Dael是壹個常見的名字,這個單詞是由兩位科學家的名字拼成的。

瑞金達

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#雜註壹次

# include & lt例外& gt

# include & ltstring.h & gt

使用命名空間std

CRijndael級

{

公共:

enum { ECB=0,CBC=1,CFB = 2 };

私人:

enum { DEFAULT _ BLOCK _ SIZE = 16 };

enum { MAX_BLOCK_SIZE=32,MAX_ROUNDS=14,MAX_KC=8,MAX _ BC = 8 };

靜態整數乘法(整數a,整數b)

{

return(a!= 0 & amp& ampb!= 0) ?sm _ alog【(sm _ log【a & amp;0x ff】+sm _ log【b & amp;0x ff】)% 255】:0;

}

靜態int mul 4(int a,char b【】)

{

如果(a == 0)

返回0;

a = sm _ log【a & amp;0x ff】;

int A0 =(b【0】!= 0) ?sm _ alog【(a+sm _ log【b【0】& amp;0x ff】)% 255】& amp;0x ff:0;

int a 1 =(b【1】!= 0) ?sm _ alog【(a+sm _ log【b【1】& amp;0x ff】)% 255】& amp;0x ff:0;

int a2 =(b【2】!= 0) ?sm _ alog【(a+sm _ log【b【2】& amp;0x ff】)% 255】& amp;0x ff:0;

int a3 =(b【3】!= 0) ?sm _ alog【(a+sm _ log【b【3】& amp;0x ff】)% 255】& amp;0x ff:0;

返回a0 & lt& lt24 | a 1 & lt;& lt16 | a2 & lt;& lt8 | a3

}

公共:

CRijndael();

virtual ~ CRijndael();

void MakeKey(字符常量*鍵,字符常量*鏈,

int key length = DEFAULT _ BLOCK _ SIZE,int BLOCK SIZE = DEFAULT _ BLOCK _ SIZE);

私人:

void Xor(char * buff、char const* chain)

{

if(false = = m _ bKeyInit)

拋出異常(sm _ szerrormsg 1);

for(int I = 0;我& ltm _ blockSizei++)

*(buff++)^= *(chain++);

}

void defencyptblock(char const * in,char * result);

void DefDecryptBlock(char const * in,char * result);

公共:

void encrypt block(char const * in,char * result);

void decrypt block(char const * in,char * result);

void Encrypt(char const * in,char* result,size_t n,int iMode = ECB);

void Decrypt(char const * in,char* result,size_t n,int iMode = ECB);

int GetKeyLength()

{

if(false = = m _ bKeyInit)

拋出異常(sm _ szerrormsg 1);

返回m _ keylength

}

intGetBlockSize()

{

if(false = = m _ bKeyInit)

拋出異常(sm _ szerrormsg 1);

返回m _ blockSize

}

int GetRounds()

{

if(false = = m _ bKeyInit)

拋出異常(sm _ szerrormsg 1);

return m _ iROUNDS

}

void ResetChain()

{

memcpy(m _ chain,m_chain0,m _ block size);

}

公共:

靜態字符常量* sm _ chain0

私人:

static const int sm _ alog【256】;

靜態常數int sm _ log【256】;

靜態const char sm _ S【256】;

靜態常量字符sm _ Si【256】;

靜態常數int sm _ t 1【256】;

靜態約束sm _ T2【256】;

靜態常數int sm _ T3【256】;

靜態約束sm _ T4【256】;

靜態常數int sm _ T5【256】;

靜態常數int sm _ T6【256】;

static const int sm _ T7【256】;

靜態常數int sm _ T8【256】;

靜態常數int sm _ u 1【256】;

靜態常數int sm _ U2【256】;

靜態常數int sm _ U3【256】;

靜態常數int sm _ U4【256】;

靜態const char sm _ rcon【30】;

靜態常量限制sm _ shift【3】【4】【2】;

static char const * sm _ szerrormsg 1;

static char const * sm _ szerrormsg 2;

bool m _ bKeyInit

int m _ Ke【MAX _ ROUNDS+1】【MAX _ BC】;

int m _ Kd【MAX _ ROUNDS+1】【MAX _ BC】;

int m _ keylength

intm _ blockSize

int m _ iROUNDS

char m _ chain 0【MAX _ BLOCK _ SIZE】;

char m _ chain【MAX _ BLOCK _ SIZE】;

int tk【MAX _ KC】;

int a【MAX _ BC】;

int t【MAX _ BC】;

};