想请教一下,大量的图片如何进行压缩和加密,看了好多app,里面有很多图片但是破解出来看不到他们的图片,而且app包也不大,不知道这需要需要什么技术?谢谢
自定义数据格式 。
图形部分还是用的 png 。添加了一些其他参数。 裁剪最小矩形
能否说的详细一些呢。如果都裁剪,使用的时候位置会发生变化,如果是一个动画,图片位置都是以固定的位置为主,这样会出现动画错乱。
给你发个批量数据加密工具AES 256算法, 下载请移步17楼,含AES解密C++接口源码, 使用方法很方便:
std::string plaintext = crypto::aes::decrypt(input, key)
crypto::aes::overlapped::decrypt(inout, key); // 复用输入缓冲区
如果选择压缩,加密器会先压缩后加密,解密的时候先解密后解压即可, 具体伪代码如下:
std::string ciphertext = fsutil::read_binary(filename);
crypto::aes::overlapped::decrypt(ciphertext, key);
std::string plaintext = crypto::zlib::uncompress(ciphertext); // 得到明文
软件界面图:
我想问下这个软件要怎么用?加密后怎么在游戏里读取?
用AES CBC模式解密就行了啊
iv: unsigned char ivec] = {
0x00, 0x23, 0x4b, 0x89, 0xaa, 0x96, 0xfe, 0xcd,
0xaf, 0x80, 0xfb, 0xf1, 0x78, 0xa2, 0x56, 0x21
};
密钥在软件同一目录下local_settings.dat里
谢谢,先学习一下,不懂再请教你!
这个也可以分两步来:
图片压缩做压缩的事情
图片加密做加密的事情
压缩可以去找找相关图片压缩的软件或者库
加密感觉上都是对对应的二进制数据进行一定规则的打乱,游戏中再以对应的规则恢复。所以只要是可恢复的加密算法都可以,比如引擎中有带的xxtea,xxhash
嗯,好的,我实测了一下aes,xxtea性能,aes是256位密钥CBC模式,数据如图:
测试代码:
void encrypt_speed_test(void)
{
auto buffer = fsutil::read_file_data(fileName); // 随便一个文件名,后或者便分配一段buffer
const int round = 5;
const int times = 200;
cocos2d::log("test data size:%d bytes, %lfMB", buffer.size(), buffer.size() / 1024.f / 1024.0f);
for (int k = 0; k < round; ++k)
{
cocos2d::log("test round %d", k + 1);
long start = clock();
for (int i = 0; i < times; ++i)
{
std::string out = crypto::aes::encrypt(buffer); // crypto::aes::overlapped::encrypt(buffer);
}
cocos2d::log("aes encrypt %d times use %lf seconds", times, (clock() - start) / (double)CLOCKS_PER_SEC);
char cKeys] = { 'j', 't', 'u', 'm', 'u', 'q', '1', '2', 'r', '5', 'x', '\0' };
xxtea_long outlen = 0;
start = clock();
for (int i = 0; i < times; ++i)
{
auto decodeBuffer = xxtea_encrypt((unsigned char*)buffer.c_str(), buffer.length(), (unsigned char*)cKeys, 12, &outlen);
free(decodeBuffer);
}
cocos2d::log("xxtea encrypt %d times use %lf seconds\n", times, (clock() - start) / (double)CLOCKS_PER_SEC);
}
}
谢谢解答。能介绍几款压缩工具吗?我看了好几个都会造成图片损失的,一般都是修改其中的参数来压缩大小的。我想问一下有没有批量处理的,打包在一起的工具,然后可以通过cocos2d-x引擎读出来。
texturepacker
这个数据还是过大,而且它会裁掉空白的像素会导致位置发生变化(除非都是以一个位置为基准的),也没有加密的。
您好,用了您分享的图片加密压缩工具,有点问题,能不能留下QQ我加您下
png格式的图片,在保持长宽不变的情况下,可以采用降低颜色位数的方法缩小文件容量。可以用一个叫PNGOO的软件(百度能找到)进行批量压制png。缺点是这种方法为有损压缩,如果图片的色彩很多,失真就会很大,而且是不可逆的
如果要对图片进行加密,可以用TexturePacker。它可以把小图整合成一张大图,导出为pvr.ccz格式时可以进行选择进行加密处理。TexturePacker里面也可以对图片降低颜色位数
如果要把很多资源打包成一个文件,我推荐用libnpk,github上有,跨平台的。这个库使用zlib压缩文件,支持加密,里面有范例,非常好使
如果还觉得大,就只有把图片的尺寸缩小,然后用程序放大了
补充一句:网上也有png无损压缩的软件,我试过,压缩率远低于有损压缩
谢谢,我使用了png8得格式存储,的确会减少很多,就是画面会损失一些色彩,那个加密我还没有了解,得去看看。我感觉还是达不到想要的那种效果,上次看了别人的好像压缩了很多,都是.data数据。
后缀名可以随便写的,主要还是得知道别人在打包资源的时候做了啥事,有能力的话可以反汇编分析分析他们的解资源部分
还有就是,他们的美术可能在画那些资源的时候就把画笔颜色限制在了8位,所以压成8位的图片看起来是没有失真的
您好,我的QQ: 262381263
来个最新版, 用法:
std::string plaintext = crypto::aes::decrypt(input, key)
crypto::aes::overlapped::decrypt(inout, key); // 复用输入缓冲区
如果选择压缩,加密器会先压缩后加密,解密的时候先解密后解压即可, 具体伪代码如下:
std::string ciphertext = fsutil::read_binary(filename);
crypto::aes::overlapped::decrypt(ciphertext, key);
std::string plaintext = crypto::zlib::uncompress(ciphertext); // 得到明文
最新版3.0.3(支持加密4GB以上的超大文件)下载贴: 提示信息 -请登录后访问
恩,谢谢。我在研究研究。。。
感觉图片资源主要偏向加密,压缩的话用Texturepacker导出的时候就可以选择不同程度的压缩格式。
这帖子不错,期待更多高手讨论,提供参考~