zoukankan      html  css  js  c++  java
  • 手机游戏加密那点事儿_2d资源加密_1

    版权声明:本文为博主原创文章,未经博主同意不得转载。

    https://blog.csdn.net/chengyingzhilian/article/details/25076419

    本文章讲述利用cocos2d-x 开发手机游戏的一些加密心得。如有问题。请多指正。

    很多其它信息详见:http://blog.csdn.net/chengyingzhilian/article/details/25540441

    本文地址:http://blog.csdn.net/chengyingzhilian/article/details/25076419

    好了,进入本文的主题——资源加密

      关于图片资源的打包当然是採用TexturePacker了。

    官方网址:http://www.codeandweb.com/texturepacker

      个人认为是2d里面最好的资源打包工具,没有之中的一个。

       TexturePacker它是一款把若干资源图片拼接为一张大图的工具。TexturePacker能够直接选定一个目录,将里面的小图片生成一个大图片。并输出plist文件的工具。

    使用该工具,合图就很easy了。TexturePacker自带有资源加密的功能。

       关于怎样使用。

    在此不再赘述。可自行搜索教程。

       在此仅仅想说明两点网上很少提及的:

    1.命令行。

    2.加密。

    一、命令行

    TexturePacker 

    界面的设置全然能够用命令行来运行。

    这种优点就是完毕能够批处理图片资源。

    前期资源是没有压缩和加密的。后期仅仅须要替换压缩图片。使用命令行批处理一下。很很的方便。

    1.命令行的安装。

    默认安装TexturePacker 之后,命令行是没有配置到系统环境的。

    配置方法例如以下:

    单击单击标题栏TexturePacker,选择安装命令行。就可以。

    2.TexturePacker 的一些经常使用參数信息

    以下是TexturePacker 的一些经常使用參数信息。具体參数可直接在终端输入TexturePacker 
    You can specify one or more .png or .tps files or directories for processing.
       <folder>                   Recursively adds all known files in the sprite sheet
       <*.tps>                    *.tps file created with TexturePackerPro (requires pro license)
                                  Additional set options override settings in the *.tps file
       <*.swf>                    Flash requires pro license
       <images>                   Image formats, supported: 
     Output:
      --sheet <filename>          Name of the sheet to write, see texture-format for formats available
      --texture-format <id>       Sets the format for the textures.
                                  The format type is automatically derived from the sheet's file name
                                  if possible.
      --data <filename>           Name of the data file to write
      --format <format>           Format to write, default is cocos2d
     --force-publish             Ignore smart update hash and force re-publishing of the files
     --texturepath <path>        Adds the path to the texture file name stored in the data file.
                                  Use this if your sprite sheets are not stored in another folder than your data files.
      --reduce-border-artifacts   Removes dark shadows around sprites
      --extrude <int>             Extrudes the sprites by given value of pixels to fix flickering problems in tile maps
      --scale <float>             Scales all images before creating the sheet. E.g. use 0.5 for half size
      --scale-mode <mode>         Use mode for scaling:

    二,图片加密

    接下来讲述资源加密的一些技巧, 关于图片加密事实上TexturePacker官方有具体的指导说明。官方有一篇文档有完整的介绍

    http://www.codeandweb.com/texturepacker/contentprotection 

    只是,cocosBuilder作者已经不再维护Builder了。所以教程相应的cocos2d 2.x 有些过时。

    所以在此又一次啰嗦一下.

    查看cocos2dx源码发现加密的关键部分:大致意思就是用密钥循环异或data字节。

    // encrypt first part completely
        for(; i < len && i < securelen; i++)
        {
            data[i] ^= s_uEncryptionKey[b++];
            
            if(b >= enclen)
            {
                b = 0;
            }
        }
        
        // encrypt second section partially
        for(; i < len; i += distance)
        {
            data[i] ^= s_uEncryptionKey[b++];
            
            if(b >= enclen)
            {
                b = 0;
            }
        }



    1.效果预览:

    首先看一下,资源包加密VS未加密预览的效果:

     VS 
     採用TexturePacker加密之后,资源是无法被查看到的。
    Ps:在开发的过程中。能够採用未加密的资源开发,之后再打包公布的时候,採用命令行批处理一遍就可以。

     2.资源加密步骤:

    1.单击ContentProtection旁边的Lock图标。

    弹出lock窗体:

    你须要填写32位的密钥(0-9 a-f)


    • Create new key 是系统随机密钥
    • Clear/Disable 启用/关闭图片加密功能
    • Save as global key 将该密钥作为全局的密钥,以后对其它的图片加密直接使用global key 就可以。

    • Use global key 使用保存的全局密钥。

    2.Save
    3.Publish


    接下来的步骤和官方的介绍不同:主要是3.0已经集成了图片加密的功能

    首先须要了解:

    假设你的密钥是aaaaaaaabbbbbbbbccccccccdddddddd,你必须将它们分成4部分每部分8位:

    0xaaaaaaaa
    0xbbbbbbbb
    0xcccccccc
    0xdddddddd
    在TexturePacker官网介绍的方法是下载其提供的ZipUtils 文件替换cocos2dx 。

    在最新版的cocos2dx zipUtils 里面已经集成了对TexturePacker 解密的处理,所以无需依照其步骤处理。

    Ps:下载其ZipUtils 复制替换后,cocos2dx lib 会出错。
    我们直接使用coco2d-x-3.0自带的能够了。以下是对其解密的源码:
    cocos2dx/support/zip_support/ZipUtils.h
     /** Sets the pvr.ccz encryption key.
            *
            * Example: If the key used to encrypt the pvr.ccz file is
            * 0xaaaaaaaabbbbbbbbccccccccdddddddd you will call this function with
            * the key split into 4 parts as follows
            *
            * ZipUtils::ccSetPvrEncryptionKey(0xaaaaaaaa, 0xbbbbbbbb, 0xcccccccc, 0xdddddddd);
            *
            * Note that using this function makes it easier to reverse engineer and
            * discover the complete key because the key parts are present in one
            * function call.
            *
            * IMPORTANT: Be sure to call ccSetPvrEncryptionKey or
            * ccSetPvrEncryptionKeyPart with all of the key parts *before* loading
            * the spritesheet or decryption will fail and the spritesheet
            * will fail to load.
            *
            * @param keyPart1 the key value part 1.
            * @param keyPart2 the key value part 2.
            * @param keyPart3 the key value part 3.
            * @param keyPart4 the key value part 4.
            */
            static void ccSetPvrEncryptionKey(unsigned int keyPart1, unsigned int keyPart2, unsigned int keyPart3, unsigned int keyPart4);
      Ps: 在ZipUtils 中还有其它相似的函数。使用当中一个就可以。

    调用:

     我们在AppDelegate.cpp applicationDidFinishLaunching函数中添加例如以下代码:

    ZipUtils::ccSetPvrEncryptionKey(0x12345678,0x87654321,0x12345678,0x87654321);

    就能够正常使用资源了。

    以下是Lua 使用资源的測试代码:

    require "Cocos2d"
    
    cclog = function(...)
        print(string.format(...))
    end
    
    -- for CCLuaEngine traceback
    
    function __G__TRACKBACK__(msg)
        cclog("----------------------------------------")
        cclog("LUA ERROR: " .. tostring(msg) .. "
    ")
        cclog(debug.traceback())
        cclog("----------------------------------------")
    end
    
    local function createShowSpriteScene()
        cc.SpriteFrameCache:getInstance():addSpriteFrames("files/sprite.plist")
        local showSprite = cc.Sprite:createWithSpriteFrameName("success_1.png")
           showSprite:setPosition(cc.p(200,200))
        return showSprite
    end
    
    local function main()
    
        -- avoid memory leak
        collectgarbage("setpause", 100)
        collectgarbage("setstepmul", 5000)
       
        local scene = cc.Scene:create()
        local layer = createShowSpriteScene()
        scene:addChild(layer)
        cc.Director:getInstance():runWithScene(scene)
    end
    
    xpcall(main, __G__TRACKBACK__)

    当我们凝视在AppDelegate.cpp中,加入的代码后:会报例如以下错误:



  • 相关阅读:
    springboot以jar运行时参数传递
    linux 下ab压力测试
    Quartus 11生成pof文件在AS烧写之后,程序无法启动
    芯片底层热焊盘的焊接
    CC3200模块的内存地址划分和bootloader,启动流程(二)
    python开发记录第一篇
    windows下使用Python出现No module named tkinter.ttk
    Pycharm设置Python的路径
    Qsys配置生成nios系统模块
    sprintf()函数使用异常
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10884959.html
Copyright © 2011-2022 走看看