事情是这样的。。。
写了个小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 应用
测试准备
- 新建cocos2dx新项目(Helloworld)
- CCFileUtils::getFileData 修改:
增加bool开关:m_bSwitch 可以设置是否调用解密算法。
增加解密接口:Decrypt
源码编译后更新我自己的 Helloworld 项目。 - 增加解密逻辑:
// 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天了,实在找不到问题所在。...>.<...
第一次发帖子希望大家指点。