Example #1
0
/*
    使用密钥密文对密码密文解密(若字符串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);
    
}
Example #2
0
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;
}