美國國家標準與技術研究所(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】;
};