/* 使用密钥密文对密码密文解密(若字符串keyLen的长度不是32, 或inLen不是16的倍数, 解密会失败, return 0) cipherKey--长度为32的字符串, 密钥密文 keyLen--密钥密文的长度, 应是32 in--密码密文, 字符串 inLen--密码密文的长度, 应是16的倍数 return--解密后的密码明文, 字符串. 外部使用后应首先判断是否为0; 若不为0, 应free */ char * decrypt_str_withCipherKey(char * cipherKey, int keyLen, char * in, int inLen) { char *strKey = 0;/*长度为16的16进制字符串表示的密钥明文*/ unsigned char keyBytes[8];/*8字节密钥明文*/ if (keyLen != 32) { return 0; } /*首先对密钥密文进行解密, 得到16进制表示的密钥明文*/ strKey = decrypt_str(sKey4Key, cipherKey, keyLen); if (strKey == 0) {/*解密失败*/ return 0; } /*然后对16进制表示的密钥明文编码成8字节的密钥密文*/ hexStr2bytes(strKey, keyLen / 2, (char *)keyBytes); free(strKey); /*再使用8字节密钥明文对密码密文进行解密*/ return decrypt_str(keyBytes, in, inLen); }
static int l_decrypt(lua_State *L) { size_t keyLen, dataLen, outLen, hexDataLen; const char *key = luaL_checklstring(L, 1, &keyLen); const char *hexData = luaL_checklstring(L, 2, &hexDataLen); dataLen = hexDataLen/2; char data[dataLen]; convert_from_hex(hexData, data, dataLen); char decryptBuffer[dataLen]; int res = decrypt_str(decryptBuffer, data, dataLen, key, &outLen); if (res != 1) return luaL_error(L, "Error decrypting value %d, data:%s, dataLen: %d", res, data, dataLen); luaL_Buffer b; luaL_buffinit(L, &b); luaL_addlstring(&b, decryptBuffer, outLen); luaL_pushresult(&b); return 1; }