美文网首页
ReviewTools-iOS资源加密

ReviewTools-iOS资源加密

作者: ReviewTools | 来源:发表于2023-07-20 09:52 被阅读0次

下载

一键加密

资源加密可以极大提升过审率,完美解决资源文件被标记问题。

工具对文件进行加密以及生成解密代码,具体解密逻辑需要自行实现!!!
工具对文件进行加密以及生成解密代码,具体解密逻辑需要自行实现!!!
工具对文件进行加密以及生成解密代码,具体解密逻辑需要自行实现!!!

解密

加密后,会在加密目录生成解密代码文件。需要根据项目自行对文件进行解密处理。
如果加密了 mainBundle 的 png 图片,需要在Xcode -> build settings 把 STRIP_PNG_TEXT 和 COMPRESS_PNG_FILES 设置为NO,否则Xcode会自动把加密后的png图片优化

解密流程

  • 把读取资源的逻辑封装到一个函数,方便批量处理
  • 如果开启了文件名混淆,需要先还原文件名,注意修改文件名不会修改文件名后缀
  • 加载已加密文件data,通过解密函数解密data
  • 通过data读取资源

解密文件代码

解密文件包含解密data的函数,如果开启了文件名混淆,则会多2个还原文件名的函数

/// 获取混淆后的文件名
/// @param name 混淆前文件名
/// @return 混淆后文件名
+ (NSString *)encryptName:(NSString *)name;

/// 还原混淆的文件名
/// @param name 混淆后文件名
/// @return 混淆前文件名
+ (NSString *)decryptName:(NSString *)name;

/// 文件数据解密
/// @param data 加密的data
/// @return 解密后的data
+ (NSData *)decryptData:(NSData *)data;

解密示例

比如原本加载图片的代码

NSString *path = [[NSBundle mainBundle] pathForResource:@"person" ofType:@"png"];
_imageView.image = [UIImage imageWithContentsOfFile:path];

经过加密后需要通过解密data读取图片

NSString *path = [[NSBundle mainBundle] pathForResource:@"person" ofType:@"png"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSData *decryptData = [DecryptManager decryptData:data]; // 解密data
_imageView.image = [UIImage imageWithData:decryptData];

上面只是示例,最好是封装成函数,传入文件路径或文件名,返回解密后data,再通过data加载资源

文件名混淆

开启会修改所选文件的文件名(不修改文件后缀),生成文件名映射文件,映射文件也会经过加密处理,映射文件只保存文件名的映射规则,不包含后缀,注意需要处理加密目录内的映射文件路径
混淆出来的文件名来自于大量AppStore线上应用统计出来的最常用文件名,同时经过差异化处理

还原文件名示例

直接还原

NSString *path = [[NSBundle mainBundle] pathForResource:@"person" ofType:@"png"];
_imageView.image = [UIImage imageWithContentsOfFile:path];

通过混淆前文件名,获取混淆后文件名再读取

NSString *name = [DecryptManager encryptName:@"person"]; // 通过原文件名读取混淆后文件名
NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"png"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSData *decryptData = [DecryptManager decryptData:data]; // 解密data
_imageView.image = [UIImage imageWithData:decryptData];

整个目录还原

比如说我们对 res 目录所有文件进行了加密并混淆文件名,那么可以先把整个目录解密到app(比如 Document),同时还原文件名,只需要在读取的时候改变读取的目录即可
原本加载res目录内资源的代码

NSString *dir = [[NSBundle mainBundle] pathForResource:@"res" ofType:@""];
NSString *path = [dir stringByAppendingPathComponent:@"person.png"];
_imageView.image = [UIImage imageWithContentsOfFile:path];

1.首次启动先把res目录解密到Document同时还原文件名

// 首次启动把res目录解密到 Document
- (void)decryptDir {
    NSString *dir = [[NSBundle mainBundle] pathForResource:@"res" ofType:@""];
    NSArray *subFiles = [[NSFileManager defaultManager] subpathsAtPath:dir];
    NSString *toDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"res"];
    [[NSFileManager defaultManager] createDirectoryAtPath:toDir withIntermediateDirectories:YES attributes:nil error:nil];
    for (NSString *subFile in subFiles) {
        NSString *path = [dir stringByAppendingPathComponent:subFile];
        // 加密后文件名,不包含后缀
        NSString *name = path.lastPathComponent.stringByDeletingPathExtension;
        // 还原成混淆前文件名
        NSString *toName = [DecryptManager decryptName:name];
        // 拼接目标文件路径 解密目录+文件子目录+文件名+文件后缀
        NSString *subDir = toDir;
        NSString *midDir = [subFile stringByDeletingLastPathComponent];
        if (midDir.length > 0) {
            subDir = [subDir stringByAppendingPathComponent:midDir];
            // 如果存在子目录需要创建
            if (![[NSFileManager defaultManager] fileExistsAtPath:subDir]) {
                [[NSFileManager defaultManager] createDirectoryAtPath:subDir withIntermediateDirectories:YES attributes:nil error:nil];
            }
        }
        NSString *toPath = [[subDir stringByAppendingPathComponent:toName] stringByAppendingPathExtension:path.pathExtension];
        // 解密data
        NSData *data = [NSData dataWithContentsOfFile:path];
        NSData *descryptData = [DecryptManager decryptData:data];
        [descryptData writeToFile:toPath atomically:YES];
    }
}

2.读取解密后的文件

NSString *dir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"res"];
NSString *path = [dir stringByAppendingPathComponent:@"person.png"];
_imageView.image = [UIImage imageWithContentsOfFile:path];

选择最合适的方式

解密和还原文件名等操作具体选择哪种方式需要根据项目来决定,同时需要注意解密文件的耗时,具体解密的逻辑可以根据项目自行优化

相关文章

  • Unity3D代码加密

    Virbox提供Unity加密代码及资源的产品,保护代码防止反编译,保护资源被提取提供Unity加密代码及资源的产...

  • 资源加密和脚本加密

    主要是资源加密和脚本加密。cocos2dx版本3.10。 脚本加密 脚本加密主要是用cocos2dx自带的加密方法...

  • Swift 4.0 RSA、证书非对称加密解密

    加密类.h文件 加密类.m文件 加密解密实现,从指定的SDK项目中获取资源

  • UntiyAssetBundle加密可行性分析

    背景 我们发现市面上有其他游戏使用公司的游戏资源,现有的游戏资源并未加密处理。为了提高破解的门槛,想对资源进行加密...

  • 对称加密 非对称加密

    HTTPs中为什么要使用非对称加密和对称加密两种加密方式? 非对称加密的性能相对对称加密来说会慢,比较消耗系统资源...

  • iOS 加密本地资源

    直接上源码: PS:解档的话,要保证需要解档的文件路径是完全没问题的,否则解不出来

  • 19、StreamingAssets和Resources目录的区

    都是只读的、Resources会加密,StreamingAssets不加密。当时是想播放一段音频,于是我把资源放在...

  • cocos资料

    Cocos 资料大全 Cocos2d-x Lua运行流程 加密 cocos2dx资源和脚本加密quick-lua3...

  • CSAA PROACTICE TEST3

    CSAA PRACTICE TEST 3 1 加密AWS的RDS资源,需要在创建的时候指定参数进行加密; 有一些i...

  • iOS AES资源文件和plist文件加密

    使用AES加密在平时开发中对NSString加密比较常见,因项目需求,需要多资源文件(如:图片)和plist(In...

网友评论

      本文标题:ReviewTools-iOS资源加密

      本文链接:https://www.haomeiwen.com/subject/izlaudtx.html