天天看點

密碼學-可編譯為動态連結庫(DLL)的AES加密算法-C++實作

目錄

    • 檔案結構
    • dllmain.cpp
    • stdafx.h
    • AES.h
    • stdafx.cpp
    • AES.cpp

檔案結構

|-- dllmain.cpp 動态連結庫的入口

|-- stdafx.h 标準系統包含檔案

|-- AES.h 定義可外部通路的AES加解密接口

|-- stdafx.cpp 标準系統包含檔案的源檔案

|-- AES.cpp AES算法的實作

dllmain.cpp

/**
 * dllmain.cpp
 * 定義 DLL 應用程式的入口點。
 */

#include "AES.h"
#include "stdafx.h"

BOOL APIENTRY DllMain(HMODULE hModule,
                      DWORD   ul_reason_for_call,
                      LPVOID  lpReserved)
{
   switch (ul_reason_for_call) {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
         break;
   }
   return TRUE;
}

           

stdafx.h

/**
 * stdafx.h
 * 标準系統包含檔案的包含檔案,或是經常使用但不常更改的特定于項目的包含檔案
 */

#pragma once

// 如果必須将位于下面指定平台之前的平台作為目标,請修改下列定義。
// 有關不同平台對應值的最新資訊,請參考 MSDN。
#ifndef WINVER				// 允許使用特定于 Windows XP 或更高版本的功能。
#define WINVER 0x0501		// 将此值更改為相應的值,以适用于 Windows 的其他版本。
#endif

#ifndef _WIN32_WINNT		// 允許使用特定于 Windows XP 或更高版本的功能。
#define _WIN32_WINNT 0x0501	// 将此值更改為相應的值,以适用于 Windows 的其他版本。
#endif						

#ifndef _WIN32_WINDOWS		// 允許使用特定于 Windows 98 或更高版本的功能。
#define _WIN32_WINDOWS 0x0410 // 将此值更改為适當的值,以指定将 Windows Me 或更高版本作為目标。
#endif

#ifndef _WIN32_IE			// 允許使用特定于 IE 6.0 或更高版本的功能。
#define _WIN32_IE 0x0600	// 将此值更改為相應的值,以适用于 IE 的其他版本。
#endif

#define WIN32_LEAN_AND_MEAN		// 從 Windows 頭中排除極少使用的資料
// Windows 頭檔案:
#include <windows.h>

// TODO: 在此處引用程式需要的其他頭檔案

           

AES.h

/**
 * AES.H
 */

#if !defined(_AES_H__)
#   define _AES_H__

#   include <windows.h>
#   ifdef BUILD_DLL
#      define DLL_EXPORT __declspec(dllexport)
#   else
#      define DLL_EXPORT __declspec(dllimport)
#   endif


#   ifdef __cplusplus
extern "C" {
#   endif

/**
 * 函數: AES_encrypt(unsigned char* k, unsigned int* data)
 * 功能:使用密鑰k采用AES加密算法加密data中存儲的資料
 * @param: k unsigned char* 指向一塊含有16/24/32個位元組的緩沖區, 加密密鑰
 * @param: k_len int 密鑰長度, 僅支援16/24/32
 * @param: data unsigned int32* 指向一塊4個int的緩沖區, 待加密資料與加密後資料
 */
__declspec(dllexport) void AES_encrypt(unsigned char *k, int k_len, unsigned *data);

/**
 * 函數: AES_decrypt(unsigned char * k,unsigned * data)
 * 功能:使用密鑰k采用AES加密算法解密data中存儲的資料
 * @param: k unsigned char* 指向一塊含有16/24/32個位元組的緩沖區, 解密密鑰
 * @param: k_len int 密鑰長度, 僅支援16/24/32
 * @param: data unsigned int32* 指向一塊4個int的緩沖區, 待解密資料與解密後的資料
 */
__declspec(dllexport) void AES_decrypt(unsigned char *k, int k_len, unsigned *data);

/**
 * 函數: AES_ByteEncrypt(unsigned char *k, unsigned char *data)
 * 功能:使用密鑰k采用AES加密算法加密data中存儲的資料
 * @param: k unsigned char* 指向一塊含有16/24/32個位元組的緩沖區, 加密密鑰
 * @param: k_len int 密鑰長度, 僅支援16/24/32
 * @param: data unsigned char* 指向一塊16個位元組的緩沖區, 待加密資料與加密後資料
 */
__declspec(dllexport) void AES_ByteEncrypt(unsigned char *k, int k_len, unsigned char *data);

/**
 * 函數: AES_ByteDecrypt(unsigned char *k, unsigned char *data)
 * 功能:使用密鑰k采用AES加密算法解密data中存儲的資料
 * @param: k unsigned char* 指向一塊含有16/24/32個位元組的緩沖區, 解密密鑰
 * @param: k_len int 密鑰長度, 僅支援16/24/32
 * @param: data unsigned char* 指向一塊16個位元組的緩沖區, 待解密資料與解密後的資料
 */
__declspec(dllexport) void AES_ByteDecrypt(unsigned char *k, int k_len, unsigned char *data);

#   ifdef __cplusplus
}
#   endif

#endif /* _AES_H__ */

           

stdafx.cpp

/**
 * stdafx.cpp
 * 隻包括标準包含檔案的源檔案
 */

#include "stdafx.h"

/* 在 STDAFX.H 中引用任何所需的附加頭檔案,而不是在此檔案中引用 */

           

AES.cpp

/** 
 * AES.cpp
 */

#include "AES.h"
#include "stdafx.h"
#include <cassert>
#include <string>

using namespace std;

typedef unsigned int word32;
typedef unsigned int uint32;

using namespace std;

#define MAX_NR 14 /* max no of rounds */
#define MAX_NK 8 /* max no of words in input key */
#define MAX_NB 8 /* max no of words in cipher blk */

struct AESContext
{
   word32 keysched[(MAX_NR + 1) * MAX_NB];
   word32 invkeysched[(MAX_NR + 1) * MAX_NB];
   void (*encrypt)(AESContext *ctx, word32 *block);
   void (*decrypt)(AESContext *ctx, word32 *block);
   word32 iv[MAX_NB];
   int    Nb, Nr;
};

#define mulby2(x) (((x & 0x7F) << 1) ^ (x & 0x80 ? 0x1B : 0))

#define GET_32BIT_MSB_FIRST(cp)                     \
   (((unsigned long)(unsigned char)(cp)[3]) |       \
    ((unsigned long)(unsigned char)(cp)[2] << 8) |  \
    ((unsigned long)(unsigned char)(cp)[1] << 16) | \
    ((unsigned long)(unsigned char)(cp)[0] << 24))

#define PUT_32BIT_MSB_FIRST(cp, value) \
   do {                                \
      (cp)[3] = (value);               \
      (cp)[2] = (value) >> 8;          \
      (cp)[1] = (value) >> 16;         \
      (cp)[0] = (value) >> 24;         \
   } while (0)
typedef struct AESContext AESContext;


static const unsigned char Sbox[256] = {
   0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
   0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
   0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
   0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
   0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
   0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
   0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
   0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
   0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
   0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
   0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
   0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
   0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
   0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
   0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
   0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
   0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
   0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
   0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
   0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
   0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
   0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
   0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
   0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
   0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
   0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
   0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
   0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
   0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
   0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
   0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
   0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16};

static const unsigned char Sboxinv[256] = {
   0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38,
   0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
   0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 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,
   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, 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, 0x07, 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};

static const word32 E0[256] = {
   0xc66363a5,
   0xf87c7c84,
   0xee777799,
   0xf67b7b8d,
   0xfff2f20d,
   0xd66b6bbd,
   0xde6f6fb1,
   0x91c5c554,
   0x60303050,
   0x02010103,
   0xce6767a9,
   0x562b2b7d,
   0xe7fefe19,
   0xb5d7d762,
   0x4dababe6,
   0xec76769a,
   0x8fcaca45,
   0x1f82829d,
   0x89c9c940,
   0xfa7d7d87,
   0xeffafa15,
   0xb25959eb,
   0x8e4747c9,
   0xfbf0f00b,
   0x41adadec,
   0xb3d4d467,
   0x5fa2a2fd,
   0x45afafea,
   0x239c9cbf,
   0x53a4a4f7,
   0xe4727296,
   0x9bc0c05b,
   0x75b7b7c2,
   0xe1fdfd1c,
   0x3d9393ae,
   0x4c26266a,
   0x6c36365a,
   0x7e3f3f41,
   0xf5f7f702,
   0x83cccc4f,
   0x6834345c,
   0x51a5a5f4,
   0xd1e5e534,
   0xf9f1f108,
   0xe2717193,
   0xabd8d873,
   0x62313153,
   0x2a15153f,
   0x0804040c,
   0x95c7c752,
   0x46232365,
   0x9dc3c35e,
   0x30181828,
   0x379696a1,
   0x0a05050f,
   0x2f9a9ab5,
   0x0e070709,
   0x24121236,
   0x1b80809b,
   0xdfe2e23d,
   0xcdebeb26,
   0x4e272769,
   0x7fb2b2cd,
   0xea75759f,
   0x1209091b,
   0x1d83839e,
   0x582c2c74,
   0x341a1a2e,
   0x361b1b2d,
   0xdc6e6eb2,
   0xb45a5aee,
   0x5ba0a0fb,
   0xa45252f6,
   0x763b3b4d,
   0xb7d6d661,
   0x7db3b3ce,
   0x5229297b,
   0xdde3e33e,
   0x5e2f2f71,
   0x13848497,
   0xa65353f5,
   0xb9d1d168,
   0x00000000,
   0xc1eded2c,
   0x40202060,
   0xe3fcfc1f,
   0x79b1b1c8,
   0xb65b5bed,
   0xd46a6abe,
   0x8dcbcb46,
   0x67bebed9,
   0x7239394b,
   0x944a4ade,
   0x984c4cd4,
   0xb05858e8,
   0x85cfcf4a,
   0xbbd0d06b,
   0xc5efef2a,
   0x4faaaae5,
   0xedfbfb16,
   0x864343c5,
   0x9a4d4dd7,
   0x66333355,
   0x11858594,
   0x8a4545cf,
   0xe9f9f910,
   0x04020206,
   0xfe7f7f81,
   0xa05050f0,
   0x783c3c44,
   0x259f9fba,
   0x4ba8a8e3,
   0xa25151f3,
   0x5da3a3fe,
   0x804040c0,
   0x058f8f8a,
   0x3f9292ad,
   0x219d9dbc,
   0x70383848,
   0xf1f5f504,
   0x63bcbcdf,
   0x77b6b6c1,
   0xafdada75,
   0x42212163,
   0x20101030,
   0xe5ffff1a,
   0xfdf3f30e,
   0xbfd2d26d,
   0x81cdcd4c,
   0x180c0c14,
   0x26131335,
   0xc3ecec2f,
   0xbe5f5fe1,
   0x359797a2,
   0x884444cc,
   0x2e171739,
   0x93c4c457,
   0x55a7a7f2,
   0xfc7e7e82,
   0x7a3d3d47,
   0xc86464ac,
   0xba5d5de7,
   0x3219192b,
   0xe6737395,
   0xc06060a0,
   0x19818198,
   0x9e4f4fd1,
   0xa3dcdc7f,
   0x44222266,
   0x542a2a7e,
   0x3b9090ab,
   0x0b888883,
   0x8c4646ca,
   0xc7eeee29,
   0x6bb8b8d3,
   0x2814143c,
   0xa7dede79,
   0xbc5e5ee2,
   0x160b0b1d,
   0xaddbdb76,
   0xdbe0e03b,
   0x64323256,
   0x743a3a4e,
   0x140a0a1e,
   0x924949db,
   0x0c06060a,
   0x4824246c,
   0xb85c5ce4,
   0x9fc2c25d,
   0xbdd3d36e,
   0x43acacef,
   0xc46262a6,
   0x399191a8,
   0x319595a4,
   0xd3e4e437,
   0xf279798b,
   0xd5e7e732,
   0x8bc8c843,
   0x6e373759,
   0xda6d6db7,
   0x018d8d8c,
   0xb1d5d564,
   0x9c4e4ed2,
   0x49a9a9e0,
   0xd86c6cb4,
   0xac5656fa,
   0xf3f4f407,
   0xcfeaea25,
   0xca6565af,
   0xf47a7a8e,
   0x47aeaee9,
   0x10080818,
   0x6fbabad5,
   0xf0787888,
   0x4a25256f,
   0x5c2e2e72,
   0x381c1c24,
   0x57a6a6f1,
   0x73b4b4c7,
   0x97c6c651,
   0xcbe8e823,
   0xa1dddd7c,
   0xe874749c,
   0x3e1f1f21,
   0x964b4bdd,
   0x61bdbddc,
   0x0d8b8b86,
   0x0f8a8a85,
   0xe0707090,
   0x7c3e3e42,
   0x71b5b5c4,
   0xcc6666aa,
   0x904848d8,
   0x06030305,
   0xf7f6f601,
   0x1c0e0e12,
   0xc26161a3,
   0x6a35355f,
   0xae5757f9,
   0x69b9b9d0,
   0x17868691,
   0x99c1c158,
   0x3a1d1d27,
   0x279e9eb9,
   0xd9e1e138,
   0xebf8f813,
   0x2b9898b3,
   0x22111133,
   0xd26969bb,
   0xa9d9d970,
   0x078e8e89,
   0x339494a7,
   0x2d9b9bb6,
   0x3c1e1e22,
   0x15878792,
   0xc9e9e920,
   0x87cece49,
   0xaa5555ff,
   0x50282878,
   0xa5dfdf7a,
   0x038c8c8f,
   0x59a1a1f8,
   0x09898980,
   0x1a0d0d17,
   0x65bfbfda,
   0xd7e6e631,
   0x844242c6,
   0xd06868b8,
   0x824141c3,
   0x299999b0,
   0x5a2d2d77,
   0x1e0f0f11,
   0x7bb0b0cb,
   0xa85454fc,
   0x6dbbbbd6,
   0x2c16163a,
};
static const word32 E1[256] = {
   0xa5c66363,
   0x84f87c7c,
   0x99ee7777,
   0x8df67b7b,
   0x0dfff2f2,
   0xbdd66b6b,
   0xb1de6f6f,
   0x5491c5c5,
   0x50603030,
   0x03020101,
   0xa9ce6767,
   0x7d562b2b,
   0x19e7fefe,
   0x62b5d7d7,
   0xe64dabab,
   0x9aec7676,
   0x458fcaca,
   0x9d1f8282,
   0x4089c9c9,
   0x87fa7d7d,
   0x15effafa,
   0xebb25959,
   0xc98e4747,
   0x0bfbf0f0,
   0xec41adad,
   0x67b3d4d4,
   0xfd5fa2a2,
   0xea45afaf,
   0xbf239c9c,
   0xf753a4a4,
   0x96e47272,
   0x5b9bc0c0,
   0xc275b7b7,
   0x1ce1fdfd,
   0xae3d9393,
   0x6a4c2626,
   0x5a6c3636,
   0x417e3f3f,
   0x02f5f7f7,
   0x4f83cccc,
   0x5c683434,
   0xf451a5a5,
   0x34d1e5e5,
   0x08f9f1f1,
   0x93e27171,
   0x73abd8d8,
   0x53623131,
   0x3f2a1515,
   0x0c080404,
   0x5295c7c7,
   0x65462323,
   0x5e9dc3c3,
   0x28301818,
   0xa1379696,
   0x0f0a0505,
   0xb52f9a9a,
   0x090e0707,
   0x36241212,
   0x9b1b8080,
   0x3ddfe2e2,
   0x26cdebeb,
   0x694e2727,
   0xcd7fb2b2,
   0x9fea7575,
   0x1b120909,
   0x9e1d8383,
   0x74582c2c,
   0x2e341a1a,
   0x2d361b1b,
   0xb2dc6e6e,
   0xeeb45a5a,
   0xfb5ba0a0,
   0xf6a45252,
   0x4d763b3b,
   0x61b7d6d6,
   0xce7db3b3,
   0x7b522929,
   0x3edde3e3,
   0x715e2f2f,
   0x97138484,
   0xf5a65353,
   0x68b9d1d1,
   0x00000000,
   0x2cc1eded,
   0x60402020,
   0x1fe3fcfc,
   0xc879b1b1,
   0xedb65b5b,
   0xbed46a6a,
   0x468dcbcb,
   0xd967bebe,
   0x4b723939,
   0xde944a4a,
   0xd4984c4c,
   0xe8b05858,
   0x4a85cfcf,
   0x6bbbd0d0,
   0x2ac5efef,
   0xe54faaaa,
   0x16edfbfb,
   0xc5864343,
   0xd79a4d4d,
   0x55663333,
   0x94118585,
   0xcf8a4545,
   0x10e9f9f9,
   0x06040202,
   0x81fe7f7f,
   0xf0a05050,
   0x44783c3c,
   0xba259f9f,
   0xe34ba8a8,
   0xf3a25151,
   0xfe5da3a3,
   0xc0804040,
   0x8a058f8f,
   0xad3f9292,
   0xbc219d9d,
   0x48703838,
   0x04f1f5f5,
   0xdf63bcbc,
   0xc177b6b6,
   0x75afdada,
   0x63422121,
   0x30201010,
   0x1ae5ffff,
   0x0efdf3f3,
   0x6dbfd2d2,
   0x4c81cdcd,
   0x14180c0c,
   0x35261313,
   0x2fc3ecec,
   0xe1be5f5f,
   0xa2359797,
   0xcc884444,
   0x392e1717,
   0x5793c4c4,
   0xf255a7a7,
   0x82fc7e7e,
   0x477a3d3d,
   0xacc86464,
   0xe7ba5d5d,
   0x2b321919,
   0x95e67373,
   0xa0c06060,
   0x98198181,
   0xd19e4f4f,
   0x7fa3dcdc,
   0x66442222,
   0x7e542a2a,
   0xab3b9090,
   0x830b8888,
   0xca8c4646,
   0x29c7eeee,
   0xd36bb8b8,
   0x3c281414,
   0x79a7dede,
   0xe2bc5e5e,
   0x1d160b0b,
   0x76addbdb,
   0x3bdbe0e0,
   0x56643232,
   0x4e743a3a,
   0x1e140a0a,
   0xdb924949,
   0x0a0c0606,
   0x6c482424,
   0xe4b85c5c,
   0x5d9fc2c2,
   0x6ebdd3d3,
   0xef43acac,
   0xa6c46262,
   0xa8399191,
   0xa4319595,
   0x37d3e4e4,
   0x8bf27979,
   0x32d5e7e7,
   0x438bc8c8,
   0x596e3737,
   0xb7da6d6d,
   0x8c018d8d,
   0x64b1d5d5,
   0xd29c4e4e,
   0xe049a9a9,
   0xb4d86c6c,
   0xfaac5656,
   0x07f3f4f4,
   0x25cfeaea,
   0xafca6565,
   0x8ef47a7a,
   0xe947aeae,
   0x18100808,
   0xd56fbaba,
   0x88f07878,
   0x6f4a2525,
   0x725c2e2e,
   0x24381c1c,
   0xf157a6a6,
   0xc773b4b4,
   0x5197c6c6,
   0x23cbe8e8,
   0x7ca1dddd,
   0x9ce87474,
   0x213e1f1f,
   0xdd964b4b,
   0xdc61bdbd,
   0x860d8b8b,
   0x850f8a8a,
   0x90e07070,
   0x427c3e3e,
   0xc471b5b5,
   0xaacc6666,
   0xd8904848,
   0x05060303,
   0x01f7f6f6,
   0x121c0e0e,
   0xa3c26161,
   0x5f6a3535,
   0xf9ae5757,
   0xd069b9b9,
   0x91178686,
   0x5899c1c1,
   0x273a1d1d,
   0xb9279e9e,
   0x38d9e1e1,
   0x13ebf8f8,
   0xb32b9898,
   0x33221111,
   0xbbd26969,
   0x70a9d9d9,
   0x89078e8e,
   0xa7339494,
   0xb62d9b9b,
   0x223c1e1e,
   0x92158787,
   0x20c9e9e9,
   0x4987cece,
   0xffaa5555,
   0x78502828,
   0x7aa5dfdf,
   0x8f038c8c,
   0xf859a1a1,
   0x80098989,
   0x171a0d0d,
   0xda65bfbf,
   0x31d7e6e6,
   0xc6844242,
   0xb8d06868,
   0xc3824141,
   0xb0299999,
   0x775a2d2d,
   0x111e0f0f,
   0xcb7bb0b0,
   0xfca85454,
   0xd66dbbbb,
   0x3a2c1616,
};
static const word32 E2[256] = {
   0x63a5c663,
   0x7c84f87c,
   0x7799ee77,
   0x7b8df67b,
   0xf20dfff2,
   0x6bbdd66b,
   0x6fb1de6f,
   0xc55491c5,
   0x30506030,
   0x01030201,
   0x67a9ce67,
   0x2b7d562b,
   0xfe19e7fe,
   0xd762b5d7,
   0xabe64dab,
   0x769aec76,
   0xca458fca,
   0x829d1f82,
   0xc94089c9,
   0x7d87fa7d,
   0xfa15effa,
   0x59ebb259,
   0x47c98e47,
   0xf00bfbf0,
   0xadec41ad,
   0xd467b3d4,
   0xa2fd5fa2,
   0xafea45af,
   0x9cbf239c,
   0xa4f753a4,
   0x7296e472,
   0xc05b9bc0,
   0xb7c275b7,
   0xfd1ce1fd,
   0x93ae3d93,
   0x266a4c26,
   0x365a6c36,
   0x3f417e3f,
   0xf702f5f7,
   0xcc4f83cc,
   0x345c6834,
   0xa5f451a5,
   0xe534d1e5,
   0xf108f9f1,
   0x7193e271,
   0xd873abd8,
   0x31536231,
   0x153f2a15,
   0x040c0804,
   0xc75295c7,
   0x23654623,
   0xc35e9dc3,
   0x18283018,
   0x96a13796,
   0x050f0a05,
   0x9ab52f9a,
   0x07090e07,
   0x12362412,
   0x809b1b80,
   0xe23ddfe2,
   0xeb26cdeb,
   0x27694e27,
   0xb2cd7fb2,
   0x759fea75,
   0x091b1209,
   0x839e1d83,
   0x2c74582c,
   0x1a2e341a,
   0x1b2d361b,
   0x6eb2dc6e,
   0x5aeeb45a,
   0xa0fb5ba0,
   0x52f6a452,
   0x3b4d763b,
   0xd661b7d6,
   0xb3ce7db3,
   0x297b5229,
   0xe33edde3,
   0x2f715e2f,
   0x84971384,
   0x53f5a653,
   0xd168b9d1,
   0x00000000,
   0xed2cc1ed,
   0x20604020,
   0xfc1fe3fc,
   0xb1c879b1,
   0x5bedb65b,
   0x6abed46a,
   0xcb468dcb,
   0xbed967be,
   0x394b7239,
   0x4ade944a,
   0x4cd4984c,
   0x58e8b058,
   0xcf4a85cf,
   0xd06bbbd0,
   0xef2ac5ef,
   0xaae54faa,
   0xfb16edfb,
   0x43c58643,
   0x4dd79a4d,
   0x33556633,
   0x85941185,
   0x45cf8a45,
   0xf910e9f9,
   0x02060402,
   0x7f81fe7f,
   0x50f0a050,
   0x3c44783c,
   0x9fba259f,
   0xa8e34ba8,
   0x51f3a251,
   0xa3fe5da3,
   0x40c08040,
   0x8f8a058f,
   0x92ad3f92,
   0x9dbc219d,
   0x38487038,
   0xf504f1f5,
   0xbcdf63bc,
   0xb6c177b6,
   0xda75afda,
   0x21634221,
   0x10302010,
   0xff1ae5ff,
   0xf30efdf3,
   0xd26dbfd2,
   0xcd4c81cd,
   0x0c14180c,
   0x13352613,
   0xec2fc3ec,
   0x5fe1be5f,
   0x97a23597,
   0x44cc8844,
   0x17392e17,
   0xc45793c4,
   0xa7f255a7,
   0x7e82fc7e,
   0x3d477a3d,
   0x64acc864,
   0x5de7ba5d,
   0x192b3219,
   0x7395e673,
   0x60a0c060,
   0x81981981,
   0x4fd19e4f,
   0xdc7fa3dc,
   0x22664422,
   0x2a7e542a,
   0x90ab3b90,
   0x88830b88,
   0x46ca8c46,
   0xee29c7ee,
   0xb8d36bb8,
   0x143c2814,
   0xde79a7de,
   0x5ee2bc5e,
   0x0b1d160b,
   0xdb76addb,
   0xe03bdbe0,
   0x32566432,
   0x3a4e743a,
   0x0a1e140a,
   0x49db9249,
   0x060a0c06,
   0x246c4824,
   0x5ce4b85c,
   0xc25d9fc2,
   0xd36ebdd3,
   0xacef43ac,
   0x62a6c462,
   0x91a83991,
   0x95a43195,
   0xe437d3e4,
   0x798bf279,
   0xe732d5e7,
   0xc8438bc8,
   0x37596e37,
   0x6db7da6d,
   0x8d8c018d,
   0xd564b1d5,
   0x4ed29c4e,
   0xa9e049a9,
   0x6cb4d86c,
   0x56faac56,
   0xf407f3f4,
   0xea25cfea,
   0x65afca65,
   0x7a8ef47a,
   0xaee947ae,
   0x08181008,
   0xbad56fba,
   0x7888f078,
   0x256f4a25,
   0x2e725c2e,
   0x1c24381c,
   0xa6f157a6,
   0xb4c773b4,
   0xc65197c6,
   0xe823cbe8,
   0xdd7ca1dd,
   0x749ce874,
   0x1f213e1f,
   0x4bdd964b,
   0xbddc61bd,
   0x8b860d8b,
   0x8a850f8a,
   0x7090e070,
   0x3e427c3e,
   0xb5c471b5,
   0x66aacc66,
   0x48d89048,
   0x03050603,
   0xf601f7f6,
   0x0e121c0e,
   0x61a3c261,
   0x355f6a35,
   0x57f9ae57,
   0xb9d069b9,
   0x86911786,
   0xc15899c1,
   0x1d273a1d,
   0x9eb9279e,
   0xe138d9e1,
   0xf813ebf8,
   0x98b32b98,
   0x11332211,
   0x69bbd269,
   0xd970a9d9,
   0x8e89078e,
   0x94a73394,
   0x9bb62d9b,
   0x1e223c1e,
   0x87921587,
   0xe920c9e9,
   0xce4987ce,
   0x55ffaa55,
   0x28785028,
   0xdf7aa5df,
   0x8c8f038c,
   0xa1f859a1,
   0x89800989,
   0x0d171a0d,
   0xbfda65bf,
   0xe631d7e6,
   0x42c68442,
   0x68b8d068,
   0x41c38241,
   0x99b02999,
   0x2d775a2d,
   0x0f111e0f,
   0xb0cb7bb0,
   0x54fca854,
   0xbbd66dbb,
   0x163a2c16,
};
static const word32 E3[256] = {
   0x6363a5c6,
   0x7c7c84f8,
   0x777799ee,
   0x7b7b8df6,
   0xf2f20dff,
   0x6b6bbdd6,
   0x6f6fb1de,
   0xc5c55491,
   0x30305060,
   0x01010302,
   0x6767a9ce,
   0x2b2b7d56,
   0xfefe19e7,
   0xd7d762b5,
   0xababe64d,
   0x76769aec,
   0xcaca458f,
   0x82829d1f,
   0xc9c94089,
   0x7d7d87fa,
   0xfafa15ef,
   0x5959ebb2,
   0x4747c98e,
   0xf0f00bfb,
   0xadadec41,
   0xd4d467b3,
   0xa2a2fd5f,
   0xafafea45,
   0x9c9cbf23,
   0xa4a4f753,
   0x727296e4,
   0xc0c05b9b,
   0xb7b7c275,
   0xfdfd1ce1,
   0x9393ae3d,
   0x26266a4c,
   0x36365a6c,
   0x3f3f417e,
   0xf7f702f5,
   0xcccc4f83,
   0x34345c68,
   0xa5a5f451,
   0xe5e534d1,
   0xf1f108f9,
   0x717193e2,
   0xd8d873ab,
   0x31315362,
   0x15153f2a,
   0x04040c08,
   0xc7c75295,
   0x23236546,
   0xc3c35e9d,
   0x18182830,
   0x9696a137,
   0x05050f0a,
   0x9a9ab52f,
   0x0707090e,
   0x12123624,
   0x80809b1b,
   0xe2e23ddf,
   0xebeb26cd,
   0x2727694e,
   0xb2b2cd7f,
   0x75759fea,
   0x09091b12,
   0x83839e1d,
   0x2c2c7458,
   0x1a1a2e34,
   0x1b1b2d36,
   0x6e6eb2dc,
   0x5a5aeeb4,
   0xa0a0fb5b,
   0x5252f6a4,
   0x3b3b4d76,
   0xd6d661b7,
   0xb3b3ce7d,
   0x29297b52,
   0xe3e33edd,
   0x2f2f715e,
   0x84849713,
   0x5353f5a6,
   0xd1d168b9,
   0x00000000,
   0xeded2cc1,
   0x20206040,
   0xfcfc1fe3,
   0xb1b1c879,
   0x5b5bedb6,
   0x6a6abed4,
   0xcbcb468d,
   0xbebed967,
   0x39394b72,
   0x4a4ade94,
   0x4c4cd498,
   0x5858e8b0,
   0xcfcf4a85,
   0xd0d06bbb,
   0xefef2ac5,
   0xaaaae54f,
   0xfbfb16ed,
   0x4343c586,
   0x4d4dd79a,
   0x33335566,
   0x85859411,
   0x4545cf8a,
   0xf9f910e9,
   0x02020604,
   0x7f7f81fe,
   0x5050f0a0,
   0x3c3c4478,
   0x9f9fba25,
   0xa8a8e34b,
   0x5151f3a2,
   0xa3a3fe5d,
   0x4040c080,
   0x8f8f8a05,
   0x9292ad3f,
   0x9d9dbc21,
   0x38384870,
   0xf5f504f1,
   0xbcbcdf63,
   0xb6b6c177,
   0xdada75af,
   0x21216342,
   0x10103020,
   0xffff1ae5,
   0xf3f30efd,
   0xd2d26dbf,
   0xcdcd4c81,
   0x0c0c1418,
   0x13133526,
   0xecec2fc3,
   0x5f5fe1be,
   0x9797a235,
   0x4444cc88,
   0x1717392e,
   0xc4c45793,
   0xa7a7f255,
   0x7e7e82fc,
   0x3d3d477a,
   0x6464acc8,
   0x5d5de7ba,
   0x19192b32,
   0x737395e6,
   0x6060a0c0,
   0x81819819,
   0x4f4fd19e,
   0xdcdc7fa3,
   0x22226644,
   0x2a2a7e54,
   0x9090ab3b,
   0x8888830b,
   0x4646ca8c,
   0xeeee29c7,
   0xb8b8d36b,
   0x14143c28,
   0xdede79a7,
   0x5e5ee2bc,
   0x0b0b1d16,
   0xdbdb76ad,
   0xe0e03bdb,
   0x32325664,
   0x3a3a4e74,
   0x0a0a1e14,
   0x4949db92,
   0x06060a0c,
   0x24246c48,
   0x5c5ce4b8,
   0xc2c25d9f,
   0xd3d36ebd,
   0xacacef43,
   0x6262a6c4,
   0x9191a839,
   0x9595a431,
   0xe4e437d3,
   0x79798bf2,
   0xe7e732d5,
   0xc8c8438b,
   0x3737596e,
   0x6d6db7da,
   0x8d8d8c01,
   0xd5d564b1,
   0x4e4ed29c,
   0xa9a9e049,
   0x6c6cb4d8,
   0x5656faac,
   0xf4f407f3,
   0xeaea25cf,
   0x6565afca,
   0x7a7a8ef4,
   0xaeaee947,
   0x08081810,
   0xbabad56f,
   0x787888f0,
   0x25256f4a,
   0x2e2e725c,
   0x1c1c2438,
   0xa6a6f157,
   0xb4b4c773,
   0xc6c65197,
   0xe8e823cb,
   0xdddd7ca1,
   0x74749ce8,
   0x1f1f213e,
   0x4b4bdd96,
   0xbdbddc61,
   0x8b8b860d,
   0x8a8a850f,
   0x707090e0,
   0x3e3e427c,
   0xb5b5c471,
   0x6666aacc,
   0x4848d890,
   0x03030506,
   0xf6f601f7,
   0x0e0e121c,
   0x6161a3c2,
   0x35355f6a,
   0x5757f9ae,
   0xb9b9d069,
   0x86869117,
   0xc1c15899,
   0x1d1d273a,
   0x9e9eb927,
   0xe1e138d9,
   0xf8f813eb,
   0x9898b32b,
   0x11113322,
   0x6969bbd2,
   0xd9d970a9,
   0x8e8e8907,
   0x9494a733,
   0x9b9bb62d,
   0x1e1e223c,
   0x87879215,
   0xe9e920c9,
   0xcece4987,
   0x5555ffaa,
   0x28287850,
   0xdfdf7aa5,
   0x8c8c8f03,
   0xa1a1f859,
   0x89898009,
   0x0d0d171a,
   0xbfbfda65,
   0xe6e631d7,
   0x4242c684,
   0x6868b8d0,
   0x4141c382,
   0x9999b029,
   0x2d2d775a,
   0x0f0f111e,
   0xb0b0cb7b,
   0x5454fca8,
   0xbbbbd66d,
   0x16163a2c,
};
static const word32 D0[256] = {
   0x51f4a750,
   0x7e416553,
   0x1a17a4c3,
   0x3a275e96,
   0x3bab6bcb,
   0x1f9d45f1,
   0xacfa58ab,
   0x4be30393,
   0x2030fa55,
   0xad766df6,
   0x88cc7691,
   0xf5024c25,
   0x4fe5d7fc,
   0xc52acbd7,
   0x26354480,
   0xb562a38f,
   0xdeb15a49,
   0x25ba1b67,
   0x45ea0e98,
   0x5dfec0e1,
   0xc32f7502,
   0x814cf012,
   0x8d4697a3,
   0x6bd3f9c6,
   0x038f5fe7,
   0x15929c95,
   0xbf6d7aeb,
   0x955259da,
   0xd4be832d,
   0x587421d3,
   0x49e06929,
   0x8ec9c844,
   0x75c2896a,
   0xf48e7978,
   0x99583e6b,
   0x27b971dd,
   0xbee14fb6,
   0xf088ad17,
   0xc920ac66,
   0x7dce3ab4,
   0x63df4a18,
   0xe51a3182,
   0x97513360,
   0x62537f45,
   0xb16477e0,
   0xbb6bae84,
   0xfe81a01c,
   0xf9082b94,
   0x70486858,
   0x8f45fd19,
   0x94de6c87,
   0x527bf8b7,
   0xab73d323,
   0x724b02e2,
   0xe31f8f57,
   0x6655ab2a,
   0xb2eb2807,
   0x2fb5c203,
   0x86c57b9a,
   0xd33708a5,
   0x302887f2,
   0x23bfa5b2,
   0x02036aba,
   0xed16825c,
   0x8acf1c2b,
   0xa779b492,
   0xf307f2f0,
   0x4e69e2a1,
   0x65daf4cd,
   0x0605bed5,
   0xd134621f,
   0xc4a6fe8a,
   0x342e539d,
   0xa2f355a0,
   0x058ae132,
   0xa4f6eb75,
   0x0b83ec39,
   0x4060efaa,
   0x5e719f06,
   0xbd6e1051,
   0x3e218af9,
   0x96dd063d,
   0xdd3e05ae,
   0x4de6bd46,
   0x91548db5,
   0x71c45d05,
   0x0406d46f,
   0x605015ff,
   0x1998fb24,
   0xd6bde997,
   0x894043cc,
   0x67d99e77,
   0xb0e842bd,
   0x07898b88,
   0xe7195b38,
   0x79c8eedb,
   0xa17c0a47,
   0x7c420fe9,
   0xf8841ec9,
   0x00000000,
   0x09808683,
   0x322bed48,
   0x1e1170ac,
   0x6c5a724e,
   0xfd0efffb,
   0x0f853856,
   0x3daed51e,
   0x362d3927,
   0x0a0fd964,
   0x685ca621,
   0x9b5b54d1,
   0x24362e3a,
   0x0c0a67b1,
   0x9357e70f,
   0xb4ee96d2,
   0x1b9b919e,
   0x80c0c54f,
   0x61dc20a2,
   0x5a774b69,
   0x1c121a16,
   0xe293ba0a,
   0xc0a02ae5,
   0x3c22e043,
   0x121b171d,
   0x0e090d0b,
   0xf28bc7ad,
   0x2db6a8b9,
   0x141ea9c8,
   0x57f11985,
   0xaf75074c,
   0xee99ddbb,
   0xa37f60fd,
   0xf701269f,
   0x5c72f5bc,
   0x44663bc5,
   0x5bfb7e34,
   0x8b432976,
   0xcb23c6dc,
   0xb6edfc68,
   0xb8e4f163,
   0xd731dcca,
   0x42638510,
   0x13972240,
   0x84c61120,
   0x854a247d,
   0xd2bb3df8,
   0xaef93211,
   0xc729a16d,
   0x1d9e2f4b,
   0xdcb230f3,
   0x0d8652ec,
   0x77c1e3d0,
   0x2bb3166c,
   0xa970b999,
   0x119448fa,
   0x47e96422,
   0xa8fc8cc4,
   0xa0f03f1a,
   0x567d2cd8,
   0x223390ef,
   0x87494ec7,
   0xd938d1c1,
   0x8ccaa2fe,
   0x98d40b36,
   0xa6f581cf,
   0xa57ade28,
   0xdab78e26,
   0x3fadbfa4,
   0x2c3a9de4,
   0x5078920d,
   0x6a5fcc9b,
   0x547e4662,
   0xf68d13c2,
   0x90d8b8e8,
   0x2e39f75e,
   0x82c3aff5,
   0x9f5d80be,
   0x69d0937c,
   0x6fd52da9,
   0xcf2512b3,
   0xc8ac993b,
   0x10187da7,
   0xe89c636e,
   0xdb3bbb7b,
   0xcd267809,
   0x6e5918f4,
   0xec9ab701,
   0x834f9aa8,
   0xe6956e65,
   0xaaffe67e,
   0x21bccf08,
   0xef15e8e6,
   0xbae79bd9,
   0x4a6f36ce,
   0xea9f09d4,
   0x29b07cd6,
   0x31a4b2af,
   0x2a3f2331,
   0xc6a59430,
   0x35a266c0,
   0x744ebc37,
   0xfc82caa6,
   0xe090d0b0,
   0x33a7d815,
   0xf104984a,
   0x41ecdaf7,
   0x7fcd500e,
   0x1791f62f,
   0x764dd68d,
   0x43efb04d,
   0xccaa4d54,
   0xe49604df,
   0x9ed1b5e3,
   0x4c6a881b,
   0xc12c1fb8,
   0x4665517f,
   0x9d5eea04,
   0x018c355d,
   0xfa877473,
   0xfb0b412e,
   0xb3671d5a,
   0x92dbd252,
   0xe9105633,
   0x6dd64713,
   0x9ad7618c,
   0x37a10c7a,
   0x59f8148e,
   0xeb133c89,
   0xcea927ee,
   0xb761c935,
   0xe11ce5ed,
   0x7a47b13c,
   0x9cd2df59,
   0x55f2733f,
   0x1814ce79,
   0x73c737bf,
   0x53f7cdea,
   0x5ffdaa5b,
   0xdf3d6f14,
   0x7844db86,
   0xcaaff381,
   0xb968c43e,
   0x3824342c,
   0xc2a3405f,
   0x161dc372,
   0xbce2250c,
   0x283c498b,
   0xff0d9541,
   0x39a80171,
   0x080cb3de,
   0xd8b4e49c,
   0x6456c190,
   0x7bcb8461,
   0xd532b670,
   0x486c5c74,
   0xd0b85742,
};
static const word32 D1[256] = {
   0x5051f4a7,
   0x537e4165,
   0xc31a17a4,
   0x963a275e,
   0xcb3bab6b,
   0xf11f9d45,
   0xabacfa58,
   0x934be303,
   0x552030fa,
   0xf6ad766d,
   0x9188cc76,
   0x25f5024c,
   0xfc4fe5d7,
   0xd7c52acb,
   0x80263544,
   0x8fb562a3,
   0x49deb15a,
   0x6725ba1b,
   0x9845ea0e,
   0xe15dfec0,
   0x02c32f75,
   0x12814cf0,
   0xa38d4697,
   0xc66bd3f9,
   0xe7038f5f,
   0x9515929c,
   0xebbf6d7a,
   0xda955259,
   0x2dd4be83,
   0xd3587421,
   0x2949e069,
   0x448ec9c8,
   0x6a75c289,
   0x78f48e79,
   0x6b99583e,
   0xdd27b971,
   0xb6bee14f,
   0x17f088ad,
   0x66c920ac,
   0xb47dce3a,
   0x1863df4a,
   0x82e51a31,
   0x60975133,
   0x4562537f,
   0xe0b16477,
   0x84bb6bae,
   0x1cfe81a0,
   0x94f9082b,
   0x58704868,
   0x198f45fd,
   0x8794de6c,
   0xb7527bf8,
   0x23ab73d3,
   0xe2724b02,
   0x57e31f8f,
   0x2a6655ab,
   0x07b2eb28,
   0x032fb5c2,
   0x9a86c57b,
   0xa5d33708,
   0xf2302887,
   0xb223bfa5,
   0xba02036a,
   0x5ced1682,
   0x2b8acf1c,
   0x92a779b4,
   0xf0f307f2,
   0xa14e69e2,
   0xcd65daf4,
   0xd50605be,
   0x1fd13462,
   0x8ac4a6fe,
   0x9d342e53,
   0xa0a2f355,
   0x32058ae1,
   0x75a4f6eb,
   0x390b83ec,
   0xaa4060ef,
   0x065e719f,
   0x51bd6e10,
   0xf93e218a,
   0x3d96dd06,
   0xaedd3e05,
   0x464de6bd,
   0xb591548d,
   0x0571c45d,
   0x6f0406d4,
   0xff605015,
   0x241998fb,
   0x97d6bde9,
   0xcc894043,
   0x7767d99e,
   0xbdb0e842,
   0x8807898b,
   0x38e7195b,
   0xdb79c8ee,
   0x47a17c0a,
   0xe97c420f,
   0xc9f8841e,
   0x00000000,
   0x83098086,
   0x48322bed,
   0xac1e1170,
   0x4e6c5a72,
   0xfbfd0eff,
   0x560f8538,
   0x1e3daed5,
   0x27362d39,
   0x640a0fd9,
   0x21685ca6,
   0xd19b5b54,
   0x3a24362e,
   0xb10c0a67,
   0x0f9357e7,
   0xd2b4ee96,
   0x9e1b9b91,
   0x4f80c0c5,
   0xa261dc20,
   0x695a774b,
   0x161c121a,
   0x0ae293ba,
   0xe5c0a02a,
   0x433c22e0,
   0x1d121b17,
   0x0b0e090d,
   0xadf28bc7,
   0xb92db6a8,
   0xc8141ea9,
   0x8557f119,
   0x4caf7507,
   0xbbee99dd,
   0xfda37f60,
   0x9ff70126,
   0xbc5c72f5,
   0xc544663b,
   0x345bfb7e,
   0x768b4329,
   0xdccb23c6,
   0x68b6edfc,
   0x63b8e4f1,
   0xcad731dc,
   0x10426385,
   0x40139722,
   0x2084c611,
   0x7d854a24,
   0xf8d2bb3d,
   0x11aef932,
   0x6dc729a1,
   0x4b1d9e2f,
   0xf3dcb230,
   0xec0d8652,
   0xd077c1e3,
   0x6c2bb316,
   0x99a970b9,
   0xfa119448,
   0x2247e964,
   0xc4a8fc8c,
   0x1aa0f03f,
   0xd8567d2c,
   0xef223390,
   0xc787494e,
   0xc1d938d1,
   0xfe8ccaa2,
   0x3698d40b,
   0xcfa6f581,
   0x28a57ade,
   0x26dab78e,
   0xa43fadbf,
   0xe42c3a9d,
   0x0d507892,
   0x9b6a5fcc,
   0x62547e46,
   0xc2f68d13,
   0xe890d8b8,
   0x5e2e39f7,
   0xf582c3af,
   0xbe9f5d80,
   0x7c69d093,
   0xa96fd52d,
   0xb3cf2512,
   0x3bc8ac99,
   0xa710187d,
   0x6ee89c63,
   0x7bdb3bbb,
   0x09cd2678,
   0xf46e5918,
   0x01ec9ab7,
   0xa8834f9a,
   0x65e6956e,
   0x7eaaffe6,
   0x0821bccf,
   0xe6ef15e8,
   0xd9bae79b,
   0xce4a6f36,
   0xd4ea9f09,
   0xd629b07c,
   0xaf31a4b2,
   0x312a3f23,
   0x30c6a594,
   0xc035a266,
   0x37744ebc,
   0xa6fc82ca,
   0xb0e090d0,
   0x1533a7d8,
   0x4af10498,
   0xf741ecda,
   0x0e7fcd50,
   0x2f1791f6,
   0x8d764dd6,
   0x4d43efb0,
   0x54ccaa4d,
   0xdfe49604,
   0xe39ed1b5,
   0x1b4c6a88,
   0xb8c12c1f,
   0x7f466551,
   0x049d5eea,
   0x5d018c35,
   0x73fa8774,
   0x2efb0b41,
   0x5ab3671d,
   0x5292dbd2,
   0x33e91056,
   0x136dd647,
   0x8c9ad761,
   0x7a37a10c,
   0x8e59f814,
   0x89eb133c,
   0xeecea927,
   0x35b761c9,
   0xede11ce5,
   0x3c7a47b1,
   0x599cd2df,
   0x3f55f273,
   0x791814ce,
   0xbf73c737,
   0xea53f7cd,
   0x5b5ffdaa,
   0x14df3d6f,
   0x867844db,
   0x81caaff3,
   0x3eb968c4,
   0x2c382434,
   0x5fc2a340,
   0x72161dc3,
   0x0cbce225,
   0x8b283c49,
   0x41ff0d95,
   0x7139a801,
   0xde080cb3,
   0x9cd8b4e4,
   0x906456c1,
   0x617bcb84,
   0x70d532b6,
   0x74486c5c,
   0x42d0b857,
};
static const word32 D2[256] = {
   0xa75051f4,
   0x65537e41,
   0xa4c31a17,
   0x5e963a27,
   0x6bcb3bab,
   0x45f11f9d,
   0x58abacfa,
   0x03934be3,
   0xfa552030,
   0x6df6ad76,
   0x769188cc,
   0x4c25f502,
   0xd7fc4fe5,
   0xcbd7c52a,
   0x44802635,
   0xa38fb562,
   0x5a49deb1,
   0x1b6725ba,
   0x0e9845ea,
   0xc0e15dfe,
   0x7502c32f,
   0xf012814c,
   0x97a38d46,
   0xf9c66bd3,
   0x5fe7038f,
   0x9c951592,
   0x7aebbf6d,
   0x59da9552,
   0x832dd4be,
   0x21d35874,
   0x692949e0,
   0xc8448ec9,
   0x896a75c2,
   0x7978f48e,
   0x3e6b9958,
   0x71dd27b9,
   0x4fb6bee1,
   0xad17f088,
   0xac66c920,
   0x3ab47dce,
   0x4a1863df,
   0x3182e51a,
   0x33609751,
   0x7f456253,
   0x77e0b164,
   0xae84bb6b,
   0xa01cfe81,
   0x2b94f908,
   0x68587048,
   0xfd198f45,
   0x6c8794de,
   0xf8b7527b,
   0xd323ab73,
   0x02e2724b,
   0x8f57e31f,
   0xab2a6655,
   0x2807b2eb,
   0xc2032fb5,
   0x7b9a86c5,
   0x08a5d337,
   0x87f23028,
   0xa5b223bf,
   0x6aba0203,
   0x825ced16,
   0x1c2b8acf,
   0xb492a779,
   0xf2f0f307,
   0xe2a14e69,
   0xf4cd65da,
   0xbed50605,
   0x621fd134,
   0xfe8ac4a6,
   0x539d342e,
   0x55a0a2f3,
   0xe132058a,
   0xeb75a4f6,
   0xec390b83,
   0xefaa4060,
   0x9f065e71,
   0x1051bd6e,
   0x8af93e21,
   0x063d96dd,
   0x05aedd3e,
   0xbd464de6,
   0x8db59154,
   0x5d0571c4,
   0xd46f0406,
   0x15ff6050,
   0xfb241998,
   0xe997d6bd,
   0x43cc8940,
   0x9e7767d9,
   0x42bdb0e8,
   0x8b880789,
   0x5b38e719,
   0xeedb79c8,
   0x0a47a17c,
   0x0fe97c42,
   0x1ec9f884,
   0x00000000,
   0x86830980,
   0xed48322b,
   0x70ac1e11,
   0x724e6c5a,
   0xfffbfd0e,
   0x38560f85,
   0xd51e3dae,
   0x3927362d,
   0xd9640a0f,
   0xa621685c,
   0x54d19b5b,
   0x2e3a2436,
   0x67b10c0a,
   0xe70f9357,
   0x96d2b4ee,
   0x919e1b9b,
   0xc54f80c0,
   0x20a261dc,
   0x4b695a77,
   0x1a161c12,
   0xba0ae293,
   0x2ae5c0a0,
   0xe0433c22,
   0x171d121b,
   0x0d0b0e09,
   0xc7adf28b,
   0xa8b92db6,
   0xa9c8141e,
   0x198557f1,
   0x074caf75,
   0xddbbee99,
   0x60fda37f,
   0x269ff701,
   0xf5bc5c72,
   0x3bc54466,
   0x7e345bfb,
   0x29768b43,
   0xc6dccb23,
   0xfc68b6ed,
   0xf163b8e4,
   0xdccad731,
   0x85104263,
   0x22401397,
   0x112084c6,
   0x247d854a,
   0x3df8d2bb,
   0x3211aef9,
   0xa16dc729,
   0x2f4b1d9e,
   0x30f3dcb2,
   0x52ec0d86,
   0xe3d077c1,
   0x166c2bb3,
   0xb999a970,
   0x48fa1194,
   0x642247e9,
   0x8cc4a8fc,
   0x3f1aa0f0,
   0x2cd8567d,
   0x90ef2233,
   0x4ec78749,
   0xd1c1d938,
   0xa2fe8cca,
   0x0b3698d4,
   0x81cfa6f5,
   0xde28a57a,
   0x8e26dab7,
   0xbfa43fad,
   0x9de42c3a,
   0x920d5078,
   0xcc9b6a5f,
   0x4662547e,
   0x13c2f68d,
   0xb8e890d8,
   0xf75e2e39,
   0xaff582c3,
   0x80be9f5d,
   0x937c69d0,
   0x2da96fd5,
   0x12b3cf25,
   0x993bc8ac,
   0x7da71018,
   0x636ee89c,
   0xbb7bdb3b,
   0x7809cd26,
   0x18f46e59,
   0xb701ec9a,
   0x9aa8834f,
   0x6e65e695,
   0xe67eaaff,
   0xcf0821bc,
   0xe8e6ef15,
   0x9bd9bae7,
   0x36ce4a6f,
   0x09d4ea9f,
   0x7cd629b0,
   0xb2af31a4,
   0x23312a3f,
   0x9430c6a5,
   0x66c035a2,
   0xbc37744e,
   0xcaa6fc82,
   0xd0b0e090,
   0xd81533a7,
   0x984af104,
   0xdaf741ec,
   0x500e7fcd,
   0xf62f1791,
   0xd68d764d,
   0xb04d43ef,
   0x4d54ccaa,
   0x04dfe496,
   0xb5e39ed1,
   0x881b4c6a,
   0x1fb8c12c,
   0x517f4665,
   0xea049d5e,
   0x355d018c,
   0x7473fa87,
   0x412efb0b,
   0x1d5ab367,
   0xd25292db,
   0x5633e910,
   0x47136dd6,
   0x618c9ad7,
   0x0c7a37a1,
   0x148e59f8,
   0x3c89eb13,
   0x27eecea9,
   0xc935b761,
   0xe5ede11c,
   0xb13c7a47,
   0xdf599cd2,
   0x733f55f2,
   0xce791814,
   0x37bf73c7,
   0xcdea53f7,
   0xaa5b5ffd,
   0x6f14df3d,
   0xdb867844,
   0xf381caaf,
   0xc43eb968,
   0x342c3824,
   0x405fc2a3,
   0xc372161d,
   0x250cbce2,
   0x498b283c,
   0x9541ff0d,
   0x017139a8,
   0xb3de080c,
   0xe49cd8b4,
   0xc1906456,
   0x84617bcb,
   0xb670d532,
   0x5c74486c,
   0x5742d0b8,
};
static const word32 D3[256] = {
   0xf4a75051,
   0x4165537e,
   0x17a4c31a,
   0x275e963a,
   0xab6bcb3b,
   0x9d45f11f,
   0xfa58abac,
   0xe303934b,
   0x30fa5520,
   0x766df6ad,
   0xcc769188,
   0x024c25f5,
   0xe5d7fc4f,
   0x2acbd7c5,
   0x35448026,
   0x62a38fb5,
   0xb15a49de,
   0xba1b6725,
   0xea0e9845,
   0xfec0e15d,
   0x2f7502c3,
   0x4cf01281,
   0x4697a38d,
   0xd3f9c66b,
   0x8f5fe703,
   0x929c9515,
   0x6d7aebbf,
   0x5259da95,
   0xbe832dd4,
   0x7421d358,
   0xe0692949,
   0xc9c8448e,
   0xc2896a75,
   0x8e7978f4,
   0x583e6b99,
   0xb971dd27,
   0xe14fb6be,
   0x88ad17f0,
   0x20ac66c9,
   0xce3ab47d,
   0xdf4a1863,
   0x1a3182e5,
   0x51336097,
   0x537f4562,
   0x6477e0b1,
   0x6bae84bb,
   0x81a01cfe,
   0x082b94f9,
   0x48685870,
   0x45fd198f,
   0xde6c8794,
   0x7bf8b752,
   0x73d323ab,
   0x4b02e272,
   0x1f8f57e3,
   0x55ab2a66,
   0xeb2807b2,
   0xb5c2032f,
   0xc57b9a86,
   0x3708a5d3,
   0x2887f230,
   0xbfa5b223,
   0x036aba02,
   0x16825ced,
   0xcf1c2b8a,
   0x79b492a7,
   0x07f2f0f3,
   0x69e2a14e,
   0xdaf4cd65,
   0x05bed506,
   0x34621fd1,
   0xa6fe8ac4,
   0x2e539d34,
   0xf355a0a2,
   0x8ae13205,
   0xf6eb75a4,
   0x83ec390b,
   0x60efaa40,
   0x719f065e,
   0x6e1051bd,
   0x218af93e,
   0xdd063d96,
   0x3e05aedd,
   0xe6bd464d,
   0x548db591,
   0xc45d0571,
   0x06d46f04,
   0x5015ff60,
   0x98fb2419,
   0xbde997d6,
   0x4043cc89,
   0xd99e7767,
   0xe842bdb0,
   0x898b8807,
   0x195b38e7,
   0xc8eedb79,
   0x7c0a47a1,
   0x420fe97c,
   0x841ec9f8,
   0x00000000,
   0x80868309,
   0x2bed4832,
   0x1170ac1e,
   0x5a724e6c,
   0x0efffbfd,
   0x8538560f,
   0xaed51e3d,
   0x2d392736,
   0x0fd9640a,
   0x5ca62168,
   0x5b54d19b,
   0x362e3a24,
   0x0a67b10c,
   0x57e70f93,
   0xee96d2b4,
   0x9b919e1b,
   0xc0c54f80,
   0xdc20a261,
   0x774b695a,
   0x121a161c,
   0x93ba0ae2,
   0xa02ae5c0,
   0x22e0433c,
   0x1b171d12,
   0x090d0b0e,
   0x8bc7adf2,
   0xb6a8b92d,
   0x1ea9c814,
   0xf1198557,
   0x75074caf,
   0x99ddbbee,
   0x7f60fda3,
   0x01269ff7,
   0x72f5bc5c,
   0x663bc544,
   0xfb7e345b,
   0x4329768b,
   0x23c6dccb,
   0xedfc68b6,
   0xe4f163b8,
   0x31dccad7,
   0x63851042,
   0x97224013,
   0xc6112084,
   0x4a247d85,
   0xbb3df8d2,
   0xf93211ae,
   0x29a16dc7,
   0x9e2f4b1d,
   0xb230f3dc,
   0x8652ec0d,
   0xc1e3d077,
   0xb3166c2b,
   0x70b999a9,
   0x9448fa11,
   0xe9642247,
   0xfc8cc4a8,
   0xf03f1aa0,
   0x7d2cd856,
   0x3390ef22,
   0x494ec787,
   0x38d1c1d9,
   0xcaa2fe8c,
   0xd40b3698,
   0xf581cfa6,
   0x7ade28a5,
   0xb78e26da,
   0xadbfa43f,
   0x3a9de42c,
   0x78920d50,
   0x5fcc9b6a,
   0x7e466254,
   0x8d13c2f6,
   0xd8b8e890,
   0x39f75e2e,
   0xc3aff582,
   0x5d80be9f,
   0xd0937c69,
   0xd52da96f,
   0x2512b3cf,
   0xac993bc8,
   0x187da710,
   0x9c636ee8,
   0x3bbb7bdb,
   0x267809cd,
   0x5918f46e,
   0x9ab701ec,
   0x4f9aa883,
   0x956e65e6,
   0xffe67eaa,
   0xbccf0821,
   0x15e8e6ef,
   0xe79bd9ba,
   0x6f36ce4a,
   0x9f09d4ea,
   0xb07cd629,
   0xa4b2af31,
   0x3f23312a,
   0xa59430c6,
   0xa266c035,
   0x4ebc3774,
   0x82caa6fc,
   0x90d0b0e0,
   0xa7d81533,
   0x04984af1,
   0xecdaf741,
   0xcd500e7f,
   0x91f62f17,
   0x4dd68d76,
   0xefb04d43,
   0xaa4d54cc,
   0x9604dfe4,
   0xd1b5e39e,
   0x6a881b4c,
   0x2c1fb8c1,
   0x65517f46,
   0x5eea049d,
   0x8c355d01,
   0x877473fa,
   0x0b412efb,
   0x671d5ab3,
   0xdbd25292,
   0x105633e9,
   0xd647136d,
   0xd7618c9a,
   0xa10c7a37,
   0xf8148e59,
   0x133c89eb,
   0xa927eece,
   0x61c935b7,
   0x1ce5ede1,
   0x47b13c7a,
   0xd2df599c,
   0xf2733f55,
   0x14ce7918,
   0xc737bf73,
   0xf7cdea53,
   0xfdaa5b5f,
   0x3d6f14df,
   0x44db8678,
   0xaff381ca,
   0x68c43eb9,
   0x24342c38,
   0xa3405fc2,
   0x1dc37216,
   0xe2250cbc,
   0x3c498b28,
   0x0d9541ff,
   0xa8017139,
   0x0cb3de08,
   0xb4e49cd8,
   0x56c19064,
   0xcb84617b,
   0x32b670d5,
   0x6c5c7448,
   0xb85742d0,
};
/*
 * Common macros in both the encryption and decryption routines.
 */
#define ADD_ROUND_KEY_4 (block[0] ^= *keysched++, block[1] ^= *keysched++, block[2] ^= *keysched++, block[3] ^= *keysched++)
#define ADD_ROUND_KEY_6 (block[0] ^= *keysched++, block[1] ^= *keysched++, block[2] ^= *keysched++, block[3] ^= *keysched++, block[4] ^= *keysched++, block[5] ^= *keysched++)
#define ADD_ROUND_KEY_8 (block[0] ^= *keysched++, block[1] ^= *keysched++, block[2] ^= *keysched++, block[3] ^= *keysched++, block[4] ^= *keysched++, block[5] ^= *keysched++, block[6] ^= *keysched++, block[7] ^= *keysched++)
#define MOVEWORD(i) (block[i] = newstate[i])

/*
 * Macros for the encryption routine. There are three encryption
 * cores, for Nb=4,6,8.
 */
#ifdef MAKEWORD
#   undef MAKEWORD
#endif

#define MAKEWORD(i) (newstate[i] = (E0[(block[i] >> 24) & 0xFF] ^             \
                                    E1[(block[(i + C1) % Nb] >> 16) & 0xFF] ^ \
                                    E2[(block[(i + C2) % Nb] >> 8) & 0xFF] ^  \
                                    E3[block[(i + C3) % Nb] & 0xFF]))
#define LASTWORD(i) (newstate[i] = (Sbox[(block[i] >> 24) & 0xFF] << 24) |             \
                                   (Sbox[(block[(i + C1) % Nb] >> 16) & 0xFF] << 16) | \
                                   (Sbox[(block[(i + C2) % Nb] >> 8) & 0xFF] << 8) |   \
                                   (Sbox[(block[(i + C3) % Nb]) & 0xFF]))

/*
 * Core encrypt routines, expecting word32 inputs read big-endian
 * from the byte-oriented input stream.
 */
static void aes_encrypt_nb_4(AESContext *ctx, word32 *block)  //表示進行4輪加密
{
   int              i;
   static const int C1 = 1, C2 = 2, C3 = 3, Nb = 4;
   word32 *         keysched = ctx->keysched;
   word32           newstate[4];

   for (i = 0; i < ctx->Nr - 1; i++) {  //進行9輪循環
      ADD_ROUND_KEY_4;                  //與128位密鑰異或
      MAKEWORD(0);
      MAKEWORD(1);
      MAKEWORD(2);
      MAKEWORD(3);
      MOVEWORD(0);
      MOVEWORD(1);
      MOVEWORD(2);
      MOVEWORD(3);
   }
   ADD_ROUND_KEY_4;

   LASTWORD(0);
   LASTWORD(1);
   LASTWORD(2);
   LASTWORD(3);

   MOVEWORD(0);
   MOVEWORD(1);
   MOVEWORD(2);
   MOVEWORD(3);
   ADD_ROUND_KEY_4;
}
#undef MAKEWORD
#undef LASTWORD

/*
 * Macros for the decryption routine. There are three decryption
 * cores, for Nb=4,6,8.
 */
#define MAKEWORD(i) (newstate[i] = (D0[(block[i] >> 24) & 0xFF] ^             \
                                    D1[(block[(i + C1) % Nb] >> 16) & 0xFF] ^ \
                                    D2[(block[(i + C2) % Nb] >> 8) & 0xFF] ^  \
                                    D3[block[(i + C3) % Nb] & 0xFF]))
#define LASTWORD(i) (newstate[i] = (Sboxinv[(block[i] >> 24) & 0xFF] << 24) |             \
                                   (Sboxinv[(block[(i + C1) % Nb] >> 16) & 0xFF] << 16) | \
                                   (Sboxinv[(block[(i + C2) % Nb] >> 8) & 0xFF] << 8) |   \
                                   (Sboxinv[(block[(i + C3) % Nb]) & 0xFF]))

/*
 * Core decrypt routines, expecting word32 inputs read big-endian
 * from the byte-oriented input stream.
 */
static void aes_decrypt_nb_4(AESContext *ctx, word32 *block)
{
   int              i;
   static const int C1 = 4 - 1, C2 = 4 - 2, C3 = 4 - 3, Nb = 4;
   word32 *         keysched = ctx->invkeysched;
   word32           newstate[4];
   for (i = 0; i < ctx->Nr - 1; i++) {
      ADD_ROUND_KEY_4;
      MAKEWORD(0);
      MAKEWORD(1);
      MAKEWORD(2);
      MAKEWORD(3);
      MOVEWORD(0);
      MOVEWORD(1);
      MOVEWORD(2);
      MOVEWORD(3);
   }
   ADD_ROUND_KEY_4;
   LASTWORD(0);
   LASTWORD(1);
   LASTWORD(2);
   LASTWORD(3);
   MOVEWORD(0);
   MOVEWORD(1);
   MOVEWORD(2);
   MOVEWORD(3);
   ADD_ROUND_KEY_4;
}
/*
 * Set up an AESContext. `keylen' and `blocklen' are measured in
 * bytes; each can be either 16 (128-bit), 24 (192-bit), or 32
 * (256-bit).
 */
static void aes_setup(
   AESContext *   ctx,
   int            blocklen,
   unsigned char *key,
   int            keylen)
{
   int i, j, Nk, rconst;

   assert(blocklen == 16 || blocklen == 24 || blocklen == 32);
   assert(keylen == 16 || keylen == 24 || keylen == 32);

   /*
     * Basic parameters. Words per block, words in key, rounds.
     */
   Nk      = keylen / 4;
   ctx->Nb = blocklen / 4;
   ctx->Nr = 6 + (ctx->Nb > Nk ? ctx->Nb : Nk);

   /*
     * Assign core-function pointers.
     */
   //    if (ctx->Nb == 8)
   //	ctx->encrypt = aes_encrypt_nb_8, ctx->decrypt = aes_decrypt_nb_8;
   //    else if (ctx->Nb == 6)
   //	ctx->encrypt = aes_encrypt_nb_6, ctx->decrypt = aes_decrypt_nb_6;
   //    else if (ctx->Nb == 4)
   ctx->encrypt = aes_encrypt_nb_4, ctx->decrypt = aes_decrypt_nb_4;

   /*
     * Now do the key setup itself.
     */
   rconst = 1;
   for (i = 0; i < (ctx->Nr + 1) * ctx->Nb; i++) {
      if (i < Nk)
         ctx->keysched[i] = GET_32BIT_MSB_FIRST(key + 4 * i);
      else {
         word32 temp = ctx->keysched[i - 1];
         if (i % Nk == 0) {
            int a, b, c, d;
            a      = (temp >> 16) & 0xFF;
            b      = (temp >> 8) & 0xFF;
            c      = (temp >> 0) & 0xFF;
            d      = (temp >> 24) & 0xFF;
            temp   = Sbox[a] ^ rconst;
            temp   = (temp << 8) | Sbox[b];
            temp   = (temp << 8) | Sbox[c];
            temp   = (temp << 8) | Sbox[d];
            rconst = mulby2(rconst);
         }
         else if (i % Nk == 4 && Nk > 6) {
            int a, b, c, d;
            a    = (temp >> 24) & 0xFF;
            b    = (temp >> 16) & 0xFF;
            c    = (temp >> 8) & 0xFF;
            d    = (temp >> 0) & 0xFF;
            temp = Sbox[a];
            temp = (temp << 8) | Sbox[b];
            temp = (temp << 8) | Sbox[c];
            temp = (temp << 8) | Sbox[d];
         }
         ctx->keysched[i] = ctx->keysched[i - Nk] ^ temp;
      }
   }

   /*
     * Now prepare the modified keys for the inverse cipher.
     */
   for (i = 0; i <= ctx->Nr; i++) {
      for (j = 0; j < ctx->Nb; j++) {
         word32 temp;
         temp = ctx->keysched[(ctx->Nr - i) * ctx->Nb + j];
         if (i != 0 && i != ctx->Nr) {
            /*
             * Perform the InvMixColumn operation on i. The D
             * tables give the result of InvMixColumn applied
             * to Sboxinv on individual bytes, so we should
             * compose Sbox with the D tables for this.
             */
            int a, b, c, d;
            a    = (temp >> 24) & 0xFF;
            b    = (temp >> 16) & 0xFF;
            c    = (temp >> 8) & 0xFF;
            d    = (temp >> 0) & 0xFF;
            temp = D0[Sbox[a]];
            temp ^= D1[Sbox[b]];
            temp ^= D2[Sbox[c]];
            temp ^= D3[Sbox[d]];
         }
         ctx->invkeysched[i * ctx->Nb + j] = temp;
      }
   }
}



__declspec(dllexport) void AES_encrypt(unsigned char *k, int k_len, unsigned *data)
{
   AESContext NewAes;
   memset(&NewAes, 0, sizeof(AESContext));
   aes_setup(&NewAes, 16, k, k_len);
   aes_encrypt_nb_4(&NewAes, data);
}

__declspec(dllexport) void AES_decrypt(unsigned char *k, int k_len, unsigned *data)
{
   AESContext NewAes;
   memset(&NewAes, 0, sizeof(AESContext));
   aes_setup(&NewAes, 16, k, k_len);
   aes_decrypt_nb_4(&NewAes, data);
}



__declspec(dllexport) void AES_ByteEncrypt(unsigned char *k, int k_len, unsigned char *data)
{
   unsigned int *data_int = (unsigned int *)(data);
   AES_encrypt(k, k_len, data_int);
}
__declspec(dllexport) void AES_ByteDecrypt(unsigned char *k, int k_len, unsigned char *data)
{
   unsigned int *data_int = (unsigned int *)(data);
   AES_decrypt(k, k_len, data_int);
}

           

繼續閱讀