原文: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
请发表评论