📄 eps1000nd_md5_tea.c
字号:
(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define GG(a, b, c, d, x, s, ac) { \
(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
不难发现 FF,GG,HH,II除了调用F,G,H,I算法的不同外,其他的运算步骤一摸一样, 总结一下可以使用一个4*16的循环来完成MD5算法,
4代表FF,GG,HH,II四种算法,使用一个指针函数数组来完成F,G,H,I子程序的跳转,
16代表每一种算法下面的16个子运算.
再分析FGHI函数,均是对b,c,d进行操作,所以通过上述数组序列循环后,FGHI则会对数组中固定位置的数据进行运算,简化了运算步骤
;***********************************************************************************************
;****创 建 人:
;****创建日期:
;***********************************************************************************************
;****修 改 人:
;****修改日期:
;***********************************************************************************************/
// 设定一个函数指针数据,便于识别4个轮回的功能操作
code void (*MD5Func[])(void)={MD5F,MD5G,MD5H,MD5I};
void MD5Transform()
{
uint8 i,j;
//EA = 0;
PdataCopy(md5OldState,md5State,16); // 复制md5State 使用md5Temp参与MD5运算,运算结束后,新的state + 旧的state,得到最终MD5运算结果
for(i=0;i<4;i++)
{
for(j=0;j<16;j++)
{
//1.执行对应的FGHI运算 结果保存在MD5_R中
MD5Func[i]();
//2.(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac);
// (a) = ROTATE_LEFT ((a), (s));
// (a) += (b);
PD32Add_LE(md5AA,md5TEMP);
PD32Add_LE(md5AA,md5Buf + MD5_XI[i][j]);
Code2Pdata(md5TEMP,(uint16)(MD5_TI[i] + (j << 2)),4);
PD32Add_LE(md5AA,md5TEMP);
PD32Rlc_LE(md5AA,MD5_SI[i][j % 4],1);
PD32Add_LE(md5AA,md5BB);
//3.移动md5OldState中数据 使abcd->dabc->cdab->bcda->abcd...
// PdataCopy 本身使用了从后向前复制的方法 所以在oldState的移动中使用两次内存拷贝就能实现功能
PdataCopy(md5BB,md5AA,16); //从A开始 复制到 B中 运算后md5TEMP中保存了MD5D
PdataCopy(md5AA,md5TEMP,4); // 把D恢复到A中
}
}
for(i=0;i<16;i+=4) // state += oldState
{
PD32Add_LE(md5State + i,md5OldState + i);
}
//EA =1;
}
/***********************************************************************************************
;****函数名称:MD5Prefill
;****入口参数:md5In len
;****出口参数:
;****全局变量:
;****调用模块:
;****说 明: 从md5In中提取len个数据填充到md5Buf中,
根据EPS1000ND-8K的特殊性,输入txt长度不超过55,key长度为16
所以此处不做长度判断,每次填充均从md5Buf的第1位开始
填充完毕后,立即进行md5Transform运算
;***********************************************************************************************
;****创 建 人:
;****创建日期:
;***********************************************************************************************
;****修 改 人:
;****修改日期:
;***********************************************************************************************/
void MD5Prefill(uint8 pdata *md5In,uint8 len)
{
// 1.拷贝md5In 到 md5Buf
PdataCopy(md5Buf,md5In,len); // 复制md5In 到 md5Buf
// 2.md5Buf中剩余数据 填充PADING和oldCount
PdataFill(md5Buf + len ,0,64 - len);
*(uint8 pdata *)(md5Buf + len) = 0x80; // 填充padding
// 填充MD5数据长度
*(uint8 pdata *)(md5Buf + 56) = (uint8)(len << 3);
*(uint8 pdata *)(md5Buf + 57) = (len >> 5) + 0x02;
}
/***********************************************************************************************
;****函数名称:MD5HMAC
;****入口参数:
;****出口参数:
;****全局变量:
;****调用模块:
;****说 明:
;***********************************************************************************************
;****创 建 人:
;****创建日期:
;***********************************************************************************************
;****修 改 人:
;****修改日期:
;***********************************************************************************************/
uint8 MD5HMAC()
{
//uint8 i;
// 1.判断是否已经打开文件
if(fileOpenInf->address == 0)
{
// 打开文件地址 空
return ERROR_NOTOPEN;
}
// 2.判断是否具有权限
if(EPSCheckAuthority((fileOpenInf->authority >> OFFSET_ENCRYPT) & 0x03))
{
return ERROR_NOTAUTHORITY;
}
// 3.读取第一个key文件 并进行第一次MD5运算
MD5Prefill(usbInBuf.bDat,usbInBuf.bDat[63]);
Code2Pdata(md5State,fileOpenInf->address,16);
//Code2Pdata(md5State,0x1a08,16);
// 4.进行第一次MD5运算
MD5Transform();
// 5.打开第二个KEY文件
// 定位usbInBuf中指定的文件
if(FILELocateID() != FILE_LOCATE_OK)
{
return ERROR_INDEX; // 如果文件打开错误,返回
}
// 6.判断是否具有权限
if(EPSCheckAuthority((fileOpenInf->authority >> OFFSET_ENCRYPT) & 0x03))
{
return ERROR_NOTAUTHORITY;
}
// 7.读取第二个key文件
MD5Prefill(md5State,16);
Code2Pdata(md5State,filePtr + 8,16);
MD5Transform();
PdataCopy(usbOutBuf.bDat,md5State,16);
return RIGHT_TOKEN;
}
/***********************************************************************************************
;****函数名称:
;****入口参数:
;****出口参数:
;****全局变量:
;****调用模块:
;****说 明:
;***********************************************************************************************
;****创 建 人:
;****创建日期:
;***********************************************************************************************
;****修 改 人:
;****修改日期:
;***********************************************************************************************/
uint8 TEAEnde()
{
// 1.判断是否已经打开文件
if((fileOpenInf->address == 0) || (fileOpenInf->type != TEA_TYPE))
{
// 打开文件地址 空
return ERROR_NOTOPEN;
}
// 2.判断是否具有权限
if(EPSCheckAuthority((fileOpenInf->authority >> OFFSET_ENCRYPT) & 0x03))
{
return ERROR_NOTAUTHORITY;
}
// 3.初始化key数据
PdataCopy(teaBuf,usbInBuf.bDat,8); // 复制teaY teaZ
Code2Pdata(teaSum,(uint16)TEA_CONST,8); // 读取teaSum teaDelta
Code2Pdata(teaKey,fileOpenInf->address,16); // 读取tea文件
// 4.判断加密、解密
if(usbInBuf.bCommand[1] == 1)
{
PdataFill(teaSum,0,4);
TEAEncryption();
}
else if(usbInBuf.bCommand[1] == 2)
{
TEADecryption();
}
else
{
return ERROR_INDEX;
}
return RIGHT_TOKEN;
}
// teaTemp2 = (pIn << 4) + (teaKey[k1] ^ b) + (teaSum ^ (pIn >> 5)) + teaKey[k2];
void TEAProc(uint8 pdata *pIn,uint8 k1,uint8 k2)
{
PdataFill(teaTemp2,0,4);
PdataCopy(teaTemp1,pIn,4); // temp1 = pIn
PD32Rlc_LE(teaTemp1,4,0); // teaTemp1 <<= 4
PD32Add_LE(teaTemp2,teaTemp1); // teaTemp2 += pIn << 4
PdataCopy(teaTemp1,teaKey + k1,4); // 复制teaKey
//PD32Xrl_LE(teaTemp1,pIn); // teaTemp1 ^= pIn
*(uint8 *)(teaTemp1 + 0) ^= *(uint8 *)(pIn + 0);
*(uint8 *)(teaTemp1 + 1) ^= *(uint8 *)(pIn + 1);
*(uint8 *)(teaTemp1 + 2) ^= *(uint8 *)(pIn + 2);
*(uint8 *)(teaTemp1 + 3) ^= *(uint8 *)(pIn + 3);
PD32Add_LE(teaTemp2,teaTemp1); // teaTemp2 += (teaKey[k1]) ^ pIn
PdataCopy(teaTemp1,pIn,4); // temp1 = pIn
PD32Rrc_LE(teaTemp1,5,0); // teaTemp1 >>= 5
//PD32Xrl_LE(teaTemp1,teaSum); // teaTemp ^= teaSum
*(uint8 *)(teaTemp1 + 0) ^= *(uint8 *)(teaSum + 0);
*(uint8 *)(teaTemp1 + 1) ^= *(uint8 *)(teaSum + 1);
*(uint8 *)(teaTemp1 + 2) ^= *(uint8 *)(teaSum + 2);
*(uint8 *)(teaTemp1 + 3) ^= *(uint8 *)(teaSum + 3);
PD32Add_LE(teaTemp2,teaTemp1); // teaTemp2 += (teaSum ^(b >> 5)
PD32Add_LE(teaTemp2,teaKey + k2); // a += teaKey[k2]
}
/***********************************************************************************************
;****函数名称:TEAEncription
;****入口参数:
;****出口参数:
;****全局变量:
;****调用模块:
;****说 明: TEA加密
;***********************************************************************************************
;****创 建 人:
;****创建日期:
;***********************************************************************************************
;****修 改 人:
;****修改日期:
;***********************************************************************************************/
void TEAEncryption()
{
uint8 i;
PdataFill(teaSum,0,4);
for(i=0;i<TEA_ROUNDS;i++)
{
//sum += delta
PD32Add_LE(teaSum,teaDelta);
//teaTemp2 = (z << 4) + (k[0] ^ z) + (sum ^ (z >> 5)) + k[4];
TEAProc(teaZ,0,4);
// y+= teaTemp2;
PD32Add_LE(teaY,teaTemp2);
//teaTemp2 = (y << 4) + (k[8] ^ y) + (sum ^ (y >> 5)) + k[12];
TEAProc(teaY,8,12);
PD32Add_LE(teaZ,teaTemp2);
}
PdataCopy(usbOutBuf.bDat,teaY,8); // 复制运算结果
}
/***********************************************************************************************
;****函数名称:TEADecription
;****入口参数:
;****出口参数:
;****全局变量:
;****调用模块:
;****说 明: TEA解密
;***********************************************************************************************
;****创 建 人:
;****创建日期:
;***********************************************************************************************
;****修 改 人:
;****修改日期:
;***********************************************************************************************/
void TEADecryption()
{
uint8 i;
for(i=0;i<TEA_ROUNDS;i++)
{
TEAProc(teaY,8,12);
PD32Sub_LE(teaZ,teaTemp2);
TEAProc(teaZ,0,4);
PD32Sub_LE(teaY,teaTemp2);
PD32Sub_LE(teaSum,teaDelta);
}
PdataCopy(usbOutBuf.bDat,teaY,8); // 复制运算结果
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -