XXTea加密 c++ 与 js 互相加解密
- 要做加密功能: 1.利用c++绑定调用c++实现加密,
- 本次选择第二种方法:服务器用c++ 实现XXTea加密算法,客户端用js实现XXtea加密算法
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;
}
#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要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。具体实现方法:
- char* base64Encode(char const* origSigned, unsigned origLength)
- {
- static const char base64Char[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- unsigned char const* orig = (unsigned char const*)origSigned;
- if (orig == NULL) return NULL;
- unsigned const numOrig24BitValues = origLength/3;
- bool havePadding = origLength > numOrig24BitValues*3;
- bool havePadding2 = origLength == numOrig24BitValues*3 + 2;
- unsigned const numResultBytes = 4*(numOrig24BitValues + havePadding);
- char* result = new char[numResultBytes+1];
- // Map each full group of 3 input bytes into 4 output base-64 characters:
- unsigned i;
- for (i = 0; i < numOrig24BitValues; ++i)
- {
- result[4*i+0] = base64Char[(orig[3*i]>>2)&0x3F];
- result[4*i+1] = base64Char[(((orig[3*i]&0x3)<<4) | (orig[3*i+1]>>4))&0x3F];
- result[4*i+2] = base64Char[(((orig[3*i+1]&0x0f)<<2) | (orig[3*i+2]>>6))&0x3F];
- result[4*i+3] = base64Char[(orig[3*i+2]&0x3f)&0x3F];
- }
- // Now, take padding into account. (Note: i == numOrig24BitValues)
- if (havePadding)
- {
- result[4*i+0] = base64Char[(orig[3*i]>>2)&0x3F];
- if (havePadding2)
- {
- result[4*i+1] = base64Char[(((orig[3*i]&0x3)<<4) | (orig[3*i+1]>>4))&0x3F];
- result[4*i+2] = base64Char[((orig[3*i+1]&0x0f)<<2)&0x3F];
- }
- else
- {
- result[4*i+1] = base64Char[((orig[3*i]&0x3)<<4)&0x3F];
- result[4*i+2] = '=';
- }
- result[4*i+3] = '=';
- }
- result[numResultBytes] = '/0';
- return result;
- }
XXTea加密 c++ 与 js 互相加解密相关推荐
- JS RC4加解密报文
JS RC4加解密 RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变.它加解密使用相同的密钥,因此也属于对称加密算法.RC4加密算法原理 , 对明文使用同一个密钥异或两 ...
- 学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密
学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密 技术标签: RSA AES RSA AES 混合加密 整合 前言: 为了提高安全性采用了RSA,但 ...
- 五种常见的加密方式及常用的加解密工具
如果你是互联网公司的信息安全从业者,那么你可能会经常需要处理撞库事件,撞库是黑客的无聊"恶作剧".黑客收集已经在互联网上泄露的用户和密码信息,生成对应的字典表,并尝试批量登录其他网 ...
- android cocoscreator jsc js 间加解密(六)
前言 前面 学了 aandroid cocoscreator 热更新 超详细篇(五) 这章 主要学习 cocoscreator 构建后 jsc 与js 文件 之间相互转化(加解密)并实际测试. 可以配 ...
- aes解密算法 java_AES算法实现Java和JS互通加解密
实际开发中客户端与服务端的通信内容往往需要通过密文传输,本文将介绍可以实现Java与js的互相加解密的AES加密方式 Java语言实现 public class AESTest { //static ...
- JS逆向加解密——python 实现AES加解密
前言 写爬虫项目,做JS逆向或者APP逆向时,经常遇到网站的很多参数都经过AES加密解密,用python实现AES加解密是非常简单的,免去了扣JS代码,并且实现格式固定,所以本文提供实现好的AES加解 ...
- 某段\x 16进制和unicode加密与混淆js代码的解密与反加密
某天,在鼓捣一个ems系统,想用来做成新闻资讯类网站.弄了好多天,各个框架和结构都差不多了,重新调整了结构,一个偶然的机会,发现搜索框点击的时候不能自动清空先前的内容,于是想添加一段js代码去修改,找 ...
- aes加密php源码,AES加解密类源码 · ThinkPHP5高阶实战教程 --诠释为API开发而生 · 看云...
# AES加解密类源码 > 根据网络整理 ~~~ /** * Created by PhpStorm. * Power by Mikkle * QQ:776329498 * Date: 2017 ...
- gentry同态加密算法_IBM同态加密技术重大突破,加解密速度可提升75倍
无需先解密出明文文件才可以编辑加密数据,也无需完工后再加密回去,这就是全球顶尖的加密技术--同态加密,但性能一直是这种技术的最大问题.最近,由于IBM重写了其C++同态加密库,加解密速度最高可提升75 ...
最新文章
- 关于C#开发山寨操作系统,程序语言,浏览器,IDE,Office,Photoshop等大型程序的可行性歪论及意义...
- foo、bar、baz三兄弟
- 2018.09.14 codechef Milestone(随机化算法)
- Cissp-【第6章 安全评估与测试】-2021-3-15(661页-706页)
- C#.NET常见问题(FAQ)-命名空间namespace如何理解
- php excel 导入配置,Thinkphp3.2.3整合PHPexcel进行导入导出操作
- P6477-[NOI Online #2 提高组]子序列问题【线段树】
- 积分图像追踪目标 (一)
- 360解压电脑版安装包_迅捷pdf转换器电脑版安装包下载-迅迅捷pdf转换器安装包免费下载...
- 年会季来临,年会会场管理一招搞定!
- 【UVA10256】The Great Divide(凸包相离判定)
- 小程序保存图片相册无响应
- P2619 [国家集训队]Tree I(wqs二分)
- C/C++中取地址符的语义
- linux播放器安装包下载地址,linux安装MPLAYER播放器
- 1.4 数列极限概念的推广
- Excel 相同名称或ID的 内容 合并起来 同列不同内容剃加
- NPOI操作Excel 让单元格的内容换行
- 咸鱼的 GitHub 情报 | 20191229 期
- LOTO 示波器—安卓手机示波器如何使用?
热门文章
- Android NDK 编译PjSip 2.6 之 搭建PjSip apk开发环境 (三)
- Git下载慢,经常超时 关联远程仓库
- 舞台音效控制软件_Sports Sounds Pro
- PingPongFTP
- C++ 封装一个简单的String
- mysql 修改密码
- 用d3.js画出带米字格的汉字
- linux怎么卸载socat,linux socat命令
- django之处理execl和zip
- ncode2019安装教程_nCode DesignLife|ANSYS 17.0 nCode DesignLife下载 v12.0免费版 附使用教程 - 121下载站...