首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Objective-C中用AES实现文件的加解密

在Objective-C中使用AES实现文件的加解密,你可以使用CommonCrypto库,这是一个提供加密算法的框架。以下是一个简单的示例,展示了如何使用AES加密和解密文件。

首先,确保你的项目已经包含了Security.framework框架。

AES加密文件

代码语言:javascript
复制
#import <CommonCrypto/CommonCryptor.h>

- (BOOL)encryptFileAtPath:(NSString *)sourcePath toPath:(NSString *)destinationPath withKey:(NSString *)key {
    NSFileHandle *sourceFile = [NSFileHandle fileHandleForReadingAtPath:sourcePath];
    if (!sourceFile) {
        NSLog(@"无法打开源文件");
        return NO;
    }

    NSFileManager *fileManager = [NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:destinationPath]) {
        [fileManager removeItemAtPath:destinationPath error:nil];
    }

    [fileManager createFileAtPath:destinationPath contents:nil attributes:nil];
    NSFileHandle *destinationFile = [NSAddressBook createFileAtPath:destinationPath contents:nil attributes:nil];
    if (!destinationFile) {
        NSLog(@"无法创建目标文件");
        return NO;
    }

    NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
    uint8_t iv[kCCBlockSizeAES128];
    memset(iv, 0x0, sizeof(iv));

    CCCryptorRef cryptor;
    CCCryptorCreate(kCCEncrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding,
                    keyData.bytes, keyData.length, iv, &cryptor);

    while (YES) {
        @autoreleasepool {
            NSData *data = [sourceFile readDataOfLength:64 * 1024];
            if (data.length == 0) {
                break;
            }

            NSMutableData *encryptedData = [NSMutableData dataWithCapacity:data.length + kCCBlockSizeAES128];
            size_t encryptedLength;
            CCCryptorUpdate(cryptor, data.bytes, data.length, encryptedData.mutableBytes, encryptedData.capacity, &encryptedLength);
            encryptedData.length = encryptedLength;
            [destinationFile writeData:encryptedData];
        }
    }

    CCCryptorFinal(cryptor, encryptedData.mutableBytes, encryptedData.capacity, &encryptedLength);
    encryptedData.length = encryptedLength;
    [destinationFile writeData:encryptedData];

    CCCryptorRelease(cryptor);

    [sourceFile closeFile];
    [destinationFile closeFile];

    return YES;
}

AES解密文件

代码语言:javascript
复制
- (BOOL)decryptFileAtPath:(NSString *)sourcePath toPath:(NSString *)destinationPath withKey:(NSString *)key {
    NSFileHandle *sourceFile = [NSFileHandle fileHandleForReadingAtPath:sourcePath];
    if (!sourceFile) {
        NSLog(@"无法打开源文件");
        return NO;
    }

    NSFileManager *fileManager = [NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:destinationPath]) {
        [fileManager removeItemAtPath:destinationPath error:nil];
    }

    [fileManager createFileAtPath:destinationPath contents:nil attributes:nil];
    NSFileHandle *destinationFile = [NSFileHandle fileHandleForWritingAtPath:destinationPath];
    if (!destinationFile) {
        NSLog(@"无法创建目标文件");
        return NO;
    }

    NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
    uint8_t iv[kCCBlockSizeAES128];
    memset(iv, 0x0, sizeof(iv));

    CCCryptorRef cryptor;
    CCCryptorCreate(kCCDecrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding,
                    keyData.bytes, keyData.length, iv, &cryptor);

    while (YES) {
        @autoreleasepool {
            NSData *data = [sourceFile readDataOfLength:64 * 1024];
            if (data.length == 0) {
                break;
            }

            NSMutableData *decryptedData = [NSMutableData dataWithCapacity:data.length + kCCBlockSizeAES128];
            size_t decryptedLength;
            CCCryptorUpdate(cryptor, data.bytes, data.length, decryptedData.mutableBytes, decryptedData.capacity, &decryptedLength);
            decryptedData.length = decryptedLength;
            [destinationFile writeData:decryptedData];
        }
    }

    CCCryptorFinal(cryptor, decryptedData.mutableBytes, decryptedData.capacity, &decryptedLength);
    decryptedData.length = decryptedLength;
    [destinationFile writeData:decryptedData];

    CCCryptorRelease(cryptor);

    [sourceFile closeFile];
    [destinationFile closeFile];

    return YES;
}

请注意,这个示例使用了固定的初始化向量(IV),在实际应用中,你应该使用随机生成的IV,并将其与加密数据一起存储,以便在解密时使用。

此外,这个示例没有处理错误情况,你可能需要添加适当的错误处理代码来提高程序的健壮性。

在使用这些代码之前,请确保你已经了解了AES加密的安全性,并且你的密钥管理策略是安全的。加密和解密操作应该在安全的环境中进行,以防止密钥泄露。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Golang 实现与 crypto-js 一致 AES 简单加解密

前言 最近一直折腾 Golang AES 加密解密,最初一个小需求只是寻求一个简单直接加密工具而已,但是找着找着发现里面的坑太深了… 吐槽:对于加密解密,其实我们很多时候并没有特别高要求(...难道,就没有一个让我最省心、简单、最快、实现一个加解密方法吗?...AES 某些加密模式下需要指定 IV 也就是初始向量(那我岂不是又要弄一个配置项?)...并且通常如果作为配置项出现的话,两个 key 肯定是配置在一起,配置文件里面一般不会为了安全而特别的将两个密码分开存放。 所以我思考如何创造一个 IV 呢?...IV 与 key 一致某些加密模式下相当于你直接将 key 暴露给了用户 所以我参考了老版本 node 实现,并且改进了一下 The password is used to derive the

3.4K20
  • Python中用GDAL实现矢量对栅格切割实例

    概述: 本文讲述如何在Python中用GDAL实现根据输入矢量边界对栅格数据裁剪。 效果: ? 裁剪前 ? 矢量边界 ?...裁剪后 实现代码: # -*- coding: utf-8 -*- """ @author lzugis @date 2017-06-02 @brief 利用shp裁剪影像 """ from osgeo...world.tif' main( shapefile_path, raster_path ) 补充知识:Python+GDAL | 读取矢量并写出txt 这篇文章主要描述了如何使用GDAL/OGR打开矢量文件...代码 import ogr,sys,os import numpy as np os.chdir(r'E:\') #设置driver,并打开矢量文件 driver = ogr.GetDriverByName...layer.ResetReading() feature.Destroy() ds.Destroy() 以上这篇Python中用GDAL实现矢量对栅格切割实例就是小编分享给大家全部内容了,希望能给大家一个参考

    1.1K10

    iOS逆向之还原CCCrypt加解密算法

    因此,这里对AES128加密算法进行还原(解密算法类似),分别有Objective-C及java,附上代码如下: Objective-C: +(NSString *)AES128Encrypt:(id)...not included) kCCModeOFB = 7, kCCModeXTS = 8, kCCModeRC4 = 9, kCCModeCFB8 = 10 */ //表示选择加解密模式...const void *key, //密钥,对称加密,加解密密钥都一样,依据选择算法标准,密钥长度不同 size_t keyLength,//密钥长度,加解密时依据keyLength取密钥长度...kCCKeySizeMinBlowfish = 8, kCCKeySizeMaxBlowfish = 56, */ const void *iv, //偏移向量 const void *dataIn, //进行加解密原始数据...size_t dataInLength,//进行加解密原始数据长度 void *dataOut, //加解密完后,数据保存地方 size_t dataOutAvailable, //保存加解密数据需要空间

    1.2K20

    Objective-C NSFileManager使用 各种文件操作所有方法具体实现

    写在前面 弄了下个人站...防止内容再次被锁定...所有东西都在这里面 welcome~ 个人博客 所有方法 都很简单,大概记录一下,写文件并没有是追加方式而是简单覆盖 //创建文件夹...; //写文件-字典 - (BOOL)writeDict:(NSDictionary*)dict inFilePath:(NSString*)filePath ; //写文件-数组 - (BOOL)writeArray...//获取某个目录下所有文件 - (NSArray*)getAllFileAtDir:(NSString*)dirPath ; //判断文件是否存在 - (BOOL)fileIsExistAtPath:...计算整个文件夹中所有文件大小 - (unsigned long long)computerDirSizeAtPath:(NSString*)dirPath; //删除文件 - (BOOL)removeFileAtPath...:(NSString*)toPath; 具体实现 初始化一下NSFileManager 并获取根路径 主要是加了一些判断,代码不是很精简 不要笑我。

    86230

    PHP AES加解密:用代码为数据加上保护盾牌

    你可以php.ini文件中启用它,或者通过以下命令行安装: sudo apt-get install php-openssl 步骤2:编写AES加解密函数 <?...这就像是进行一场神秘加解密仪式,数据被保护得妥妥当当。 AES高级应用 了解了基础操作后,我们来看看一些高级应用场景,让AES实际项目中发挥更大作用。...数据库字段加密 实际应用中,我们经常需要对数据库中某些敏感字段进行加密,以增加数据安全性。使用AES可以轻松实现对数据库字段加解密操作。...文件加解密 除了对字符串进行加解密AES还可以用于文件加解密。...你只需提供输入文件路径和输出文件路径,就可以实现文件安全处理。 AES未来 AES作为一种安全可靠加解密算法,其未来充满了无限可能。

    40910

    linux环境下实现文件读写操作

    ---- 今天分享一下linux系统实现文件读写一些基本操作,在这之前我们要掌握一些基本技能在Linux环境。...linux api man 3 xxx 这里3表示为查询是c库函数 了解了这个后我们就可以开始来实现标题说操作了。...二、文件操作基本步骤分为: a、linux系统中要操作一个文件,一般是先open打开一个文件,得到一个文件扫描描述符,然后对文件进行读写操作(或其他操作),最后关闭文件即可。...,当我们去打开一个文件时,linux内核做操作包括:内核进程中建立了一个打开文件数据结构, 记录下我们打开这个文件,内核在内存中申请一段内存,并且将静态文件内容从块设备中读取到内存中特定地址管理存放...(linux中文件描述符fd 10 合法范围是0或者是一个正数,不可能是负数) 11 fd=open("a.txt",O_RDWR);//O_RDWR表示文件可读可写,这个可以用man 手册查看

    2.7K30

    原生加密:腾讯云数据安全中台解决方案

    通过直接调用KMS接口选择采用对称密钥或非对称密钥进行数据加解密,默认海外节点是 AES 算法,国内是国密算法,解决传统用户本地加解密痛点,权限是无法管控。...(5)无缝集成云产品,实现云上数据透明加密 企业上云非常在意一点是数据存储安全性,通过 KMS 如何如何实现简单数据安全存储?KMS集成了多款云产品,通过授权方式实现特别数据加解密功能。...可采用应用层加密或数据库层加密方式: 业务自己应用层进行数据加解密,结合 SDK 应用内对数据解密后进行明文展示,这种方式用户实现成本相对比较高,需要自己去实现各种各样逻辑。...借助CASB,用户可以轻松实现基于商用密码算法应用免改造、字段级加密,以及基于密码应用防黑客攻击数据安全保护方案。 Q&A Q:一般加解密耗时是什么范围?...A:通过KMS进行加解密是通过硬件加密机,基本上10毫秒以内,整体耗时也需要看用户网络环境,通常情况下是30-50毫秒以内,如果对性能比较敏感,可以通过多级密钥方式本地进行高性能加解密,本地进行数据加解密主要取决于服务器配置

    14.1K13557

    SpringBoot项目中,自定义注解+拦截器优雅实现敏感数据加解密

    实际生产项目中,经常需要对如身份证信息、手机号、真实姓名等敏感数据进行加密数据库存储,但在业务代码中对敏感信息进行手动加解密则十分不优雅,甚至会存在错加密、漏加密、业务人员需要知道实际加密规则等情况...一、什么是Mybatis Plugin mybatis官方文档中,对于Mybatis plugin介绍是这样: MyBatis 允许你已映射语句执行过程中某一点进行拦截调用。...二、实现基于注解敏感信息加解密拦截器 2.1 实现思路 对于数据加密与解密,应当存在两个拦截器对数据进行拦截操作 参照官方文档,因此此处我们应当使用ParameterHandler拦截器对入参进行加密...3、注解实体类中需要加解密字段 [wp_editor_md_7b1aef1e35930ac1860903cc3cdac616.jpg] 此时mapper中,指定paramType=User resultType...=User 便可实现脱离业务层,基于mybatis拦截器加解密操作。

    1.5K20

    实战篇-OpenSSL之AES加密算法-CFB1模式

    实战篇-OpenSSL之AES加密算法-CFB1模式 一、AES简介 二、CFB1模式 1、命令行操作 2、函数说明 3、编程实现 (1)特别注意 (2)实现CFB1模式加解密 (3)测试代码 一、AES...具体加密原理,就不进行介绍了,本文主要从使用角度,进行说明。 以下命令行和编程实现,均基于OpenSSL开源库。命令行中,我们可以使用命令实现文件加解密,以验证我们编程实现,是否正确。...,解密后文件为hello.de。...num 应总是为0,否则会触发断言 enc AES_ENCRYPT 代表加密, AES_DECRYPT代表解密 AES_cfb1_encrypt加密过程中会修改ivec内容,因此ivec...(2)实现CFB1模式加解密 下面,函数已经封装完毕,如下: /** * @brief AES::cfb1_encrypt * CFB1模式加解密,支持对任意长度明文进行加解密

    1.6K10

    SpringBoot 项目中,自定义注解+拦截器优雅实现敏感数据加解密

    来源:blog.csdn.net/bbcckkl/article/details/104069487 一、什么是Mybatis Plugin 二、实现基于注解敏感信息加解密拦截器 2.1 实现思路 2.2...定义需要加密解密敏感信息注解 2.3 定义加密接口及其实现类 2.4 实现入参加密拦截器 2.5 定义解密接口及其实现类 2.6 定义出参解密拦截器 3、注解实体类中需要加解密字段 ?...---- 实际生产项目中,经常需要对如身份证信息、手机号、真实姓名等敏感数据进行加密数据库存储,但在业务代码中对敏感信息进行手动加解密则十分不优雅,甚至会存在错加密、漏加密、业务人员需要知道实际加密规则等情况...二、实现基于注解敏感信息加解密拦截器 2.1 实现思路 对于数据加密与解密,应当存在两个拦截器对数据进行拦截操作 参照官方文档,因此此处我们应当使用ParameterHandler拦截器对入参进行加密...3、注解实体类中需要加解密字段 ? 图片 此时mapper中,指定paramType=User resultType=User 便可实现脱离业务层,基于mybatis拦截器加解密操作。

    2.8K41

    20.3 OpenSSL 对称AES加解密算法

    实际应用中,通常采用混合加密方式,即使用RSA算法加密对称加密算法中密钥,再使用对称加密算法加密数据,以保证数据机密性和加密解密效率。...OpenSSL库提供了对AES加密支持,但在使用时读者还是需要自行封装一些通用加解密函数,如下代码片段是笔者常用一些函数总结,其中aes_cbc_encrypt函数用于使用CBC模式对特定字符串加密...,aes_cbc_decrypt则使用CBC模式对字符串进行解密,第二个函数AES函数则是使用OpenSSL库默认加解密函数二次封装实现。...}}有了上述算法封装,接下来笔者将依次演示这几种不同加密函数是如何被应用,首先简单介绍一下aes_cbc_encrypt与aes_cbc_decrypt这两个函数都是自己封装AES加解密算法,这两个算法参数传递保持一致...实现对数据加解密处理功能,如下是这段代码输出效果;图片第二种调用方式是采用API实现,其中AES函数,通过AES_set_encrypt_key设置加密密钥,并直接调用AES_encrypt实现数据加密

    1.2K40

    讲讲网络模块中加解密那点儿事--AES+BASE64提问理论代码

    需要注意是,因为 AES 加解密时输入和输出都是二进制串信息,因此,发送时需先将明文通过 UTF-8 解码成二进制串,然后进行加密,再对这串二进制密文通过 BASE64 编码成密文串发送给接收方。...实现代码是不是很简单,具体算法实现都已经封装好了,就是调一调 api 事。...、换行符 static string removeSpace(string content); }; 以下才是具体实现,其中头部 include AES.h,Base64.h,UTF8.h...这些文件基本都是作为工具类使用,不需要进行改动。可能需要稍微改一改就只是 AES.h 文件,因为不同填充模式需要改一个常量值。...加解密结果网站,方便调试: http://www.seacha.com/tools/aes.html Java 实现那么方便,为什么还需要用 C++ 呢?

    94430

    系统讲解 - PHP 接口签名验证

    下面主要分享一些工作中常用加解密方法。 常用验证 举例:/api/login?...常用算法 RSA 优点 与对称加密相比,安全性更好,加解密需要不同密钥,公钥和私钥都可进行相互加解密。 缺点 加密和解密花费时间长、速度慢,只适合对少量数据进行加密。...将日志写到文件中,查看也不是很方便。 我们二次开发一个新系统时候,想查看执行了哪些Sql语句及程序warning,notice等错误信息。...能实现为什么要选择RPC?...HTTP 也是 RPC 实现一种方式。 性能消耗: HTTP 大部分基于 JSON 实现,序列化需要时间和性能。 RPC 可以基于二进制进行传输,消耗性能少一点。

    1.9K31

    crypto-js aes 加解密

    前端 crypto-js aes 加解密 背景 前段时间公司做项目,该项目涉及到敏感数据比较多,经过一波讨论之后,决定前后端进行接口加密处理,采用AES + BASE64 算法加密~ 网上关于...AES 对称加密算法介绍挺多,对这一块还不是特别理解小伙伴可自行百度,这里我推荐一篇AES加密算法详细介绍与实现,讲还是蛮详细~ 具体实现 其实搞懂了是怎么一回事,做起来还是挺简单,因为库都是现成...,我们只需要会用就好啦,这里我推荐一篇理解AES加密解密使用方法,加深大家对 AES 算法理解~ 这里我以 Vue 作为例子,其他也就大同小异了~ 要用 AES 算法加密,首先我们要引入 crypto-js...,crypto-js 是一个纯 javascript 写加密算法类库 ,可以非常方便地 javascript 进行 MD5、SHA1、SHA2、SHA3、RIPEMD-160 哈希散列,进行 AES...加解密方法,是不是感觉很简单啊,用起来很简单,原理可不简单,况且这也只是其中一种方案,关于加解密方法还有很多,感兴趣小伙伴们可以继续做一些深入研究哈~

    7.4K30

    软考高级:对称加密和非对称加密区别优缺点以及常见算法

    优点: 加解密速度快,适用于大量数据加密。 算法相对简单,易于实现。 缺点: 密钥管理困难,当参与通信双方增多时,需要安全地分发和管理大量密钥。...算法实现较为复杂。...应用场景:对称加密适用于需要快速加解密场景,如文件加密、数据传输等;非对称加密常用于密钥交换、数字签名等需要高安全性场景。...AES B. RSA C. DES D. 3DES 下列哪项不是非对称加密优点? A. 解决了密钥分发问题 B. 加解密速度快 C. 提高了通信安全性 D....非对称加密如 RSA 加解密过程中相对较慢,不适合用于大量数据加密。 B. 加解密速度快。非对称加密一个主要缺点是加解密过程较慢,不适合大量数据加密。 A. 对称加密。

    16000
    领券