关于加密功能,客户端使用的是creator  用js开发的,服务器端用lua做的
  • 要做加密功能: 1.利用c++绑定调用c++实现加密,
                            好处:调用同一种方法,一次实现
                            坏处:c++绑定只能用在原生系统,如果是浏览器端将无法使用加密功能 
                      2.各自实现同一种算法
                            好处:各自实现,自己可以用任何方式实现
                            坏处:需要做到互相可以加解密
  • 本次选择第二种方法:服务器用c++ 实现XXTea加密算法,客户端用js实现XXtea加密算法
过程: 客户端: XXTea加密 ----> base64编码   -----》send到服务器 -----》服务器先base64解码 -----》XXtea解密 ---->得到原始数据
base64编码是为了将加密过后的不可见的字符转化为可见的字符串 再发送 (不然服务器接收不到...)
客户端代码: 
var TestXXTea = cc.Class({extends: cc.Component,statics: {keyString: "]\743f8/hr34hLuH",  //xxtea密钥 一般16位(也可以不是16位)xxtea_encrypt: function (str) {if (str == "") {return "";}str = utf16ToUtf8(str); //如果是中文解析可能会出问题,加密之前先转化为utf8格式var v = str2long(str, true);var k = str2long(this.keyString, false);if (k.length < 4) {k.length = 4;}var n = v.length - 1;var z = v[n], y = v[0], delta = 0x9E3779B9;var mx, e, p, q = Math.floor(6 + 52 / (n + 1)), sum = 0;while (0 < q--) {sum = sum + delta & 0xffffffff;e = sum >>> 2 & 3;for (p = 0; p < n; p++) {y = v[p + 1];mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);z = v[p] = v[p] + mx & 0xffffffff;}y = v[0];mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);z = v[n] = v[n] + mx & 0xffffffff;}str = long2str(v,false);return encode_base64(str);//加密过后用base64编码},xxtea_decrypt: function (str) {if (str == "") {return "";}str = decode_base64(str)var v = str2long(str, false);var k = str2long(this.keyString, false);if (k.length < 4) {k.length = 4;}var n = v.length - 1;var z = v[n], y = v[0], delta = 0x9E3779B9;var mx, e, p, q = Math.floor(6 + 52 / (n + 1)), sum = q * delta & 0xffffffff;while (sum != 0) {e = sum >>> 2 & 3;for (p = n; p > 0; p--) {z = v[p - 1];mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);y = v[p] = v[p] - mx & 0xffffffff;}z = v[n];mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);y = v[0] = v[0] - mx & 0xffffffff;sum = sum - delta & 0xffffffff;}var result = long2str(v,true);result = utf8ToUtf16(result);return result;},},
});function utf16ToUtf8(str) { //utf16转化utf8 解决中文乱码问题 var out, i, len, c;out = "";len = str.length;for (i = 0; i < len; i++) {c = str.charCodeAt(i); if ((c >= 0x0001) && (c <= 0x007F)) { out += str.charAt(i); } else if (c > 0x07FF) {out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));} else {out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));}}return out;
}function utf8ToUtf16(str) {var out, i, len, c;var char2, char3;out = "";len = str.length;i = 0;while (i < len) {c = str.charCodeAt(i++); switch (c >> 4) {case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:// 0xxxxxxxout += str.charAt(i - 1);break;case 12: case 13:// 110x xxxx   10xx xxxxchar2 = str.charCodeAt(i++);out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));break;case 14:// 1110 xxxx  10xx xxxx  10xx xxxxchar2 = str.charCodeAt(i++);char3 = str.charCodeAt(i++);out += String.fromCharCode(((c & 0x0F) << 12) |((char2 & 0x3F) << 6) |((char3 & 0x3F) << 0));break;}}return out;
}function long2str(v, w) {  //解密过程中将一个32位 数据转换成4个8位 的数据var vl = v.length;var n = (vl - 1) << 2;if (w) {var m = v[vl - 1];if ((m < n - 3) || (m > n)) return null;n = m;}for (var i = 0; i < vl; i++) {v[i] = String.fromCharCode(v[i] & 0xff,v[i] >> 8 & 0xff,v[i] >> 16 & 0xff,v[i] >> 24 & 0xff);}if (w) {return v.join('').substring(0, n);}else {return v.join('');}
}function str2long(s, w) { //加密过程中将4个8位的数据转化成一个32位的数据var len = s.length;var v = [];for (var i = 0; i < len; i += 4) {v[i >> 2] = s.charCodeAt(i)| s.charCodeAt(i + 1) << 8| s.charCodeAt(i + 2) << 16| s.charCodeAt(i + 3) << 24;}if (w) {v[v.length] = len;}return v;
}function encode_base64(input) {  //base64 编码 var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var output = ""; var chr1, chr2, chr3 = ""; var enc1, enc2, enc3, enc4 = ""; var i = 0;do { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++);enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63;if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; }output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4); chr1 = chr2 = chr3 = ""; enc1 = enc2 = enc3 = enc4 = ""; } while (i < input.length);return output;
}function decode_base64(input) { //base64解码 var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var output = ""; var chr1, chr2, chr3 = ""; var enc1, enc2, enc3, enc4 = ""; var i = 0;// remove all characters that are not A-Z, a-z, 0-9, +, /, or = var base64test = /[^A-Za-z0-9\+\/\=\n]/g; if (base64test.exec(input)) { alert("There were invalid base64 characters in the input text.\n" + "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" + "Expect errors in decoding."); } input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");do { enc1 = keyStr.indexOf(input.charAt(i++)); enc2 = keyStr.indexOf(input.charAt(i++)); enc3 = keyStr.indexOf(input.charAt(i++)); enc4 = keyStr.indexOf(input.charAt(i++));chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4;output = output + String.fromCharCode(chr1);if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); }chr1 = chr2 = chr3 = ""; enc1 = enc2 = enc3 = enc4 = "";} while (i < input.length);return output;
}
CPP文件 .h
#ifndef XXTEA_H
#define XXTEA_H#include <stddef.h> /* for size_t & NULL declarations */#if defined(_MSC_VER)typedef unsigned __int32 xxtea_long;#else#if defined(__FreeBSD__) && __FreeBSD__ < 5
/* FreeBSD 4 doesn't have stdint.h file */
#include <inttypes.h>
#else
#include <stdint.h>
#endiftypedef uint32_t xxtea_long;#endif /* end of if defined(_MSC_VER) */#define XXTEA_MX (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z)
#define XXTEA_DELTA 0x9e3779b9unsigned char *xxtea_encrypt(unsigned char *data, xxtea_long data_len, unsigned char *key, xxtea_long key_len, xxtea_long *ret_length);
unsigned char *xxtea_decrypt(unsigned char *data, xxtea_long data_len, unsigned char *key, xxtea_long key_len, xxtea_long *ret_length);#endif

.cpp

#include "xxtea.h"
#include <memory.h>
#include <stdlib.h>
#define XXTEA_MX (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z)
#define XXTEA_DELTA 0x9e3779b9
static void xxtea_long_encrypt(xxtea_long *v, xxtea_long len, xxtea_long *k)
{xxtea_long n = len - 1;xxtea_long z = v[n], y = v[0], p, q = 6 + 52 / (n + 1), sum = 0, e;if (n < 1) {return;}while (0 < q--) {sum += XXTEA_DELTA;e = sum >> 2 & 3;for (p = 0; p < n; p++) {y = v[p + 1];z = v[p] += XXTEA_MX;}y = v[0];z = v[n] += XXTEA_MX;}
}static void xxtea_long_decrypt(xxtea_long *v, xxtea_long len, xxtea_long *k)
{xxtea_long n = len - 1;xxtea_long z = v[n], y = v[0], p, q = 6 + 52 / (n + 1), sum = q * XXTEA_DELTA, e;if (n < 1) {return;}while (sum != 0) {e = sum >> 2 & 3;for (p = n; p > 0; p--) {z = v[p - 1];y = v[p] -= XXTEA_MX;}z = v[n];y = v[0] -= XXTEA_MX;sum -= XXTEA_DELTA;}
}static unsigned char *fix_key_length(unsigned char *key, xxtea_long key_len)
{unsigned char *tmp = (unsigned char *)malloc(16);memcpy(tmp, key, key_len);memset(tmp + key_len, '\0', 16 - key_len);return tmp;
}static xxtea_long *xxtea_to_long_array(unsigned char *data, xxtea_long len, int include_length, xxtea_long *ret_len) {xxtea_long i, n, *result;n = len >> 2;n = (((len & 3) == 0) ? n : n + 1);if (include_length) {result = (xxtea_long *)malloc((n + 1) << 2);result[n] = len;*ret_len = n + 1;} else {result = (xxtea_long *)malloc(n << 2);*ret_len = n;}memset(result, 0, n << 2);for (i = 0; i < len; i++) {result[i >> 2] |= (xxtea_long)data[i] << ((i & 3) << 3);}return result;
}static unsigned char *xxtea_to_byte_array(xxtea_long *data, xxtea_long len, int include_length, xxtea_long *ret_len) {xxtea_long i, n, m;unsigned char *result;n = len << 2;if (include_length) {m = data[len - 1];if ((m < n - 7) || (m > n - 4)) return NULL;n = m;}result = (unsigned char *)malloc(n + 1);for (i = 0; i < n; i++) {result[i] = (unsigned char)((data[i >> 2] >> ((i & 3) << 3)) & 0xff);}result[n] = '\0';*ret_len = n;return result;
}static unsigned char *do_xxtea_encrypt(unsigned char *data, xxtea_long len, unsigned char *key, xxtea_long *ret_len) {unsigned char *result;xxtea_long *v, *k, v_len, k_len;v = xxtea_to_long_array(data, len, 1, &v_len);k = xxtea_to_long_array(key, 16, 0, &k_len);xxtea_long_encrypt(v, v_len, k);result = xxtea_to_byte_array(v, v_len, 0, ret_len);free(v);free(k);return result;
}static unsigned char *do_xxtea_decrypt(unsigned char *data, xxtea_long len, unsigned char *key, xxtea_long *ret_len) {unsigned char *result;xxtea_long *v, *k, v_len, k_len;v = xxtea_to_long_array(data, len, 0, &v_len);k = xxtea_to_long_array(key, 16, 0, &k_len);xxtea_long_decrypt(v, v_len, k);result = xxtea_to_byte_array(v, v_len, 1, ret_len);free(v);free(k);return result;
}unsigned char *xxtea_encrypt(unsigned char *data, xxtea_long data_len, unsigned char *key, xxtea_long key_len, xxtea_long *ret_length)
{unsigned char *result;*ret_length = 0;if (key_len < 16) {unsigned char *key2 = fix_key_length(key, key_len);result = do_xxtea_encrypt(data, data_len, key2, ret_length);free(key2);}else{result = do_xxtea_encrypt(data, data_len, key, ret_length);}return result;
}unsigned char *xxtea_decrypt(unsigned char *data, xxtea_long data_len, unsigned char *key, xxtea_long key_len, xxtea_long *ret_length)
{unsigned char *result;*ret_length = 0;if (key_len < 16) {unsigned char *key2 = fix_key_length(key, key_len);result = do_xxtea_decrypt(data, data_len, key2, ret_length);free(key2);}else{result = do_xxtea_decrypt(data, data_len, key, ret_length);}return result;
}
   base64加密规则如下:    http://blog.csdn.net/u013685499/article/details/44916023
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
具体实现方法:
第一个字节,根据源字节的第一个字节处理。
规则:源第一字节右移两位,去掉低2位,高2位补零。
既:00 + 高6位
第二个字节,根据源字节的第一个字节和第二个字节联合处理。
规则如下,第一个字节高6位去掉然后左移四位,第二个字节右移四位
即:源第一字节低2位 + 源第2字节高4位
第三个字节,根据源字节的第二个字节和第三个字节联合处理,
规则第二个字节去掉高4位并左移两位(得高6位),第三个字节右移6位并去掉高6位(得低2位),相加即可
第四个字节,规则,源第三字节去掉高2位即可。
用更接近于编程的思维来说,编码的过程是这样的:
第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符。
然后将第一个字符与0x03(00000011)进行与(&)操作并左移4位,接着第二个字符右移4位与前者相或(|),即获得第二个目标字符。
再将第二个字符与0x0f(00001111)进行与(&)操作并左移2位,接着第三个字符右移6位与前者相或(|),获得第三个目标字符。
最后将第三个字符与0x3f(00111111)进行与(&)操作即获得第四个目标字符。
在以上的每一个步骤之后,再把结果与 0x3F 进行 AND 位操作,就可以得到编码后的字符了。
可是等等……聪明的你可能会问到,原文的字节数量应该是3的倍数啊,如果这个条件不能满足的话,那该怎么办呢?
我们的解决办法是这样的:原文剩余的字节根据编码规则继续单独转(1变2,2变3;不够的位数用0补全),再用=号补满4个字节。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。因为:一个原字节至少会变成两个目标字节。
所以余数任何情况下都只可能是0,1,2这三个数中的一个。如果余数是0的话,就表示原文字节数正好是3的倍数(最理想的情况)。如果是1的话,转成2个Base64编码字符,为了让Base64编码是4的倍数,就要补2个等号;同理,如果是2的话,就要补1个等号。
以下是实现的源代码:
  1. char* base64Encode(char const* origSigned, unsigned origLength)
  2. {
  3.   static const char base64Char[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  4. unsigned char const* orig = (unsigned char const*)origSigned;
  5. if (orig == NULL) return NULL;
  6. unsigned const numOrig24BitValues = origLength/3;
  7. bool havePadding = origLength > numOrig24BitValues*3;
  8. bool havePadding2 = origLength == numOrig24BitValues*3 + 2;
  9. unsigned const numResultBytes = 4*(numOrig24BitValues + havePadding);
  10. char* result = new char[numResultBytes+1];
  11. // Map each full group of 3 input bytes into 4 output base-64 characters:
  12. unsigned i;
  13. for (i = 0; i < numOrig24BitValues; ++i)
  14. {
  15. result[4*i+0] = base64Char[(orig[3*i]>>2)&0x3F];
  16. result[4*i+1] = base64Char[(((orig[3*i]&0x3)<<4) | (orig[3*i+1]>>4))&0x3F];
  17. result[4*i+2] = base64Char[(((orig[3*i+1]&0x0f)<<2) | (orig[3*i+2]>>6))&0x3F];
  18. result[4*i+3] = base64Char[(orig[3*i+2]&0x3f)&0x3F];
  19. }
  20. // Now, take padding into account.  (Note: i == numOrig24BitValues)
  21. if (havePadding)
  22. {
  23. result[4*i+0] = base64Char[(orig[3*i]>>2)&0x3F];
  24. if (havePadding2)
  25. {
  26. result[4*i+1] = base64Char[(((orig[3*i]&0x3)<<4) | (orig[3*i+1]>>4))&0x3F];
  27. result[4*i+2] = base64Char[((orig[3*i+1]&0x0f)<<2)&0x3F];
  28. }
  29. else
  30. {
  31. result[4*i+1] = base64Char[((orig[3*i]&0x3)<<4)&0x3F];
  32. result[4*i+2] = '=';
  33. }
  34. result[4*i+3] = '=';
  35. }
  36. result[numResultBytes] = '/0';
  37. return result;
  38. }

XXTea加密 c++ 与 js 互相加解密相关推荐

  1. JS RC4加解密报文

    JS RC4加解密 RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变.它加解密使用相同的密钥,因此也属于对称加密算法.RC4加密算法原理 , 对明文使用同一个密钥异或两 ...

  2. 学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密

    学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密 技术标签: RSA  AES  RSA AES  混合加密  整合 前言:    为了提高安全性采用了RSA,但 ...

  3. 五种常见的加密方式及常用的加解密工具

    如果你是互联网公司的信息安全从业者,那么你可能会经常需要处理撞库事件,撞库是黑客的无聊"恶作剧".黑客收集已经在互联网上泄露的用户和密码信息,生成对应的字典表,并尝试批量登录其他网 ...

  4. android cocoscreator jsc js 间加解密(六)

    前言 前面 学了 aandroid cocoscreator 热更新 超详细篇(五) 这章 主要学习 cocoscreator 构建后 jsc 与js 文件 之间相互转化(加解密)并实际测试. 可以配 ...

  5. aes解密算法 java_AES算法实现Java和JS互通加解密

    实际开发中客户端与服务端的通信内容往往需要通过密文传输,本文将介绍可以实现Java与js的互相加解密的AES加密方式 Java语言实现 public class AESTest { //static ...

  6. JS逆向加解密——python 实现AES加解密

    前言 写爬虫项目,做JS逆向或者APP逆向时,经常遇到网站的很多参数都经过AES加密解密,用python实现AES加解密是非常简单的,免去了扣JS代码,并且实现格式固定,所以本文提供实现好的AES加解 ...

  7. 某段\x 16进制和unicode加密与混淆js代码的解密与反加密

    某天,在鼓捣一个ems系统,想用来做成新闻资讯类网站.弄了好多天,各个框架和结构都差不多了,重新调整了结构,一个偶然的机会,发现搜索框点击的时候不能自动清空先前的内容,于是想添加一段js代码去修改,找 ...

  8. aes加密php源码,AES加解密类源码 · ThinkPHP5高阶实战教程 --诠释为API开发而生 · 看云...

    # AES加解密类源码 > 根据网络整理 ~~~ /** * Created by PhpStorm. * Power by Mikkle * QQ:776329498 * Date: 2017 ...

  9. gentry同态加密算法_IBM同态加密技术重大突破,加解密速度可提升75倍

    无需先解密出明文文件才可以编辑加密数据,也无需完工后再加密回去,这就是全球顶尖的加密技术--同态加密,但性能一直是这种技术的最大问题.最近,由于IBM重写了其C++同态加密库,加解密速度最高可提升75 ...

最新文章

  1. 关于C#开发山寨操作系统,程序语言,浏览器,IDE,Office,Photoshop等大型程序的可行性歪论及意义...
  2. foo、bar、baz三兄弟
  3. 2018.09.14 codechef Milestone(随机化算法)
  4. Cissp-【第6章 安全评估与测试】-2021-3-15(661页-706页)
  5. C#.NET常见问题(FAQ)-命名空间namespace如何理解
  6. php excel 导入配置,Thinkphp3.2.3整合PHPexcel进行导入导出操作
  7. P6477-[NOI Online #2 提高组]子序列问题【线段树】
  8. 积分图像追踪目标 (一)
  9. 360解压电脑版安装包_迅捷pdf转换器电脑版安装包下载-迅迅捷pdf转换器安装包免费下载...
  10. 年会季来临,年会会场管理一招搞定!
  11. 【UVA10256】The Great Divide(凸包相离判定)
  12. 小程序保存图片相册无响应
  13. P2619 [国家集训队]Tree I(wqs二分)
  14. C/C++中取地址符的语义
  15. linux播放器安装包下载地址,linux安装MPLAYER播放器
  16. 1.4 数列极限概念的推广
  17. Excel 相同名称或ID的 内容 合并起来 同列不同内容剃加
  18. NPOI操作Excel 让单元格的内容换行
  19. 咸鱼的 GitHub 情报 | 20191229 期
  20. LOTO 示波器—安卓手机示波器如何使用?

热门文章

  1. Android NDK 编译PjSip 2.6 之 搭建PjSip apk开发环境 (三)
  2. Git下载慢,经常超时 关联远程仓库
  3. 舞台音效控制软件_Sports Sounds Pro
  4. PingPongFTP
  5. C++ 封装一个简单的String
  6. mysql 修改密码
  7. 用d3.js画出带米字格的汉字
  8. linux怎么卸载socat,linux socat命令
  9. django之处理execl和zip
  10. ncode2019安装教程_nCode DesignLife|ANSYS 17.0 nCode DesignLife下载 v12.0免费版 附使用教程 - 121下载站...