微信小程序中如何使用C++源代码,求大侠将这个算法函数转成JS可执行的代码?

我要在微信小程序中做一个计算器,只有一个输入框和一个输出框,用户在输入框中输入一个数字的密码(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

以上就是全部的计算算法代码,请大侠转成在微信小程序中可以使用的语言,在线等

阅读 4.8k
3 个回答

代码里有个循环加的逻辑,是不是用到了 DWORD 型溢出? JS 里 number 都是 double 类型的,没有溢出效果。所以需要测试下。

---- 更新 ----

补充了和 0xffffffff 按位与, 让 js 里的 number 表现如 DWORD。另,源码里的 dDelta_fEncryptTea 难道不就是 0x9e3779b9, 为什么要每次计算?

const mSecDataTempPd = 0x5aa555aa;
const coSecDataTempPd = mSecDataTempPd ^ 0x9e3779b9 & 0xffffffff;
const KEY = [0x126f2e1b, 0xd1ef3da9, 0xa7469115, 0x6d83ea82];

const PERIOD_CYCLE = 15 * 60;

/**
* @param {Uint8Array} passwd
* @param {Date} time
* @return {Uint8Array}
*/
function getTempPasswd(passwd, time) {
    var bytes = new Uint32Array(2);
    var byteView = new Uint8Array(bytes.buffer);

    var periodCount = Math.floor(time.valueOf() / 1000 / PERIOD_CYCLE);

    for(var i = 0; i < 8; i++) {
        if (i < 6) {
            byteView[i] = ((passwd[i * 2] << 4) & 0xf0) | (passwd[i * 2 + 1] & 0x0f);
        } else {
            byteView[i] = 0;
        }

        if(i > 3) {
            byteView[i] ^= periodCount >> ((7 - i) * 8);
        }
    }

    encryptTEA(bytes);

    var dataToReturn = new Uint8Array(8);
    for(var i=0; i<8; i++) {
        dataToReturn[i] = (((byteView[i] >> 4) & 0x0f) ^ (byteView[i] & 0x0f)) % 10;
    }
    return dataToReturn;
}

function encryptTEA(bytes) {
    var t1 = bytes[0];
    var t2 = bytes[1];
    var sum = 0;
    var delta = coSecDataTempPd ^ mSecDataTempPd & 0xffffffff;

    for(var i=0; i<8; i++) {
        sum = (sum + delta) & 0xffffffff;
        t1 += ((t2 << 4) + KEY[0]) ^ (t2 + sum) ^ ((t2 >> 5) + KEY[1]);
        t1 &= 0xffffffff;
        t2 += ((t1 << 4) + KEY[2]) ^ (t1 + sum) ^ ((t1 >> 5) + KEY[3]);
        t2 &= 0xffffffff;
    }
    bytes[0] = t1;
    bytes[1] = t2;
}

使用:


var p = new Uint8Array([0x01,0x02,0x03,0x04,0x05,0x06,0xff,0xff,0xff,0xff,0xff,0xff]);
console.log(getTempPasswd(p, new Date()));
新手上路,请多包涵

没有人会吗?同样的疑问等解决!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题