关于图片加密问题!(第一次发帖额啊)

事情是这样的。。。
写了个小demo。就是png和jpg图像加密解密功能,修改源码接口:virtual unsigned char* getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize);

测试环境
开发环境:win7 + cocos2dx 2.1.4 + eclipse + cygwin + vc2010
版本:android 应用

测试准备

  1. 新建cocos2dx新项目(Helloworld)
  2. CCFileUtils::getFileData 修改:
    增加bool开关:m_bSwitch 可以设置是否调用解密算法。
    增加解密接口:Decrypt
    源码编译后更新我自己的 Helloworld 项目。
  3. 增加解密逻辑:
    // CCFileUtils::getFileData 增加设置解密执行开关
    virtual void setSwitch( bool bFlag /= false/ );
    // CCFileUtils::getFileData 增加设置key接口
    virtual void setKey( unsigned char* szKey, int nkeylen );
    // CCFileUtils::getFileData 增加解密算法接口
    virtual void Decrypt( unsigned long length, const unsigned char *inData, unsigned char *outData );
    // getFileData接口增加解密逻辑调用
    unsigned char* CCFileUtils::getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize)
    {
        unsigned char * pBuffer = NULL;
        CCAssert(pszFileName != NULL && pSize != NULL && pszMode != NULL, "Invalid parameters.");
        *pSize = 0;
        do
        {
            // read the file from hardware
            std::string fullPath = fullPathForFilename(pszFileName);
            FILE *fp = fopen(fullPath.c_str(), pszMode);
            CC_BREAK_IF(!fp);

            fseek(fp,0,SEEK_END);
            *pSize = ftell(fp);
            fseek(fp,0,SEEK_SET);
            pBuffer = new unsigned char*pSize];
            *pSize = fread(pBuffer,sizeof(unsigned char), *pSize,fp);
            fclose(fp);
        } while (0);

        if (! pBuffer)
        {
            std::string msg = "Get data from file(";
            msg.append(pszFileName).append(") failed!");

            CCLOG("%s", msg.c_str());
        }

        //////////////////////////////////////////////////////////////////////////
        //    解密处理                                                                                                                        //
        //////////////////////////////////////////////////////////////////////////
        if ( true == m_Switch && m_nKeyLength > 0 )
        {
            Decrypt( *pSize, pBuffer, pBuffer );
        }
        //////////////////////////////////////////////////////////////////////////

        return pBuffer;
    }


```

 
用加密算法对原图片 HelloWorld.png 进行加密得到 HelloWorld_dat.png(加密后的图片无法正常预览)
用解密算法对 HelloWorld_dat.png 解密生成图片 HelloWorld_bak.png(可正常预览)
HelloWorld.png、HelloWorld_dat.png、HelloWorld_bak.png 图片大小相同。

解密测试:
1. 不使用解密算法(设置m_Switch 为 false)分别加载图片:HelloWorld.png、HelloWorld_bak.png 手机 Helloworld 运行正常
2. 使用解密算法(设置m_Switch 为 true,并设置 key m_nKeyLength > o)加载图片:HelloWorld_dat.png 手机 Helloworld 黑屏运行异常。

异常测试:
Helloworld 项目增加测试接口:
bool HelloWorld::Test( void )
{
    std::string strFileName1 = CCFileUtils::sharedFileUtils()->fullPathForFilename( "HelloWorld_dat.png" );    // 加密的图片
    std::string strFileName2 = CCFileUtils::sharedFileUtils()->fullPathForFilename( "HelloWorld_bak.png" );    // 对加密的图片进行解密后的图片

    CCFileUtils::sharedFileUtils()->setSwitch( false );

    unsigned long length1 = 0;
    unsigned long length2 = 0;
    unsigned char *pTBuffer1 = CCFileUtils::sharedFileUtils()->getFileData( strFileName1.c_str(), "rb", &length1 );
    unsigned char *pTBuffer2 = CCFileUtils::sharedFileUtils()->getFileData( strFileName2.c_str(), "rb", &length2 );

    if ( NULL == pTBuffer1 || length1 <= 0 )
    {
        SetErrorScene( 1 );    // 我自己写的报错提示代码
        return false;
    }

    // 加密图片读取
    unsigned char *pData1 = new unsigned char length1 + 1 ];
    memset( pData1, 0, sizeof( pData1 ) );
    memcpy( pData1, pTBuffer1, length1 );
    pTBuffer1 length1 - 1 ] = 0;
    if ( NULL != pTBuffer1 )
    {
        delete] pTBuffer1;
        pTBuffer1 = NULL;
    }
    // 解密处理
    Decrypt( length1, pData1, pData1 );    // 与getFileData内增加的解密代码完全相同

    // 加密再解密的图片读取
    int nErrorIndex = 0;
    unsigned char *pData2 = new unsigned char length2 + 1 ];
    memset( pData2, 0, sizeof( pData2 ) );
    memcpy( pData2, pTBuffer2, length2 );
    pTBuffer2 length2 - 1 ] = 0;
    if ( NULL != pTBuffer2 )
    {
        delete] pTBuffer2;
        pTBuffer2 = NULL;
    }

    // 图片比较
    if ( length1 > length2 )
    {
        nErrorIndex = 2;
    }
    else if ( length1 < length2 )
    {
        nErrorIndex = 3;
    }
    else
    {
        for ( int i = 0; i < ( int )( length1 ); ++i )
        {
            if ( ( int )( pData i ] ) != ( int )( pData2 i ] ) )
            {
                nErrorIndex = 4;
                break;
            }
        }
    }

    if ( NULL != pData1 )
    {
        delete] pData1;
        pData1 = NULL;
    }

    if ( NULL != pData2 )
    {
        delete] pData2;
        pData2 = NULL;
    }

    if ( nErrorIndex > 0 )
    {
        SetErrorScene( nErrorIndex );
        return false;
    }
    return true;
}


```


问题:
同样的解密代码为什么直接读取加密再解密后的 HelloWorld_bak.png 图片正常,但通过执行增加了解密接口的 CCFileUtils::getFileData 就不能加载加密的 HelloWorld_dat.png 图片???百思不得其解。
如果解密算法有问题那么 HelloWorld_bak.png 为什么会加载成功?

经过测试:加密的图片 HelloWorld_dat.png 在执行解密程序后,其内容与HelloWorld_bak.png相同!

各位前辈帮我看看,弄了1-2天了,实在找不到问题所在。...>.<...
第一次发帖子希望大家指点。
1赞

没有和我一样遇到这样问题的人么?
还是我哪里说的不够清楚?
如果我哪说的不清楚告诉我,我会补充的。

亲,把demo和sample发给我,Geek.Jacky@Gmail.com

我调试一下试试。

另外如果是为了加密图片,为什么不考虑使用Texurepacker加密功能?

好的 稍等我整理下。

已经发给你了。

收到。 :875:

额 好吧 你先帮看看
其实tp的加密不错的 可以考虑使用 整合也方便

我用的TP加密,如果不想拼图的,用zip加密~

能给我发一个版本吗 576159902@qq.com

求教导怎么用zip加密…

一楼的 您好。现再您解决问题了吗?