美文网首页程序开发
iOS开发丨AES-128-CBC加密解密算法的实现

iOS开发丨AES-128-CBC加密解密算法的实现

作者: 炼心术师 | 来源:发表于2019-12-18 10:38 被阅读0次

AES是开发中常用的加密算法之一,在多平台统一加密时,需要统一的几个参数:

• 密钥长度(Key Size)
本文中使用的是AES-128,已能够满足商用安全需求。

• 加密模式(Cipher Mode)
有CBC、ECB、CTR、OFB、CFB等几种,本文使用CBC模式。

• 填充方式(Padding)
iOS SDK中提供了PKCS7Padding,与JDK中的PKCS5Padding是相等的。

• 初始向量(Initialization Vector)
除ECB以外的其他加密模式均需要传入一个初始向量,其大小与Block Size相等。其他加密模式当不传入初始向量时,系统将默认使用一个全0的初始向量。

具体实现

.h文件如下:

#import <Foundation/Foundation.h>

NSString * aesEncryptString(NSString *content, NSString *key, NSString *iv);
NSString * aesDecryptString(NSString *content, NSString *key, NSString *iv);
NSData   * aesEncryptData(NSData *contentData, NSData *keyData, NSData *ivData);
NSData   * aesDecryptData(NSData *contentData, NSData *keyData, NSData *ivData);

.m文件如下:

#import <CommonCrypto/CommonCryptor.h>

NSData * cipherOperation(NSData *contentData, NSData *keyData, NSData *ivData, CCOperation operation) {
    NSUInteger dataLength = contentData.length;
    void const *initVectorBytes = ivData.bytes;
    void const *contentBytes = contentData.bytes;
    void const *keyBytes = keyData.bytes;
    
    size_t operationSize = dataLength + kCCBlockSizeAES128;
    void *operationBytes = malloc(operationSize);
    if (operationBytes == NULL) {
        return nil;
    }
    size_t actualOutSize = 0;
    
    CCCryptorStatus cryptStatus = CCCrypt(operation,
                                          kCCAlgorithmAES,
                                          kCCOptionPKCS7Padding,  // 与其他平台的PKCS5Padding相等
                                          keyBytes,
                                          kCCKeySizeAES128,  // 秘钥长度选择AES128
                                          initVectorBytes,
                                          contentBytes,
                                          dataLength,
                                          operationBytes,
                                          operationSize,
                                          &actualOutSize);
    
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:operationBytes length:actualOutSize];
    }
    
    free(operationBytes);
    operationBytes = NULL;
    return nil;
}

NSString * aesEncryptString(NSString *content, NSString *key, NSString *iv) {    
    NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
    NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
    NSData *ivData = [iv dataUsingEncoding:NSUTF8StringEncoding];
    
    NSData *encrptedData = aesEncryptData(contentData, keyData, ivData);
    return [encrptedData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
}

NSString * aesDecryptString(NSString *content, NSString *key, NSString *iv) {
    NSData *contentData = [[NSData alloc] initWithBase64EncodedString:content options:NSDataBase64DecodingIgnoreUnknownCharacters];
    NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
    NSData *ivData = [iv dataUsingEncoding:NSUTF8StringEncoding];
    
    NSData *decryptedData = aesDecryptData(contentData, keyData, ivData);
    return [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
}

NSData * aesEncryptData(NSData *contentData, NSData *keyData, NSData *ivData) {
    return cipherOperation(contentData, keyData, ivData, kCCEncrypt);
}

NSData * aesDecryptData(NSData *contentData, NSData *keyData, NSData *ivData) {
    return cipherOperation(contentData, keyData, ivData, kCCDecrypt);
}

注意

以上实现的是AES-128,因此方法传入的秘钥key和向量iv需要长度为16的字符串。

相关文章

  • Java实现微信对称解密算法获取小程序用户信息

    加密对称解密算法如下: 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。 对称解密的目标密...

  • iOS开发丨AES-128-CBC加密解密算法的实现

    AES是开发中常用的加密算法之一,在多平台统一加密时,需要统一的几个参数: • 密钥长度(Key Size)本文中...

  • IOS安全加密

    IOS安全加密是我们在做网络开发中必不可少的部分。关于加密算法的几个分类: 对称加密a.原理:加密解密都使用相同的...

  • RSA加密

    RSA加密为非对称加密实现 对称加密:加密解密使用同一个算法 非对称加密:加密和解密使用不同算法 rsa加密原理 ...

  • 对加密算法 AES-128-CBC 的一些理解

    对加密算法 AES-128-CBC 的一些理解 简单说明 AES-128-CBC是一种分组对称加密算法,即用同一组...

  • 尝试理解iOS证书相关问题

    iOS的签名算法 非对称(公私钥)加密:加密密钥和解密密钥是不同的,而且是成对出现的。可解密(可逆)。RSA算法就...

  • iOS常用加密算法

    本篇主要介绍笔者在iOS开发工作中用到的加解密算法的使用,主要包括:1)对称加密算法:AES、DES、3DES2)...

  • 深入理解加密解密

    一、概述 在开发项目中我们必然会涉及到加密解密,我们常需要用到加解密算法,加解密算法主要分为三大类: 1、对称加密...

  • iOS开发_AES加密和解密算法的实现

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rij...

  • 计算机安全学第四次实践作业

    1.Python实现RSA算法的加密、解密、签名/验证签名 1.1生成秘钥 1.2加密 1.3解密 1.4数字签名...

网友评论

    本文标题:iOS开发丨AES-128-CBC加密解密算法的实现

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