前言

前面 学了 aandroid cocoscreator 热更新 超详细篇(五)
这章 主要学习 cocoscreator 构建后 jsc 与js 文件 之间相互转化(加解密)并实际测试.
可以配置cocoscreator热更新使用
1: 准备
win7 64位
cocoscreator2.0.10 (新版本如 2.4.7应该也是可以的)

2:创建个cocoscreator helloworld工程,并构建


构建完后 在 build\jsb-link\src (这里选择是link 模板) 有3个jsc文件,在build\jsb-link\js backups (useful for debugging) 有这3个的未加密的原文件


这里主要用到 xxtea加解密算法 压缩用的是gzip,下图是引用了别人的

这里自己用go写了小工具
主要代码如下

//eh create
package mainimport ("bytes""compress/gzip""github.com/xxtea/xxtea-go/xxtea""io""io/ioutil""log""os""path""path/filepath""strconv"
)func main() {var strkey stringvar deensign uint8 //-s 1bit  0 解密 1 加密   2bit 0 无解压或加压  1 需要解压或压缩var filename stringvar outputpath string  //简化到了,直接输出到当前目录//decodeencodejsc -fif len(os.Args)&1 != 1 {log.Printf("eg:decode  decodeencodejsc -s 0  -k 123456 -f 1.jsc " +"encode  decodeencodejsc -s 1  -k 123456 -f 1.js ")return}for i := 1; i < len(os.Args); i += 2 {switch os.Args[i] {case "-s":if tflag, ef := strconv.Atoi(os.Args[i+1]); ef == nil {deensign = uint8(tflag)if deensign > 3 {log.Printf("-s params(1bit  0 解密 1 加密   2bit 0 无解压或加压  1 需要解压或压缩) ")}deensign &= 3} else {log.Printf("-s params is error!")return}case "-k":strkey = os.Args[i+1]case "-f":filename = os.Args[i+1]case "-p"://这个参数暂时没用到outputpath = os.Args[i+1]println("%v", outputpath)default:log.Printf("params is error")return}}//strkey = "dc6c9a10-42bb-4f"//decode unzip
//  filename = "tmp/settings.jsc"//filename = "zip/settings.jsc"
//  deensign = 2//encode zip//filename = "enzip/settings.js"//deensign = 3//jsc 352 byte  js 453 byteif len(filename) < 4 || len(strkey) < 4 { //|| len(outputpath) < 1log.Printf("check params is error!")return}cfgpath, _ := filepath.Abs(filepath.Dir(os.Args[0]))absolutepathname := path.Join(cfgpath, filename)cfg, err := os.Open(absolutepathname)if err != nil {log.Printf("can't find ", filename)return}data, err := ioutil.ReadAll(cfg)if err != nil {cfg.Close()return}cfg.Close()if deensign&1 == 0 { //decode 解密//*.jsctarfile := absolutepathname[:len(absolutepathname)-4]decodedata := xxtea.Decrypt(data, []byte(strkey))if deensign&2 > 0 { //解压if nlen, tdata := fungzip(decodedata); nlen > 0 {decodedata = make([]byte, nlen)copy(decodedata, tdata)} else {log.Printf("fungzip fail %v", absolutepathname)return}}writefile(tarfile+".js", decodedata)} else { //encode 加密//*.jstarfile := absolutepathname[:len(absolutepathname)-3]decodedata := dataif deensign&2 > 0 { //加压if nlen, tdata := fgzip(data); nlen > 0 {decodedata = make([]byte, nlen)copy(decodedata, tdata)} else {log.Printf("fgzip fail %v", absolutepathname)return}}decodedata = xxtea.Encrypt(decodedata, []byte(strkey))writefile(tarfile+".jsc", decodedata)}
}func checkFileIsExist(filename string) bool {var exist = trueif _, err := os.Stat(filename); os.IsNotExist(err) {exist = false}return exist
}//31 139 8        //0-2
// 0 0 0 0 0 0      (6个0) //3-8
//10 141 144 75 111  (9-13)
//194 48 16 132 255 139  (14-19)
func fungzip(data []byte) (int32, []byte) {b := new(bytes.Buffer)// Test NewReader.in := bytes.NewReader(data)r2, err := gzip.NewReader(in)if err != nil {log.Printf("ungzip error=%v", err)return 0, []byte{}}defer r2.Close()b.Reset()//n, err := io.Copy(b, r2)n, err := io.Copy(b, r2)if err != nil {//t.Errorf("%s: io.Copy: %v want %v", tt.desc, err, tt.err)log.Printf("ungzip error=%v", err)return 0, []byte{}}return int32(n), b.Bytes()
}//func fgzip(data []byte, filename string) (int32, []byte) {func fgzip(data []byte) (int32, []byte) {//buf := new(bytes.Buffer)w := gzip.NewWriter(buf)n0 := buf.Len()if n0 != 0 {//t.Fatalf("buffer size = %d before writes; want 0", n0)log.Printf("fgzip buffer size = %d before writes; want 0", n0)defer w.Close()return 0, []byte{}}w1, e1 := w.Write(data)if e1 != nil {log.Printf("fgzip buffer size = %d before writes; want %v", w1, n0)defer w.Close()return 0, []byte{}}//   log.Printf("write date len=%v", w1)n1 := buf.Len()if err := w.Flush(); err != nil {log.Printf("fgzip err=%v", err.Error())defer w.Close()return 0, []byte{}}n2 := buf.Len()if n2 == n1 {log.Printf("no data after first flush")defer w.Close()return 0, []byte{}}w.Close()n3 := buf.Len()//  log.Printf("write date len=%v", n3)return int32(n3), buf.Bytes()//
}func writefile(filename string, filedata []byte) bool {if f, e := os.Create(filename); e == nil {f.Write(filedata)f.Close()return true}return false
}

假如编译的执行文件叫 decodeencodejsc

1:解密
执行文件跟jsc 文件放同目录下
1> 不需要解压
decodeencodejsc -s 0 -k 密钥 -f 1.jsc
2> 需要解压
decodeencodejsc -s 2 -k 密钥 -f 1.jsc
同目录下生成1.js

2:加密
执行文件跟js 文件放同目录下
1> 不需要压缩
decodeencodejsc -s 1 -k 密钥 -f 1.js
2> 需要压缩
decodeencodejsc -s 3 -k 密钥 -f 1.js
同目录下生成1.jsc

3:测试
1:把cocoscreator生成jsc解密

执行后得到,结果是OK的

2:把js 加密
怎么测试呢,把生成jsc文件替换掉 build\jsb-link\src 的,再打包成apk 运行就知道了

4:查看引擎的xxtea zip 代码
万一XXTEA zip 版本跟引擎的不一致呢,会不会出错
这里告诉大家引擎版本的的原文件位置(构建后,以android为例用as打开)

如需工程代码后续在上传,执行文件下载地址(x86_64架构下 windows7 centos7 执行文件)
https://download.csdn.net/download/yunteng521/74707369

重复下 使用说明
假如执行文件叫 decodeencodejsc
1:解密
执行文件跟jsc 文件放同目录下
1> 不需要解压
decodeencodejsc -s 0 -k 密钥 -f 1.jsc
2> 需要解压
decodeencodejsc -s 2 -k 密钥 -f 1.jsc
同目录下生成1.js

2:加密
执行文件跟js 文件放同目录下
1> 不需要压缩
decodeencodejsc -s 1 -k 密钥 -f 1.js
2> 需要压缩
decodeencodejsc -s 3 -k 密钥 -f 1.js
同目录下生成1.jsc

android cocoscreator jsc js 间加解密(六)相关推荐

  1. JS RC4加解密报文

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

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

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

  3. XXTea加密 c++ 与 js 互相加解密

    关于加密功能,客户端使用的是creator  用js开发的,服务器端用lua做的 要做加密功能: 1.利用c++绑定调用c++实现加密,                             好处: ...

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

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

  5. AES128-ecb加解密

    问题 最近使用AES加解密的过程中遇到了一些问题,我这段采用的是openssl的AES.h的库进行加密的,因为传输的数据并不重要,考虑到并发性和安全性的原因,采用了AES128-ecb的加密模式,然而 ...

  6. 前后端java+vue 实现rsa 加解密与摘要签名算法

    RSA有两个密钥,一个是公开的,称为公开密钥:一个是私密的,称为私密密钥. 特点: 公开密钥是对大众公开的,私密密钥是服务器私有的,两者不能互推得出. 用公开密钥对数据进行加密,私密密钥可解密:私密密 ...

  7. 10086登录JS加解密充值讲解

    系列文章目录 1.10086登录JS加解密 2.10086跳转Cookies存活 3.如何请求充值话费 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 ...

  8. Android金融支付常见加解密算法及安全防护

    引言 因为本人从事的金融 IC 卡和移动支付相关的开发工作,在日常研发过程中,对 APP 信息安全防护方面尤为重视,所以现总结下金融支付相关的加解密算法以及常见的安全防范措施. Android 端常见 ...

  9. C#和Javascript间互转的Xxtea加解密

    很有意思的一件事情,当我想要找 Xxtea 加解密算法的时候,发现了前同事(likui318)的代码,不妨分享出来.此代码满足: 1:Xxtea支持中文: 2:支持 JS 和 C# 加解密之间的互转: ...

最新文章

  1. 数据分析的 8 种思维
  2. Selenium的简单操作
  3. JVM垃圾回收机制总结(5) :JDK垃圾收集器的配置命令
  4. idea中drl文件_得分DRL:在OptaPlanner中更快,更轻松
  5. 如异界守塔的伪原创工具
  6. Spring Cloud with Turbine
  7. f score matlab,机器学习中如何用F-score进行特征选择
  8. SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘staff_info.depart_id‘ in ‘where clause‘
  9. linux设计引物探针,如何设计荧光定量PCR的引物及TaqMan探针
  10. 配电室环境监控系统技术方案
  11. Java类和对象(重点详解)
  12. oracle 批量修改同义词,Oracle批量创建同义词
  13. android Launcher 自定义View 高仿hola一键清理效果
  14. 火车头采集器用法说明
  15. 学校教务系统服务器配置,校园小程序: 基于强智教务系统的校园服务类小程序--多校版本(默认 山科)使用云开发...
  16. 如何更新Nintendo Switch游戏
  17. termux目录_手机学编程(2)目录管理命令
  18. git出现error: invalid object for ‘xxxxx‘
  19. 使用react完成图片放大功能(淘宝放大镜)
  20. 大数据必学Java基础(六十一):同步类容器对比应用

热门文章

  1. 《Photoshop智能手机APP界面设计》学习笔记
  2. [288]关于MySQL的1064错误
  3. SQuirrel  一直连接不上问题
  4. 第二十讲 DES算法简介
  5. git 问题解决之remote: Permission to xxx/xxx.git denied to xxx.
  6. 前任写的代码,真是辣鸡啊…
  7. MACBOOKPRO操作系统登录密码忘记的解决方法
  8. 进程管理笔记三、完全公平调度算法CFS
  9. Pymc 包(贝叶斯模型 python工具):(1)安装版本提示
  10. jquery 操作iframe