MST

星途 面试题库

面试题:Objective-C在iOS应用安全中关于数据加密的基础实现

在Objective-C中,如何使用CommonCrypto框架对一段简单的字符串进行AES加密?请描述主要步骤并给出关键代码片段。
30.0万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 主要步骤
    • 引入CommonCrypto框架:在项目中导入#import <CommonCrypto/CommonCrypto.h>
    • 将字符串转换为字节数组:因为加密操作是对字节数据进行的,所以需要把Objective - C的字符串转换为字节数组。
    • 设置加密相关参数:包括加密模式、填充方式等。
    • 执行加密操作:调用CommonCrypto框架提供的函数进行加密。
    • 处理加密结果:通常加密结果也是字节数组,可能需要转换为合适的格式,比如Base64编码的字符串以便传输或存储。
  2. 关键代码片段
#import <CommonCrypto/CommonCrypto.h>
#import <Security/Security.h>
#import <UIKit/UIKit.h>

// 字符串转NSData
NSData *stringToData(NSString *string) {
    return [string dataUsingEncoding:NSUTF8StringEncoding];
}

// 加密函数
NSData *aesEncryptData(NSData *data, NSString *key) {
    char keyPtr[kCCKeySizeAES256 + 1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    NSUInteger dataLength = data.length;
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          nil /* initialization vector (optional) */,
                                          data.bytes, dataLength,
                                          buffer, bufferSize,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
    free(buffer);
    return nil;
}

// 示例使用
NSString *originalString = @"Hello, World!";
NSString *encryptionKey = @"12345678901234567890123456789012";
NSData *dataToEncrypt = stringToData(originalString);
NSData *encryptedData = aesEncryptData(dataToEncrypt, encryptionKey);
if (encryptedData) {
    NSString *base64EncryptedString = [encryptedData base64EncodedStringWithOptions:0];
    NSLog(@"Encrypted String: %@", base64EncryptedString);
} else {
    NSLog(@"Encryption failed");
}

在上述代码中:

  • stringToData函数将字符串转换为NSData
  • aesEncryptData函数进行AES加密操作,设置了加密模式为AES128,填充方式为PKCS7。
  • 最后对示例字符串进行加密,并将加密结果转换为Base64编码的字符串输出。注意在实际应用中,密钥等敏感信息应妥善管理。