ããRijndael,å¨é«çº§å å¯æ åï¼AESï¼ä¸ä½¿ç¨çåºæ¬å¯ç ç®æ³ã ãã
ããæ¦è¿° ããï¼ç¾å½ï¼å½å®¶æ åææ¯ç 究æï¼NISTï¼éæ©Rijndaelä½ä¸ºç¾å½æ¿åºå å¯æ åï¼AESï¼çå å¯ç®æ³ï¼AESå代æ©æçæ°æ®å å¯æ åï¼DESï¼ãRijndaelç±æ¯å©æ¶è®¡ç®æºç§å¦å®¶Vincent RijmenåJoan Daemenå¼åï¼å®å¯ä»¥ä½¿ç¨128ä½ï¼192ä½æè
256ä½çå¯é¥é¿åº¦ï¼ä½¿å¾å®æ¯56ä½çDESæ´å¥å£®å¯é ãRijndaelä¹æä¸ä¸ªé常å°ççæ¬ï¼52ä½ï¼ï¼åéç¨å¨èçªçµè¯ã个人æ°åå¤çå¨ï¼PDAï¼åå
¶ä»çå°è®¾å¤ä¸ã
ããè¿ä¼¼è¯»é³ï¼Rijn [rain] dael [del] (è±æ©æ´å°) ããRijn æ¥æº Rhine [è±èµæ²³]çè·å
°è¯(Dutch)åé³ã
ããdael æ¯å¸¸ç¨ç人å è¿è¯æ¯ä¸¤ä¸ªç§å¦å®¶çååååºä¸æ®µæ¼æçã
ããRijndael.h
ãã//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ãã#pragma once
ãã#include <exception>
ãã#include <string.h>
ããusing namespace std;
ããclass CRijndael
ãã{
ããpublic:
ããenum { ECB=0, CBC=1, CFB=2 };
ããprivate:
ããenum { DEFAULT_BLOCK_SIZE=16 };
ããenum { MAX_BLOCK_SIZE=32, MAX_ROUNDS=14, MAX_KC=8, MAX_BC=8 };
ãã
ããstatic int Mul(int a, int b)
ãã{
ããreturn (a != 0 && b != 0) ? sm_alog[(sm_log[a & 0xFF] + sm_log[b & 0xFF]) % 255] : 0;
ãã}
ããstatic int Mul4(int a, char b[])
ãã{
ããif(a == 0)
ããreturn 0;
ããa = sm_log[a & 0xFF];
ããint a0 = (b[0] != 0) ? sm_alog[(a + sm_log[b[0] & 0xFF]) % 255] & 0xFF : 0;
ããint a1 = (b[1] != 0) ? sm_alog[(a + sm_log[b[1] & 0xFF]) % 255] & 0xFF : 0;
ããint a2 = (b[2] != 0) ? sm_alog[(a + sm_log[b[2] & 0xFF]) % 255] & 0xFF : 0;
ããint a3 = (b[3] != 0) ? sm_alog[(a + sm_log[b[3] & 0xFF]) % 255] & 0xFF : 0;
ããreturn a0 << 24 | a1 << 16 | a2 << 8 | a3;
ãã}
ããpublic:
ããCRijndael();
ããvirtual ~CRijndael();
ãã
ããvoid MakeKey(char const* key, char const* chain,
ããint keylength=DEFAULT_BLOCK_SIZE, int blockSize=DEFAULT_BLOCK_SIZE);
ããprivate:
ããvoid Xor(char* buff, char const* chain)
ãã{
ããif(false==m_bKeyInit)
ããthrow exception(sm_szErrorMsg1);
ããfor(int i=0; i<m_blockSize; i++)
ãã*(buff++) ^= *(chain++);
ãã}
ããvoid DefEncryptBlock(char const* in, char* result);
ããvoid DefDecryptBlock(char const* in, char* result);
ããpublic:
ãã
ããvoid EncryptBlock(char const* in, char* result);
ããvoid DecryptBlock(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)
ããthrow exception(sm_szErrorMsg1);
ããreturn m_keylength;
ãã}
ããint GetBlockSize()
ãã{
ããif(false==m_bKeyInit)
ããthrow exception(sm_szErrorMsg1);
ããreturn m_blockSize;
ãã}
ããint GetRounds()
ãã{
ããif(false==m_bKeyInit)
ããthrow exception(sm_szErrorMsg1);
ããreturn m_iROUNDS;
ãã}
ããvoid ResetChain()
ãã{
ããmemcpy(m_chain, m_chain0, m_blockSize);
ãã}
ããpublic:
ããstatic char const* sm_chain0;
ããprivate:
ããstatic const int sm_alog[256];
ããstatic const int sm_log[256];
ããstatic const char sm_S[256];
ããstatic const char sm_Si[256];
ããstatic const int sm_T1[256];
ããstatic const int sm_T2[256];
ããstatic const int sm_T3[256];
ããstatic const int sm_T4[256];
ããstatic const int sm_T5[256];
ããstatic const int sm_T6[256];
ããstatic const int sm_T7[256];
ããstatic const int sm_T8[256];
ããstatic const int sm_U1[256];
ããstatic const int sm_U2[256];
ããstatic const int sm_U3[256];
ããstatic const int sm_U4[256];
ããstatic const char sm_rcon[30];
ããstatic const int sm_shifts[3][4][2];
ããstatic char const* sm_szErrorMsg1;
ããstatic char const* sm_szErrorMsg2;
ããbool m_bKeyInit;
ããint m_Ke[MAX_ROUNDS+1][MAX_BC];
ããint m_Kd[MAX_ROUNDS+1][MAX_BC];
ããint m_keylength;
ããint m_blockSize;
ããint m_iROUNDS;
ããchar m_chain0[MAX_BLOCK_SIZE];
ããchar m_chain[MAX_BLOCK_SIZE];
ããint tk[MAX_KC];
ããint a[MAX_BC];
ããint t[MAX_BC];
ãã};
温馨提示:答案为网友推荐,仅供参考