我要在微信小程序中做一个计算器,只有一个输入框和一个输出框,用户在输入框中输入一个数字的密码(6-12位)后点计算按钮,系统会根据这个密码加上当前的时间值 做参数,使用TEA算法计算出一个新的密码,15分钟内有效。下面是写好的C代码,想做将它封装成DLL再调用,但是微信小程序是在微信的服务器上,DLL是不会让随便上传和使用吧!哪位大侠可以将这个函数转成可以直接写在微信小程序里的代码,分全送了!!!
test.c源代码如下:
//========================================采用TEA算法,只有滚动密码功能========================================================================================================================
#define mSecDataTempPd 0x5aa555aa
const DWORD coSecDataTempPd = (mSecDataTempPd ^ 0x9e3779b9);
const DWORD coKeyTempPd[] = {0x126f2e1b,0xd1ef3da9,0xa7469115,0x6d83ea82};
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pData_fGet1TimePd 管理密码(输入),6-12位,无符号字符型数组,数组长度12字节,二机制,比如,密码123456,则输入为{0x01,0x02,0x03,0x04,0x05,0x06,0xff,0xff,0xff,0xff,0xff,0xff}
dTime_fGet1TimePd 时间,以1970年1月1日0点0分0秒到当前时间,所经历的秒钟数,无符号long型变量
pPd_fGet1TimePd 临时密码,输出,无符号字符型数组,长度8字节,二进制。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
void fGet1TimePd(BYTE* pData_fGet1TimePd,DWORD dTime_fGet1TimePd,BYTE* pPd_fGet1TimePd)
{
DWORD dData_fGet1TimePd[2];
BYTE* pTemp_fGet1TimePd = (BYTE*)dData_fGet1TimePd;
BYTE bTemp_fGet1TimePd;
dTime_fGet1TimePd /= _TempPdCyc_;
for(bTemp_fGet1TimePd = 0;bTemp_fGet1TimePd < 8;bTemp_fGet1TimePd ++)
{
if(bTemp_fGet1TimePd < 6)
{
pTemp_fGet1TimePd[bTemp_fGet1TimePd] = ((pData_fGet1TimePd[bTemp_fGet1TimePd * 2] << 4) & 0xf0) | (pData_fGet1TimePd[bTemp_fGet1TimePd * 2 + 1] & 0x0f);
}
else
{
pTemp_fGet1TimePd[bTemp_fGet1TimePd] = 0;
}
if(bTemp_fGet1TimePd > 3)
{
pTemp_fGet1TimePd[bTemp_fGet1TimePd] ^= (dTime_fGet1TimePd >> ((7 - bTemp_fGet1TimePd) * 8));
}
}
fEncryptTea(&dData_fGet1TimePd[0],&dData_fGet1TimePd[1]);
for(bTemp_fGet1TimePd = 0;bTemp_fGet1TimePd < 8;bTemp_fGet1TimePd ++)
{
pPd_fGet1TimePd[bTemp_fGet1TimePd] = (((pTemp_fGet1TimePd[bTemp_fGet1TimePd] >> 4) & 0x0f) ^ (pTemp_fGet1TimePd[bTemp_fGet1TimePd] & 0x0f)) % 10;
}
}
void fEncryptTea(DWORD *fData1_fEncryptTea,DWORD *fData2_fEncryptTea)
{
DWORD dTemp1_fEncryptTea = *fData1_fEncryptTea;
DWORD dTemp2_fEncryptTea = *fData2_fEncryptTea;
DWORD dSum_fEncryptTea = 0;
DWORD dDelta_fEncryptTea = coSecDataTempPd ^ mSecDataTempPd;
BYTE bTemp_fEncryptTea;
for (bTemp_fEncryptTea = 0;bTemp_fEncryptTea < 8;bTemp_fEncryptTea ++) //8轮运算(需要对应下面的解密核心函数的轮数一样)
{
dSum_fEncryptTea += dDelta_fEncryptTea;
dTemp1_fEncryptTea += ((dTemp2_fEncryptTea << 4) + coKeyTempPd[0]) ^ (dTemp2_fEncryptTea + dSum_fEncryptTea) ^ ((dTemp2_fEncryptTea >> 5) + coKeyTempPd[1]);
dTemp2_fEncryptTea += ((dTemp1_fEncryptTea << 4) + coKeyTempPd[2]) ^ (dTemp1_fEncryptTea + dSum_fEncryptTea) ^ ((dTemp1_fEncryptTea >> 5) + coKeyTempPd[3]);
}
fData1_fEncryptTea[0] = dTemp1_fEncryptTea;
fData2_fEncryptTea[0] = dTemp2_fEncryptTea;
}
test.h源代码如下:
#ifndef _tea_h_
#define _tea_h_
#define _TempPdCyc_ (15 * 60L) //(本地)动态密码周期参数,每次时间变化超过该周期,则动态密码更换一个,该参数以秒钟为单位,(15x60)表示900s(15分钟)。
void fEncryptTea(DWORD *fData1_fEncryptTea,DWORD *fData2_fEncryptTea);
void fDecryptTea(DWORD *fData1_fDecryptTea,DWORD *fData2_fDecryptTea);
#endif
以上就是全部的计算算法代码,请大侠转成在微信小程序中可以使用的语言,在线等
代码里有个循环加的逻辑,是不是用到了 DWORD 型溢出? JS 里 number 都是 double 类型的,没有溢出效果。所以需要测试下。
---- 更新 ----
补充了和 0xffffffff 按位与, 让 js 里的 number 表现如 DWORD。另,源码里的 dDelta_fEncryptTea 难道不就是 0x9e3779b9, 为什么要每次计算?
使用: