iOS开发之Objectivec的AES256加密和解密算法的实现

原文: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
原文地址:https://www.cnblogs.com/qq744890760/p/5072220.html