Ios AES加密
时间: 2023-08-26 14:05:27 浏览: 55
iOS中使用AES加密可以使用CommonCrypto库提供的API实现。具体步骤如下:
1. 引入头文件:
```objective-c
#import <CommonCrypto/CommonCryptor.h>
```
2. 定义加密/解密方法:
```objective-c
// 加密方法
+ (NSString *)encrypt:(NSString *)content key:(NSString *)key iv:(NSString *)iv {
char keyPtr[kCCKeySizeAES256 + 1];
memset(keyPtr, 0, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
char ivPtr[kCCBlockSizeAES128 + 1];
memset(ivPtr, 0, sizeof(ivPtr));
[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
int bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus status = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr,
kCCBlockSizeAES128,
ivPtr,
[data bytes],
dataLength,
buffer,
bufferSize,
&numBytesEncrypted);
if (status == kCCSuccess) {
NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
return [resultData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
}
free(buffer);
return nil;
}
// 解密方法
+ (NSString *)decrypt:(NSString *)content key:(NSString *)key iv:(NSString *)iv {
char keyPtr[kCCKeySizeAES256 + 1];
memset(keyPtr, 0, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
char ivPtr[kCCBlockSizeAES128 + 1];
memset(ivPtr, 0, sizeof(ivPtr));
[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
NSData *data = [[NSData alloc] initWithBase64EncodedString:content options:NSDataBase64DecodingIgnoreUnknownCharacters];
NSUInteger dataLength = [data length];
int bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus status = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr,
kCCBlockSizeAES128,
ivPtr,
[data bytes],
dataLength,
buffer,
bufferSize,
&numBytesDecrypted);
if (status == kCCSuccess) {
NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];
}
free(buffer);
return nil;
}
```
3. 调用加密/解密方法:
```objective-c
NSString *key = @"1234567890123456";
NSString *iv = @"1234567890123456";
NSString *content = @"hello, world";
NSString *encryptedContent = [self encrypt:content key:key iv:iv];
NSLog(@"加密后:%@", encryptedContent);
NSString *decryptedContent = [self decrypt:encryptedContent key:key iv:iv];
NSLog(@"解密后:%@", decryptedContent);
```
需要注意的是,在ECB模式下,iv的值不会被使用,但是仍然需要传入一个长度为16的字符串。另外,加密后的结果需要使用base64编码才能转换为字符串,解密前需要先对密文进行base64解码。