原文:http://www.lidaren.com/archives/1470
高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法。 以下实现代码中分别为NSData和NSString增加了一个Category。使用时直接调用即可。
需要注意的是,AES并不能作为HASH算法,加密并解密后的结果,并不一定与原文相同,使用时请注意进行结果验算。例如解密原文的长度,格式规则等。 NG实例
原文:170987350
密码:170
Objective-c的AES加密和解密算法的具体实现代码如下: 1.拓展NSData,增加AES256加密方法
1 //
2 //NSData+AES256.h
3 //
4
5 #import <Foundation/Foundation.h>
6 #import <CommonCrypto/CommonDigest.h>
7 #import <CommonCrypto/CommonCryptor.h>
8
9 @interface NSData(AES256)
10 -(NSData *) aes256_encrypt:(NSString *)key;
11 -(NSData *) aes256_decrypt:(NSString *)key;
12 @end
13
14
15 //
16 //NSData+AES256.m
17 //
18 #import "NSData+AES256.h"
19
20 @implementation NSData(AES256)
21
22 - (NSData *)aes256_encrypt:(NSString *)key //加密
23 {
24 char keyPtr[kCCKeySizeAES256+1];
25 bzero(keyPtr, sizeof(keyPtr));
26 [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
27 NSUInteger dataLength = [self length];
28 size_t bufferSize = dataLength + kCCBlockSizeAES128;
29 void *buffer = malloc(bufferSize);
30 size_t numBytesEncrypted = 0;
31 CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,
32 kCCOptionPKCS7Padding | kCCOptionECBMode,
33 keyPtr, kCCBlockSizeAES128,
34 NULL,
35 [self bytes], dataLength,
36 buffer, bufferSize,
37 &numBytesEncrypted);
38 if (cryptStatus == kCCSuccess) {
39 return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
40 }
41 free(buffer);
42 return nil;
43 }
44
45
46 - (NSData *)aes256_decrypt:(NSString *)key //解密
47 {
48 char keyPtr[kCCKeySizeAES256+1];
49 bzero(keyPtr, sizeof(keyPtr));
50 [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
51 NSUInteger dataLength = [self length];
52 size_t bufferSize = dataLength + kCCBlockSizeAES128;
53 void *buffer = malloc(bufferSize);
54 size_t numBytesDecrypted = 0;
55 CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,
56 kCCOptionPKCS7Padding | kCCOptionECBMode,
57 keyPtr, kCCBlockSizeAES128,
58 NULL,
59 [self bytes], dataLength,
60 buffer, bufferSize,
61 &numBytesDecrypted);
62 if (cryptStatus == kCCSuccess) {
63 return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
64
65 }
66 free(buffer);
67 return nil;
68 }
69 @end
70 2.拓展NSString,增加AES256加密方法,需要导入NSData+AES256.h
71
72
73 //
74 //NSString +AES256.h
75 //
76
77 #import <Foundation/Foundation.h>
78 #import <CommonCrypto/CommonDigest.h>
79 #import <CommonCrypto/CommonCryptor.h>
80
81 #import "NSData+AES256.h"
82
83 @interface NSString(AES256)
84
85 -(NSString *) aes256_encrypt:(NSString *)key;
86 -(NSString *) aes256_decrypt:(NSString *)key;
87
88 @end
89
90
91 //
92 //NSString +AES256.h
93 //
94
95 @implementation NSString(AES256)
96
97 -(NSString *) aes256_encrypt:(NSString *)key
98 {
99 const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
100 NSData *data = [NSData dataWithBytes:cstr length:self.length];
101 //对数据进行加密
102 NSData *result = [data aes256_encrypt:key];
103
104 //转换为2进制字符串
105 if (result && result.length > 0) {
106
107 Byte *datas = (Byte*)[result bytes];
108 NSMutableString *output = [NSMutableString stringWithCapacity:result.length * 2];
109 for(int i = 0; i < result.length; i++){
110 [output appendFormat:@"%02x", datas[i]];
111 }
112 return output;
113 }
114 return nil;
115 }
116
117 -(NSString *) aes256_decrypt:(NSString *)key
118 {
119 //转换为2进制Data
120 NSMutableData *data = [NSMutableData dataWithCapacity:self.length / 2];
121 unsigned char whole_byte;
122 char byte_chars[3] = {'\0','\0','\0'};
123 int i;
124 for (i=0; i < [self length] / 2; i++) {
125 byte_chars[0] = [self characterAtIndex:i*2];
126 byte_chars[1] = [self characterAtIndex:i*2+1];
127 whole_byte = strtol(byte_chars, NULL, 16);
128 [data appendBytes:&whole_byte length:1];
129 }
130
131 //对数据进行解密
132 NSData* result = [data aes256_decrypt:key];
133 if (result && result.length > 0) {
134 return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
135 }
136 return nil;
137 }
138 @end