首页 > 其他分享 >iOS 在OC 中使用 AEC 的 ECB、CTR模式加解密

iOS 在OC 中使用 AEC 的 ECB、CTR模式加解密

时间:2024-10-12 14:13:10浏览次数:8  
标签:ECB CTR iOS length key NSData cipherDataDecrypt data size

实用实测过的代码。

 

AEC加解密网上一大把,简单列举一下。

CTR模式,搜索了好多,试用了好几个都是代码不完全参数不对造成无法正常运行加解密。

不同模式引用了不同的系统库路径。

 

调整加解密,修改参数 operation :kCCDecrypt / kCCEncrypt

AEC CTR模式解密

#import <CommonCrypto/CommonCrypto.h>

#import <CommonCrypto/CommonKeyDerivation.h>

#import <Security/Security.h>

+ (NSData *) AESCTRDecryptData:(NSData *)data withKey:(NSData *)key withiv:(NSData *)iv
{
    // Init cryptor
    CCCryptorRef cryptor = NULL;
    
    // Create Cryptor
    CCCryptorStatus createDecrypt = CCCryptorCreateWithMode(kCCDecrypt, // operation
                                                            kCCModeCTR, // mode CTR
                                                            kCCAlgorithmAES, // Algorithm
                                                            ccPKCS7Padding, // padding
                                                            iv.bytes, // can be NULL, because null is full of zeros
                                                            key.bytes, // key
                                                            key.length, // keylength
                                                            NULL, //const void *tweak
                                                            0, //size_t tweakLength,
                                                            0, //int numRounds,
                                                            kCCModeOptionCTR_BE, //CCModeOptions options,
                                                            &cryptor); //CCCryptorRef *cryptorRef
    
    
    if (createDecrypt == kCCSuccess)
    {
        // Alloc Data Out
        NSMutableData *cipherDataDecrypt = [NSMutableData dataWithLength:data.length + kCCBlockSizeAES128];
        
        //alloc number of bytes written to data Out
        size_t outLengthDecrypt;
        
        //Update Cryptor
        CCCryptorStatus updateDecrypt = CCCryptorUpdate(cryptor,
                                                        data.bytes, //const void *dataIn,
                                                        data.length,  //size_t dataInLength,
                                                        cipherDataDecrypt.mutableBytes, //void *dataOut,
                                                        cipherDataDecrypt.length, // size_t dataOutAvailable,
                                                        &outLengthDecrypt); // size_t *dataOutMoved)
        
        if (updateDecrypt == kCCSuccess)
        {
            //Cut Data Out with nedded length
            cipherDataDecrypt.length = outLengthDecrypt;
            
            // Data to String
//            NSString* cipherFinalDecrypt = [[NSString alloc] initWithData:cipherDataDecrypt encoding:NSUTF8StringEncoding];
            
            //Final Cryptor
            CCCryptorStatus final = CCCryptorFinal(cryptor, //CCCryptorRef cryptorRef,
                                                   cipherDataDecrypt.mutableBytes, //void *dataOut,
                                                   cipherDataDecrypt.length, // size_t dataOutAvailable,
                                                   &outLengthDecrypt); // size_t *dataOutMoved)
            
            if (final == kCCSuccess)
            {
                //Release Cryptor
                //CCCryptorStatus release =
                CCCryptorRelease(cryptor); //CCCryptorRef cryptorRef
            }
            
            return cipherDataDecrypt;
        }
    }
    else
    {
        //error
        NSLog(@"AESCTRDecryptData is error");
    }
    
    return nil;
}

 

 

AEC ECB模式加密


//加密算法


#import <CommonCrypto/CommonDigest.h>


#import <CommonCrypto/CommonCryptor.h>



/**  加密:先采用AES/ECB/PKCS5Padding,再采用base64-url-safe 编码  */ + (NSString *)encryptAES128WithContent:(NSString *)content key:(NSString *)key{ NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding]; NSUInteger dataLength = contentData.length; // 为结束符'\0' +1 char keyPtr[kCCKeySizeAES128+1]; memset(keyPtr,0,sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; // 密文长度 <= 明文长度 + BlockSize size_t encryptSize = dataLength + kCCBlockSizeAES128; void * encryptedBytes = malloc(encryptSize); size_t actualOutSize = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding|kCCOptionECBMode, //CBC -> PKCS7Padding,ECB -> kCCOptionPKCS7Padding|kCCOptionECBMode keyPtr, kCCKeySizeAES128, NULL, contentData.bytes, dataLength, encryptedBytes, encryptSize, &actualOutSize); if(cryptStatus ==kCCSuccess) { NSData*data = [NSData dataWithBytesNoCopy:encryptedBytes length:actualOutSize]; NSString *base64Str = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; NSMutableString *mutBase64Str = [NSMutableString stringWithString:base64Str]; mutBase64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"+" withString:@"-"]; mutBase64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"/" withString:@"_"]; mutBase64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"=" withString:@""]; return mutBase64Str; } free(encryptedBytes); return nil; }

 

标签:ECB,CTR,iOS,length,key,NSData,cipherDataDecrypt,data,size
From: https://www.cnblogs.com/xujiahui/p/18460435

相关文章

  • electron-vite_4使用WebContentsView快速集成已有项目
    Web嵌入官方推荐使用WebContentsView;集成也比较简单,但还是需要你单独写点东西;src/main/index.ts进行修改import{app,shell,BrowserWindow,ipcMain,nativeImage,WebContentsView,dialog}from'electron';functioncreateWindow():void{//1.创建br......
  • electron-vite_6js-cookie失效
    我们项目是用了js-cookie,后续集成的时候发现,无法进入首页;经过排查是js-cookie无法使用,可能是electron打包后的项目运行的时候是file:///猜测原因:因为Cookie是与域名相关联的,而file:///协议没有域名,因此Cookie可能无法正常工作。file:///C:/Users/Administrator/AppData/......
  • Linux中ctrl+z 、ctrl+c、 ctrl+d区别
    ctrl+c和ctrl+z都是中断命令,但是他......
  • IOS(ipad)上安装UTM虚拟机并安装ubuntu22.04
    如果是升级了IOS17以上的朋友可以不用想了,没得玩安装步骤准备环境安装AltStore安装巨魔商店安装Dopamine安装UTM虚拟机安装ubuntu服务端准备环境1、准备环境IOS14.0beta2-16.6.1,16.7RC(20H18),17.0准备AltStore、巨魔商店TrollStore、Dopamine、......
  • Android & iOS 使用 ARMS 用户体验监控(RUM)的最佳实践
    作者:元泊引言背景信息随着移动互联网技术的持续演进与全民互联网时代的深入,用户在Android、iOS应用程序、小程序、H5游戏及网页等多元化平台上的交互时长显著增长。这一趋势加剧了用户体验(UX)场景的复杂性,并对跨设备及多样网络环境下的性能监控提出了更高要求。在此背景下,深......
  • 运行使用Electron-forge打包的electron package时遇到在js文件中执行的exec命令和在渲
    js文件中执行的exec命令出错很可能是项目中使用了一些非html,css,js的源文件,比如用了Makefile来编译了cpp代码,或者执行的exec命令为cpdir/something.cpp之类的文件操作命令。可以使用修改forge.config.js文件配置的方式,使得npmrunmake的时候自动把Makefile等exec命令中用到......
  • iOS NSString 使用Copy修饰,而不使用Strong修饰
    其实老实讲,定义@property属性,“使用Copy修饰,而不是用Strong修饰”这句话也不完全正确.因为如果他们对接的是不可变字符串,那么无论使用哪个都一样.问题就出现在,如果他们对接的是可变字符串NSMutableString,那就得用copy定义两个NSString属性:@interfaceViewControll......
  • 基于Vue3+pinia+vue-router+axios+element-plus等开发的新闻发布管理系统
    新闻发布管理系统是一个基于Vue3+pinia+vue-router+axios+element-plus等开发的系统,主要功能包括:登录模块、注册模块、新闻分类管理模块、新闻管理模块、个人中心模块(包括基本资料、更换头像、重置密码功能)等。代码下载:源码下载基于Vue3开发的新闻发布管理系统,使用的前端......
  • KINDEDITOR 实现CTRL+V粘贴图片并上传、WORD粘贴带图片
    编辑器:KindEditor需求:从word复制粘贴内容和图片系统:windows,macOS,linux,信创国产化前端:vue2,vue3,vue-cli,后端:java,asp.net,php,asp要求:开源,免费,技术支持最近这块好像很火,或者说需求有点旺盛,今天早上又有网友加我微信,实际上之前就已经在网上公布了微信号了,但是很多......
  • 前端解决axios请求的跨域问题【二步完成超简单】
         ......