MST

星途 面试题库

面试题:Objective-C 在 Mac OS 应用加密方面的基础实践

在 Mac OS 应用开发中,使用 Objective-C 如何实现简单的字符串加密?请描述大致步骤并给出关键代码示例。
14.5万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

大致步骤

  1. 选择加密算法:例如使用常用的对称加密算法AES。在Objective-C中可以借助第三方库如CommonCrypto来实现。
  2. 准备加密所需参数:包括加密密钥、初始化向量(对于某些算法如AES需要)等。
  3. 将字符串转换为合适的数据格式:一般需要将字符串转换为NSData
  4. 执行加密操作:调用加密函数,传入数据和参数进行加密。
  5. 处理加密结果:通常将加密后的NSData转换为合适的表示形式,如Base64编码的字符串以便传输或存储。

关键代码示例

#import <CommonCrypto/CommonCryptor.h>
#import <CommonCrypto/CommonDigest.h>
#import <UIKit/UIKit.h>

// 加密函数
NSData *AESEncryptData(NSData *data, NSString *key, NSString *iv) {
    char keyPtr[kCCKeySizeAES256 + 1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) - 1 encoding:NSUTF8StringEncoding];
    
    char ivPtr[kCCBlockSizeAES128 + 1];
    bzero(ivPtr, sizeof(ivPtr));
    [iv getCString:ivPtr maxLength:sizeof(ivPtr) - 1 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,
                                          ivPtr,
                                          [data bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesEncrypted);
    
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
    free(buffer);
    return nil;
}

// 将字符串加密并转换为Base64编码字符串
NSString *encryptString(NSString *string, NSString *key, NSString *iv) {
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    NSData *encryptedData = AESEncryptData(data, key, iv);
    return [encryptedData base64EncodedStringWithOptions:0];
}

使用示例:

NSString *originalString = @"Hello, World!";
NSString *key = @"12345678901234567890123456789012"; // 256位密钥
NSString *iv = @"1234567890123456"; // 128位初始化向量
NSString *encryptedString = encryptString(originalString, key, iv);
NSLog(@"Encrypted String: %@", encryptedString);