加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 guoxiaomi 于 2017-10-5 21:46 编辑
之前考虑过单独加密图片素材的方法,于是在论坛上找到了这个:https://rpg.blue/forum.php?mod=viewthread&tid=87968原贴楼主是柳之一,这是08年的陈年老贴。
这个帖子里介绍了 bitmap marshal 的技术,所有的截图存档里也都有类似功能的代码。于是利用一点点小trick就可以用这个来做素材加密。
因为已经决定不加密素材,所以就把这个trick公开了。
修改 RPG::Cache 中的 load_bitmap 方法,在直接调用 Bitmap.new(path) 前,检查一下是否有加密的素材。加密的素材保存在 Resource 文件夹下,并且文件名是 path 的 md5 值,其实我这里也没有算 md5 值,就是拿 crc32 随便糊了个假的。
module RPG module Cache def self.load_bitmap(folder_name, filename, hue = 0) path = folder_name + filename #---------------------------------------------------------------- # 优先从 resource 里加载 #---------------------------------------------------------------- if not @cache.include?(path) or @cache[path].disposed? if filename != "" resource = 'Resource/' + md5(path) if FileTest.exist?(resource) @cache[path] = load_data(resource) else @cache[path] = Bitmap.new(path) end else @cache[path] = Bitmap.new(32, 32) end end if hue == 0 @cache[path] else key = [path, hue] if not @cache.include?(key) or @cache[key].disposed? @cache[key] = @cache[path].clone @cache[key].hue_change(hue) end @cache[key] end end def self.md5(string) # 这里简单的用 crc32 值取代 md5 值 sprintf('%08x%08x', Zlib::crc32(string.downcase), Zlib::crc32(string.downcase.reverse)) end end end
module RPG
module Cache
def self.load_bitmap(folder_name, filename, hue = 0)
path = folder_name + filename
#----------------------------------------------------------------
# 优先从 resource 里加载
#----------------------------------------------------------------
if not @cache.include?(path) or @cache[path].disposed?
if filename != ""
resource = 'Resource/' + md5(path)
if FileTest.exist?(resource)
@cache[path] = load_data(resource)
else
@cache[path] = Bitmap.new(path)
end
else
@cache[path] = Bitmap.new(32, 32)
end
end
if hue == 0
@cache[path]
else
key = [path, hue]
if not @cache.include?(key) or @cache[key].disposed?
@cache[key] = @cache[path].clone
@cache[key].hue_change(hue)
end
@cache[key]
end
end
def self.md5(string)
# 这里简单的用 crc32 值取代 md5 值
sprintf('%08x%08x', Zlib::crc32(string.downcase), Zlib::crc32(string.downcase.reverse))
end
end
end
上面说的是解密的方法,关于加密直接看工程吧~范例工程中的 Graphics/Pictures/biaoti.png 可以删掉,但是仍然能正常读取 Resource 文件夹里的内容。
resource.zip
(732.09 KB, 下载次数: 171)
只要把输出的内容字符串在写入/读取之前进行加/解密就可以实现加密,毕竟 marshal / zlib.deflate 等于是明文保存。
我写了一个dll用来对每个 byte 进行单字符替换的加密,经测试,这个运算跟 zlib.inflate 的耗时是一样的,30M 的文件大概需要 0.05s。但是用 ruby 直接做字符串的替换就很慢了。
这个trick的一个缺点是,只能针对使用 RPG::Cache 创建的 Bitmap 对象进行加密,如果直接使用 Bitmap.new(path) 方法创建就没办法了。所以需要仔细检查脚本,尽可能用 RPG::Cache 创建 bitmap,或者对特定的素材文件夹不进行加密处理。
|