?? eps1000nd_md5_tea.c
字號(hào):
(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); \
}
不難發(fā)現(xiàn) FF,GG,HH,II除了調(diào)用F,G,H,I算法的不同外,其他的運(yùn)算步驟一摸一樣, 總結(jié)一下可以使用一個(gè)4*16的循環(huán)來(lái)完成MD5算法,
4代表FF,GG,HH,II四種算法,使用一個(gè)指針函數(shù)數(shù)組來(lái)完成F,G,H,I子程序的跳轉(zhuǎn),
16代表每一種算法下面的16個(gè)子運(yùn)算.
再分析FGHI函數(shù),均是對(duì)b,c,d進(jìn)行操作,所以通過上述數(shù)組序列循環(huán)后,FGHI則會(huì)對(duì)數(shù)組中固定位置的數(shù)據(jù)進(jìn)行運(yùn)算,簡(jiǎn)化了運(yùn)算步驟
;***********************************************************************************************
;****創(chuàng) 建 人:
;****創(chuàng)建日期:
;***********************************************************************************************
;****修 改 人:
;****修改日期:
;***********************************************************************************************/
// 設(shè)定一個(gè)函數(shù)指針數(shù)據(jù),便于識(shí)別4個(gè)輪回的功能操作
code void (*MD5Func[])(void)={MD5F,MD5G,MD5H,MD5I};
void MD5Transform()
{
uint8 i,j;
//EA = 0;
PdataCopy(md5OldState,md5State,16); // 復(fù)制md5State 使用md5Temp參與MD5運(yùn)算,運(yùn)算結(jié)束后,新的state + 舊的state,得到最終MD5運(yùn)算結(jié)果
for(i=0;i<4;i++)
{
for(j=0;j<16;j++)
{
//1.執(zhí)行對(duì)應(yīng)的FGHI運(yùn)算 結(jié)果保存在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.移動(dòng)md5OldState中數(shù)據(jù) 使abcd->dabc->cdab->bcda->abcd...
// PdataCopy 本身使用了從后向前復(fù)制的方法 所以在oldState的移動(dòng)中使用兩次內(nèi)存拷貝就能實(shí)現(xiàn)功能
PdataCopy(md5BB,md5AA,16); //從A開始 復(fù)制到 B中 運(yùn)算后md5TEMP中保存了MD5D
PdataCopy(md5AA,md5TEMP,4); // 把D恢復(fù)到A中
}
}
for(i=0;i<16;i+=4) // state += oldState
{
PD32Add_LE(md5State + i,md5OldState + i);
}
//EA =1;
}
/***********************************************************************************************
;****函數(shù)名稱:MD5Prefill
;****入口參數(shù):md5In len
;****出口參數(shù):
;****全局變量:
;****調(diào)用模塊:
;****說(shuō) 明: 從md5In中提取len個(gè)數(shù)據(jù)填充到md5Buf中,
根據(jù)EPS1000ND-8K的特殊性,輸入txt長(zhǎng)度不超過55,key長(zhǎng)度為16
所以此處不做長(zhǎng)度判斷,每次填充均從md5Buf的第1位開始
填充完畢后,立即進(jìn)行md5Transform運(yùn)算
;***********************************************************************************************
;****創(chuàng) 建 人:
;****創(chuàng)建日期:
;***********************************************************************************************
;****修 改 人:
;****修改日期:
;***********************************************************************************************/
void MD5Prefill(uint8 pdata *md5In,uint8 len)
{
// 1.拷貝md5In 到 md5Buf
PdataCopy(md5Buf,md5In,len); // 復(fù)制md5In 到 md5Buf
// 2.md5Buf中剩余數(shù)據(jù) 填充PADING和oldCount
PdataFill(md5Buf + len ,0,64 - len);
*(uint8 pdata *)(md5Buf + len) = 0x80; // 填充padding
// 填充MD5數(shù)據(jù)長(zhǎng)度
*(uint8 pdata *)(md5Buf + 56) = (uint8)(len << 3);
*(uint8 pdata *)(md5Buf + 57) = (len >> 5) + 0x02;
}
/***********************************************************************************************
;****函數(shù)名稱:MD5HMAC
;****入口參數(shù):
;****出口參數(shù):
;****全局變量:
;****調(diào)用模塊:
;****說(shuō) 明:
;***********************************************************************************************
;****創(chuàng) 建 人:
;****創(chuàng)建日期:
;***********************************************************************************************
;****修 改 人:
;****修改日期:
;***********************************************************************************************/
uint8 MD5HMAC()
{
//uint8 i;
// 1.判斷是否已經(jīng)打開文件
if(fileOpenInf->address == 0)
{
// 打開文件地址 空
return ERROR_NOTOPEN;
}
// 2.判斷是否具有權(quán)限
if(EPSCheckAuthority((fileOpenInf->authority >> OFFSET_ENCRYPT) & 0x03))
{
return ERROR_NOTAUTHORITY;
}
// 3.讀取第一個(gè)key文件 并進(jìn)行第一次MD5運(yùn)算
MD5Prefill(usbInBuf.bDat,usbInBuf.bDat[63]);
Code2Pdata(md5State,fileOpenInf->address,16);
//Code2Pdata(md5State,0x1a08,16);
// 4.進(jìn)行第一次MD5運(yùn)算
MD5Transform();
// 5.打開第二個(gè)KEY文件
// 定位usbInBuf中指定的文件
if(FILELocateID() != FILE_LOCATE_OK)
{
return ERROR_INDEX; // 如果文件打開錯(cuò)誤,返回
}
// 6.判斷是否具有權(quán)限
if(EPSCheckAuthority((fileOpenInf->authority >> OFFSET_ENCRYPT) & 0x03))
{
return ERROR_NOTAUTHORITY;
}
// 7.讀取第二個(gè)key文件
MD5Prefill(md5State,16);
Code2Pdata(md5State,filePtr + 8,16);
MD5Transform();
PdataCopy(usbOutBuf.bDat,md5State,16);
return RIGHT_TOKEN;
}
/***********************************************************************************************
;****函數(shù)名稱:
;****入口參數(shù):
;****出口參數(shù):
;****全局變量:
;****調(diào)用模塊:
;****說(shuō) 明:
;***********************************************************************************************
;****創(chuàng) 建 人:
;****創(chuàng)建日期:
;***********************************************************************************************
;****修 改 人:
;****修改日期:
;***********************************************************************************************/
uint8 TEAEnde()
{
// 1.判斷是否已經(jīng)打開文件
if((fileOpenInf->address == 0) || (fileOpenInf->type != TEA_TYPE))
{
// 打開文件地址 空
return ERROR_NOTOPEN;
}
// 2.判斷是否具有權(quán)限
if(EPSCheckAuthority((fileOpenInf->authority >> OFFSET_ENCRYPT) & 0x03))
{
return ERROR_NOTAUTHORITY;
}
// 3.初始化key數(shù)據(jù)
PdataCopy(teaBuf,usbInBuf.bDat,8); // 復(fù)制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); // 復(fù)制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]
}
/***********************************************************************************************
;****函數(shù)名稱:TEAEncription
;****入口參數(shù):
;****出口參數(shù):
;****全局變量:
;****調(diào)用模塊:
;****說(shuō) 明: TEA加密
;***********************************************************************************************
;****創(chuàng) 建 人:
;****創(chuàng)建日期:
;***********************************************************************************************
;****修 改 人:
;****修改日期:
;***********************************************************************************************/
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); // 復(fù)制運(yùn)算結(jié)果
}
/***********************************************************************************************
;****函數(shù)名稱:TEADecription
;****入口參數(shù):
;****出口參數(shù):
;****全局變量:
;****調(diào)用模塊:
;****說(shuō) 明: TEA解密
;***********************************************************************************************
;****創(chuàng) 建 人:
;****創(chuàng)建日期:
;***********************************************************************************************
;****修 改 人:
;****修改日期:
;***********************************************************************************************/
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); // 復(fù)制運(yùn)算結(jié)果
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -