面试题答案
一键面试- 主要步骤:
- 引入CommonCrypto框架:在项目中导入
#import <CommonCrypto/CommonCrypto.h>
。 - 将字符串转换为字节数组:因为加密操作是对字节数据进行的,所以需要把Objective - C的字符串转换为字节数组。
- 设置加密相关参数:包括加密模式、填充方式等。
- 执行加密操作:调用CommonCrypto框架提供的函数进行加密。
- 处理加密结果:通常加密结果也是字节数组,可能需要转换为合适的格式,比如Base64编码的字符串以便传输或存储。
- 引入CommonCrypto框架:在项目中导入
- 关键代码片段:
#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编码的字符串输出。注意在实际应用中,密钥等敏感信息应妥善管理。