美文网首页iOS 开发每天分享优质文章
iOS AES资源文件和plist文件加密

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

作者: 心猿意码_ | 来源:发表于2022-04-02 11:34 被阅读0次
    • 使用AES加密在平时开发中对NSString加密比较常见,因项目需求,需要多资源文件(如:图片)和plist(Info.plist)文件加密。
    • 话不多说,直接上代码

    有使用到RNCryptor-objc的第三方库

    pod 'RNCryptor-objc'
    

    创建工具类

    //
    //  LCArchiveManager.h
    //  LCAESFileEncryption
    //
    //  Created by yxl on 2022/4/1.
    //
    
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface LCArchiveManager : NSObject
    /// 图片加密
    +(void)imageEncryptionImageName:(NSString *)imageName Type:(NSString *)type;
    /// 图片解密获取
    +(UIImage *)imageDecryptionImageFileName:(NSString *)imageFileName;
    
    
    /// Plist文件加密
    +(void)plistEncryptionPlistName:(NSString *)plistName Type:(NSString *)type;
    /// Plist解密获取
    +(NSDictionary *)plistDecryptionPlistFileName:(NSString *)plistFileName;
    
    /// 清除本地的序列化的文件
    +(void)clearArchiverData;
    @end
    
    NS_ASSUME_NONNULL_END
    
    
    //
    //  LCArchiveManager.m
    //  LCAESFileEncryption
    //
    //  Created by yxl on 2022/4/1.
    //
    
    #import "LCArchiveManager.h"
    #import "RNEncryptor.h"
    #import "RNDecryptor.h"
    
    #define aPassword  @"LCArchiveManagerPassword"
    
    @implementation LCArchiveManager
    
    #pragma  mark --Image加解密
    /// 图片加密
    +(void)imageEncryptionImageName:(NSString *)imageName Type:(NSString *)type
    {
        NSString *filePath = [[NSBundle mainBundle]pathForResource:imageName ofType:type];
        __block NSData *data = [NSData dataWithContentsOfFile:filePath];
        __block NSError *error;
        // 本地存储加密图片路径
        NSString *fileEncryPath = [NSHomeDirectory()stringByAppendingPathComponent:[NSString stringWithFormat:@"/Documents/%@",imageName]];
        NSFileManager *fileManager = [NSFileManager defaultManager];
        //判断是否已存在加密文件,若存在直接执行解密过程。
        if ([fileManager fileExistsAtPath:fileEncryPath]) {
            return;
        }
        //异步去加密,防止占用太多内存
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            //加密
            NSData *encryptedData = [RNEncryptor encryptData:data withSettings:kRNCryptorAES256Settings password:aPassword error:&error ];
            if (!error) {
                NSLog(@"^_^ 图片加密成功 ……——(^_^)\n");
            }
            //在主线程上写入文件
            dispatch_sync(dispatch_get_main_queue(), ^{
                BOOL yes = [encryptedData writeToFile:fileEncryPath atomically:NO];
                if (yes) {
                    NSLog(@"加密图片文件写入成功");
    
                }else{
                    NSLog(@"加密图片文件写入失败");
                }
                NSLog(@"图片写入PDF路径:%@",fileEncryPath);
            });
        });
    }
    
    /// 图片解密获取
    +(UIImage *)imageDecryptionImageFileName:(NSString *)imageFileName{
        NSString *fileDecryPath = [NSHomeDirectory()stringByAppendingPathComponent:[NSString stringWithFormat:@"/Documents/%@",imageFileName]];
        NSData *encryptedData = [NSData dataWithContentsOfFile:fileDecryPath];
        NSError *error;
        NSData *decryptedData = [RNDecryptor decryptData:encryptedData
                                            withPassword:aPassword
                                                   error:&error];
        if (!error) {
            NSLog(@"^_^ 图片解密成功 ……——(^_^)\n");
            return [UIImage imageWithData:decryptedData];
        }
        return nil;
    }
    
    
    #pragma mark - Plist文件加解密
    /// Plist文件加密
    +(void)plistEncryptionPlistName:(NSString *)plistName Type:(NSString *)type{
        __block NSData *encryptedData;
        __block NSError *error;
        // 本地存储加密图片路径
        NSString *fileEncryPath = [NSHomeDirectory()stringByAppendingPathComponent:[NSString stringWithFormat:@"/Documents/%@",plistName]];
        NSFileManager *fileManager = [NSFileManager defaultManager];
        //判断是否已存在加密文件,若存在直接执行解密过程。
        if ([fileManager fileExistsAtPath:fileEncryPath]) {
            return;
        }
        NSURL *URL=[[NSBundle mainBundle] URLForResource:plistName withExtension:type];
        //plist 文件为字典类型
        NSDictionary *dic=[NSDictionary dictionaryWithContentsOfURL:URL];
        NSError *parseError;
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&parseError];
        //异步去加密,防止占用太多内存
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            //加密
            encryptedData = [RNEncryptor encryptData:jsonData withSettings:kRNCryptorAES256Settings password:aPassword error:&error ];
            if (!error) {
                NSLog(@"^_^ plist文件加密成功 ……——(^_^)\n");
            }
            //在主线程上写入文件
            dispatch_sync(dispatch_get_main_queue(), ^{
                BOOL yes = [encryptedData writeToFile:fileEncryPath atomically:NO];
                if (yes) {
                    NSLog(@"加密plist文件写入成功");
    
                }else{
                    NSLog(@"加密plist文件写入失败");
                }
                NSLog(@"写入plist路径:%@",fileEncryPath);
            });
        });
    }
    
    /// Plist解密获取
    +(NSDictionary *)plistDecryptionPlistFileName:(NSString *)plistFileName{
        NSString *fileDecryPath = [NSHomeDirectory()stringByAppendingPathComponent:[NSString stringWithFormat:@"/Documents/%@",plistFileName]];
        NSData *encryptedData = [NSData dataWithContentsOfFile:fileDecryPath];
        //    解密
        NSError *error;
        NSData *decryptedData = [RNDecryptor decryptData:encryptedData
                                            withPassword:aPassword
                                                   error:&error];
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:decryptedData options:NSJSONReadingMutableContainers error:&error];
        if (error) {
          //解析出错
            NSLog(@"error===%@",error);
        }
        return dic;
    }
    
    #pragma mark - 清除
    +(void)clearArchiverData
    {
        NSError *error;
        NSString *fileEncryPath = [NSHomeDirectory()stringByAppendingPathComponent:@"/Documents"];
        NSFileManager *fileManager = [NSFileManager defaultManager];
        if([fileManager removeItemAtPath:fileEncryPath error:&error]){
            NSLog(@"清除本地序列化的文件成功....:%@",error);
        } else {
            NSLog(@"清除本地序列化的文件失败....:%@",error);
        }
    }
    
    @end
    
    

    使用

    //
    //  ViewController.m
    //  LCAESFileEncryption
    //
    //  Created by yxl on 2022/4/1.
    //
    
    #import "ViewController.h"
    #import "LCArchiveManager.h"
    
    @interface ViewController ()
    @property(strong,nonatomic)UIImageView *imageView;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [self createUI];
        [self imageEncryption];
        [self plistEncryption];
    }
    
    #pragma mark - 加密
    // 加密image
    - (void)imageEncryption{
        [LCArchiveManager imageEncryptionImageName:@"testImage" Type:@"jpg"];
    }
    
    // 加密plist文件
    - (void)plistEncryption{
        [LCArchiveManager plistEncryptionPlistName:@"Info" Type:@"plist"];
    }
    
    #pragma mark - 解密
    // 解密图片
    - (void)imageClicked{
        self.imageView.image = [LCArchiveManager imageDecryptionImageFileName:@"testImage"];
    }
    
    // 解密plist文件
    - (void)plistClicked{
        NSDictionary *dic = [LCArchiveManager plistDecryptionPlistFileName:@"Info"];
        NSLog(@"dic=====%@",dic);
    }
    
    #pragma mark - 清除加密文件
    - (void)clearClicked{
        [LCArchiveManager clearArchiverData];
    }
    
    -(void)createUI
    {
        CGFloat iPhoneHeight = self.view.bounds.size.height;
        CGFloat iPhoneWidth  = self.view.bounds.size.width;
        
        
        UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(50.f, 100.f, iPhoneWidth-100.f, 50.f)];
        [button addTarget:self action:@selector(plistClicked) forControlEvents:UIControlEventTouchUpInside];
        [button setTitle:@"查看PLIST" forState:UIControlStateNormal];
        button.layer.cornerRadius = 5.f;
        button.clipsToBounds = YES;
        button.layer.borderWidth = 1.f;
        button.layer.borderColor = [UIColor blackColor].CGColor;
        [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [self.view addSubview:button];
        
        UIButton *button1 = [[UIButton alloc]initWithFrame:CGRectMake(50.f, 200.f, iPhoneWidth-100.f, 50.f)];
        [button1 addTarget:self action:@selector(imageClicked) forControlEvents:UIControlEventTouchUpInside];
        [button1 setTitle:@"查看图片" forState:UIControlStateNormal];
        button1.layer.cornerRadius = 5.f;
        button1.clipsToBounds = YES;
        button1.layer.borderWidth = 1.f;
        button1.layer.borderColor = [UIColor blackColor].CGColor;
        [button1 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [self.view addSubview:button1];
        
        UIButton *button2 = [[UIButton alloc]initWithFrame:CGRectMake(50.f, 300.f, iPhoneWidth-100.f, 50.f)];
        [button2 addTarget:self action:@selector(clearClicked) forControlEvents:UIControlEventTouchUpInside];
        [button2 setTitle:@"清除加密文件" forState:UIControlStateNormal];
        button2.layer.cornerRadius = 5.f;
        button2.clipsToBounds = YES;
        button2.layer.borderWidth = 1.f;
        button2.layer.borderColor = [UIColor blackColor].CGColor;
        [button2 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [self.view addSubview:button2];
        
        
        self.imageView = [[UIImageView alloc]initWithFrame:CGRectMake(10, iPhoneHeight/2, iPhoneWidth-20, 300)];
        self.imageView.layer.borderColor = [UIColor blackColor].CGColor;
        self.imageView.layer.borderWidth = 1.f;
        self.imageView.clipsToBounds  = YES;
        self.imageView.layer.cornerRadius = 5.f;
        [self.view addSubview:self.imageView];
    }
    
    
    @end
    
    

    相关文章

      网友评论

        本文标题:iOS AES资源文件和plist文件加密

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