面试题答案
一键面试大致步骤
- 选择加密算法:例如使用常用的对称加密算法AES。在Objective-C中可以借助第三方库如
CommonCrypto
来实现。 - 准备加密所需参数:包括加密密钥、初始化向量(对于某些算法如AES需要)等。
- 将字符串转换为合适的数据格式:一般需要将字符串转换为
NSData
。 - 执行加密操作:调用加密函数,传入数据和参数进行加密。
- 处理加密结果:通常将加密后的
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);