资源简介
AES的S盒可以用扩展的欧几里德和费马定理来写,这里我采用费马定理。要注意的是S盒的求逆过程是在加瓦罗域下进行的,所以里面的所有乘法、除法、加法、减法都是在加瓦罗域下进行。
代码片段和文件信息
#include
#include
#include
#include
using namespace std;
#define DBYTE short unsigned int /*因为m(x)的最高项是8次方,所以总共有9项,所以就用2个字节来表示 */
#define BYTE unsigned char
DBYTE mx=0x011b; /* m(x)的那个多项式,表示成16进制 */
/*********************************确定一个字节的某一位是否为1***********************************/
int seekat7(BYTE temp)
{
if(temp & 0x80) return 1;
else return 0;
}
int seekat6(BYTE temp)
{
if(temp & 0x40) return 1;
else return 0;
}
int seekat5(BYTE temp)
{
if(temp & 0x20) return 1;
else return 0;
}
int seekat4(BYTE temp)
{
if(temp & 0x10) return 1;
else return 0;
}
int seekat3(BYTE temp)
{
if(temp & 0x08) return 1;
else return 0;
}
int seekat2(BYTE temp)
{
if(temp & 0x04) return 1;
else return 0;
}
int seekat1(BYTE temp)
{
if(temp & 0x02) return 1;
else return 0;
}
int seekat0(BYTE temp)
{
if(temp & 0x01) return 1;
else return 0;
}
/*******************************************************************************************************/
/*********************************一个用两个字节表示的数它的最高非0位是第几位***********************************/
int length(DBYTE temp)
{
int i=0;
while(1)
{
if(temp==0) break;
temp=temp>>1;
i++;
}
return i;
}
/*******************************************************************************************************/
/*一个字节在伽瓦罗域下自乘,返回自乘结果(这个是经过简化后的结果,有些位直接是等于0,有些位就看原来的那个字节在某一位是否为1.)*/
/*自己可以在草稿子上列一些每一位是等于哪些位的乘,有些项是可以消去的(相同的一项异或的结果为0)。总共有14位,自己列一下就清楚了*/
DBYTE mul(BYTE temp)
{
DBYTE out=0;
if(seekat7(temp)) out+=0x4000;
if(seekat6(temp)) out+=0x1000;
if(seekat5(temp)) out+=0x0400;
if(seekat4(temp)) out+=0x0100;
if(seekat3(temp)) out+=0x0040;
if(seekat2(temp)) out+=0x0010;
if(seekat1(temp)) out+=0x0004;
if(seekat0(temp)) out+=0x0001;
return out;
}
/*******************************************************************************************************/
/****两个字节在伽瓦罗域下的乘积,事实上和上面那个函数是一样的,只不过上面的那个函数是两个相同的字节相乘,结果可以简化********/
/**********************************在这里没办法化简,所以只能老老实实一位一位的列出来****************************/
DBYTE multwo(BYTE temp1BYTE temp2)
{
DBYTE out=0;
if(seekat7(temp1)*seekat7(temp2)) out+=0x4000;
if( (seekat7(temp1)*seekat6(temp2))^(seekat6(temp1)*seekat7(temp2))) out+=0x2000;
if( (seekat7(temp1)*seekat5(temp2))^(seekat6(temp1)*seekat6(temp2))^(seekat5(temp1)*seekat7(temp2))) out+=0x1000;
if( (seekat7(temp1)*seekat4(temp2))^(seekat6(temp1)*seekat5(temp2))^(seekat5(temp1)*seekat6(temp2))^(seekat4(temp1)*seekat7(temp2))) out+=0x0800;
if( (seekat7(temp1)*seekat3(temp2))^(seekat6(temp1)*seekat4(temp2))^(seekat5(temp1)*seekat5(temp2))^(seekat4(temp1)*seekat6(temp2))^(seekat3(temp1)*seekat7(temp2))) out+=0x0400;
if( (seekat7(temp1)*seekat2(temp2))^(seekat6(temp1)*seekat3(temp2))^(seekat5(temp1)*seekat4(temp2))^(seekat4(temp1)*seekat5(temp2))^(seekat3(temp1)*seekat6(temp2))^(seekat2(temp1)*seekat7(t
- 上一篇:自己用C++实现的RC4算法
- 下一篇:按优先数调度算法实现处理器调度的程序
相关资源
- AES加密解密系统 VC++6.0 实现
- AES密码算法C语言实现
- C语言 stm32 AES加密解密
- AES单片机加密解密 C语言源代码
- aes算法实现C++)
- AES任意文件长度加解密C语言实现
- aes加密算法matlab
- AES128 C语言实现源码及应用例程
- s盒的C语言实现,S盒.cpp文件
- CMAC(AES128)Verilog实现
- aes加密算法的verilog和c++代码
- AES加密源码使用C++实现
- AES算法源码~~~~~~~~~~~~
- zw_AES加密算法c语言实现代码.zip
- AES加密MFC程序源码
- C语言实现AES加密、解密算法
- AES加解密算法的源程序C语言版
- AES-128加密算法,C语言实现
- AES(ECB、CBC、CFB、CTR)128/192/256加密算
- C++ 使用AES算法对文本文件进行加密
- C++ AES算法ECB模式包含128192256三种密钥
- AES加密MFC实现
- aes加解密算法C语言实现
- AES128-cbc快速查表法
- C语言实现AES_ECB加密
- [C++]AES全文件加解密
- AES-CBC-128 C语言加解密
- 128192256 bitAES 高级加密标准 C代码
- AES 加密算法源代码20091025 C++版
- AES128/192/256加解密C语言源码
评论
共有 条评论