cocos2dx图片加密
‘壹’ cocos2dx openssl aes怎么用
为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
1.对称加密算法
OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。
2.非对称加密算法
OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。
‘贰’ 如何使用自带的加密功能及在cocos2dx中的
http://www.cnblogs.com/cg-Yun/p/4081255.html
‘叁’ cocos2dx中怎样把texture嫖猵vr或者pvr
pvr格式的数据在IOS上直接交给显卡渲染的,而cocos2dx 中的texture是直接交给显卡渲染的,所以理论上将pvr格式的数据可以不进行任何数据的转换就可以生成一张texture,事实上确实是这样的。
一, 保存为pvr格式
要保存pvr文件,我们首先分析cocos2dx引擎中是怎样解析pvr文件的。可以看到cocos2dx库中的CCTexturePVR类提供了两个方法来解析pvr格式图片分别是unpackPVRv2Data、unpackPVRv3Data,两个方法分别解析的是PVR的v2和v3版本。本文只分析v2版本:
bool CCTexturePVR::unpackPVRv2Data(unsigned char* data, unsigned int len)//data数据是直接从文件里读出来没有做任何处理的
{
bool success = false;
ccPVRv2TexHeader *header = NULL;
unsigned int flags, pvrTag;
unsigned int dataLength = 0, dataOffset = 0, dataSize = 0;
unsigned int blockSize = 0, widthBlocks = 0, heightBlocks = 0;
unsigned int width = 0, height = 0, bpp = 4;
unsigned char *bytes = NULL;
unsigned int formatFlags;
// 用header指向data数据的头部(PVR v2格式的头部固定是52个字节,也就是data的前52个字节的数据,data剩下的数据就是生成texture的数据了)
header = (ccPVRv2TexHeader *)data;
// 这是头部的一个标识值为 "PVR!" 占4字节
pvrTag = CC_SWAP_INT32_LITTLE_TO_HOST(header->pvrTag);
if (gPVRTexIdentifier[0] != (char)(((pvrTag >> 0) & 0xff)) ||
gPVRTexIdentifier[1] != (char)(((pvrTag >> 8) & 0xff)) ||
gPVRTexIdentifier[2] != (char)(((pvrTag >> 16) & 0xff)) ||
gPVRTexIdentifier[3] != (char)(((pvrTag >> 24) & 0xff)))
{
return false;
}
CCConfiguration *configuration = CCConfiguration::sharedConfiguration();
flags = CC_SWAP_INT32_LITTLE_TO_HOST(header->flags);
formatFlags = flags & PVR_TEXTURE_FLAG_TYPE_MASK;
bool flipped = (flags & kPVR2TextureFlagVerticalFlip) ? true : false;
if (flipped)
{
CCLOG("cocos2d: WARNING: Image is flipped. Regenerate it using PVRTexTool");
}
if (! configuration->supportsNPOT() &&
(header->width != ccNextPOT(header->width) || header->height != ccNextPOT(header->height)))
{
CCLOG("cocos2d: ERROR: Loading an NPOT texture (%dx%d) but is not supported on this device", header->width, header->height);
return false;
}
unsigned int pvr2TableElements = PVR2_MAX_TABLE_ELEMENTS;
if (! CCConfiguration::sharedConfiguration()->supportsPVRTC())
{
pvr2TableElements = 9;
}
for (unsigned int i = 0; i < pvr2TableElements; i++)
{
//Does image format in table fits to the one parsed from header?
if (v2_pixel_formathash[i].pixelFormat == formatFlags)
{
m_pPixelFormatInfo = v2_pixel_formathash[i].pixelFormatInfo;
//Reset num of mipmaps
m_uNumberOfMipmaps = 0;
//Get size of mipmap
m_uWidth = width = CC_SWAP_INT32_LITTLE_TO_HOST(header->width);
m_uHeight = height = CC_SWAP_INT32_LITTLE_TO_HOST(header->height);
//Do we use alpha ?
if (CC_SWAP_INT32_LITTLE_TO_HOST(header->bitmaskAlpha))
{
m_bHasAlpha = true;
}
else
{
m_bHasAlpha = false;
}
//Get ptr to where data starts..
dataLength = CC_SWAP_INT32_LITTLE_TO_HOST(header->dataLength);
//跳过头部,bytes直接指向了图片数据部分
bytes = ((unsigned char *)data) + sizeof(ccPVRv2TexHeader);
m_eFormat = m_pPixelFormatInfo->ccPixelFormat;
bpp = m_pPixelFormatInfo->bpp;
// Calculate the data size for each texture level and respect the minimum number of blocks
while (dataOffset < dataLength)
{
switch (formatFlags) {
case kPVR2TexturePixelFormat_PVRTC_2BPP_RGBA:
blockSize = 8 * 4; // Pixel by pixel block size for 2bpp
widthBlocks = width / 8;
heightBlocks = height / 4;
break;
case kPVR2TexturePixelFormat_PVRTC_4BPP_RGBA:
blockSize = 4 * 4; // Pixel by pixel block size for 4bpp
widthBlocks = width / 4;
heightBlocks = height / 4;
break;
case kPVR2TexturePixelFormat_BGRA_8888:
if (CCConfiguration::sharedConfiguration()->supportsBGRA8888() == false)
{
CCLOG("cocos2d: TexturePVR. BGRA8888 not supported on this device");
return false;
}
default:
blockSize = 1;
widthBlocks = width;
heightBlocks = height;
break;
}
// Clamp to minimum number of blocks
if (widthBlocks < 2)
{
widthBlocks = 2;
}
if (heightBlocks < 2)
{
heightBlocks = 2;
}
dataSize = widthBlocks * heightBlocks * ((blockSize * bpp) / 8);
unsigned int packetLength = (dataLength - dataOffset);
packetLength = packetLength > dataSize ? dataSize : packetLength;
// bytes指向的是data,而data是直接从文件里面读出来的数据,m_asMipmaps则是用来生成texture的数据,
// 所以这里可以得出结论,pvr的图片数据到texture不需要经过任何转换,
// 也就是说pvr格式的数据可以不进行任何数据的转换就可以生成一张texture
m_asMipmaps[m_uNumberOfMipmaps].address = bytes + dataOffset;
m_asMipmaps[m_uNumberOfMipmaps].len = packetLength;
m_uNumberOfMipmaps++;
//Check that we didn"t overflow
CCAssert(m_uNumberOfMipmaps < CC_PVRMIPMAP_MAX,
"TexturePVR: Maximum number of mipmaps reached. Increase the CC_PVRMIPMAP_MAX value");
dataOffset += packetLength;
//Update width and height to the next lower power of two
width = MAX(width >> 1, 1);
height = MAX(height >> 1, 1);
}
//Mark pass as success
success = true;
break;
}
通过上面的分析,我们知道了要把texture保存成pvr格式的文件只需为这样texture添加一个头部即可。关于pvr头部在CCTexturePVR.cpp中我们可以看到 _PVRTexHeader 这个结构体,这个结构体就是PVR的头部格式,现在要做的工作就是分析出_PVRTexHeader的成员的含义。这个可以参考imageination关于pvr的文档,需要提醒的是要注意版本差别。
‘肆’ 我想用cocos2dx学习开发安卓游戏,请问要学习什么基础语言,从哪个方面着手
从一个最简单的例子着手。
不知道朋友什么基础,安卓开发,JAVA是必备知识,一定要学的。C++务必要懂,因为
cocos2dx是C++实现的。而且cocos2dx中的API如特效,地图,移动,渲染其风格都带有强烈的winC++ API风格。所以不懂C++肯定无法成为一个优秀的游戏开发者。
给朋友的建议,先搭一个android下cocos2dx的运行环境。随意实现一个简单图片的移动。我的同事们都选择从小鸡吃米开始的。例子网上有很多,朋友可以找找看。接下来肯定是要详细研究cocos2dx的设计思想,消息机制。靠自己一步步去实践了。祝成功。
‘伍’ cocos2dx 怎么加密xml
把整个文件按字节读取加密,也可以直接读取字符加密。使用的过程与加密过程相反就ok了。
当然你也可以对xml中的数据加密,不加密中间的标签。
加密的算法也有很多,比如AES,MD5,DES,3DES.............
‘陆’ cocos2dx 用luajit 加密脚本 会被反编译吗
1、新建一个名为1.lua的文件,里面只有一句话print("Hello Lua"),新建一个空的out.lua脚本文件
2、开始--运行--cmd
3、luac -o out.lua 1.lua
注: luac -o [编译后脚本名] [脚本名],必要时带上脚本路径,如:
回车之后,再打开out.lua就可以看到编译好的字节码了
然后实验一下,执行这个字节码脚本,可以看到lua原生的解释器可以直接解析luac编译出来的bytecode脚本,很方便!
‘柒’ cocos2dx 3.3 上层多点触摸怎么设置不穿透到底层
最土的方法就是在你当前层的最底部放一张透明的图片,并把这张图片设置为可交互。
按照官方的方法来设置不穿透感觉好麻烦,就直接用这个土方法。效果很不错。
‘捌’ 扒资源是什么意思
在网络上通过某种工具或者技术手段取得想要的内容。
下面是扒资源的方法:
1 .下载apk包,重命名为.zip,然后解压缩,在/assets 目录下,一般有一个res子目录,打开这个目录,里面可能就有想要的资源。
2 .有些小游戏如棋牌类游戏,大部分是支持下载更新的,这部分游戏只有在进入游戏更新之后,资源才是完整的。这个时候我们要用到一个叫做蓝叠(Bluestack)的模拟器(网络可下载): 首先把游戏安装包拖到模拟器里面安装好;然后,在模拟器上运行游戏,等待热更新完毕;接着,模拟器上点击:我的应用->RE.管理器,点击进入/data/data目录,下面有一堆的com.aaa.bbb 或者 org/aaa.bbb,一般来说aaa表示游戏公司名,bbb表示游戏产品名。 比如掌上大赢家的目录即为:/data/data/com.zsdyj.zsdyj。 找到对应的目录,打开files/upgrade/o,找到里面热更新的文件。 光标移动到需要拷贝的文件上面,按住鼠标左键,到/mnt/sdcards/windows/Document目录下,如果文件比较大的话,的时间可能比较久。 耐心等待完成后,关闭蓝叠模拟器。 windows系统上,打开我的文档,就可以找到出来的文件了。
注意:如果在/data/data/下面没找到,可以到/data/user/0目录下面找找看。
3.如果资源文件是加密的,就要分析cocos2dx的lib文件,通过反汇编看其是如何加密资源的,不过这已经超出了本篇所述范围。