AES加密算法

AES已然成为对称密钥加密中最流行的算法之一
高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法

需要注意的是,AES并不能作为HASH算法,加密并解密后的结果,并不一定与原文相同,使用时请注意进行结果验算。例如解密原文的长度,格式规则等。 NG实例

Objective-cAES加密和解密算法的具体实现代码如下: 1.拓展NSData,增加AES256加密方法

////NSData+AES256.h//#import <Foundation/Foundation.h>#import <CommonCrypto/CommonDigest.h>#import <CommonCrypto/CommonCryptor.h>@interfaceNSData(AES256)-(NSData*) aes256_encrypt:(NSString*)key;

-(NSData*) aes256_decrypt:(NSString*)key;

@end////NSData+AES256.m//#import "NSData+AES256.h"@implementationNSData(AES256)-(NSData*)aes256_encrypt:(NSString*)key   //加密{char keyPtr[kCCKeySizeAES256+1];

  bzero(keyPtr, sizeof(keyPtr));

  [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

  NSUInteger dataLength =[self length];

  size_t bufferSize = dataLength + kCCBlockSizeAES128;

  void*buffer =malloc(bufferSize);

  size_t numBytesEncrypted =0;

  CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,

                      kCCOptionPKCS7Padding | kCCOptionECBMode,

                      keyPtr, kCCBlockSizeAES128,

                      NULL,

                      [self bytes], dataLength,

                      buffer, bufferSize,

                      &numBytesEncrypted);

  if(cryptStatus == kCCSuccess){return[NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

  }free(buffer);

  returnnil;

}-(NSData*)aes256_decrypt:(NSString*)key   //解密{char keyPtr[kCCKeySizeAES256+1];

  bzero(keyPtr, sizeof(keyPtr));

  [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

  NSUInteger dataLength =[self length];

  size_t bufferSize = dataLength + kCCBlockSizeAES128;

  void*buffer =malloc(bufferSize);

  size_t numBytesDecrypted =0;

  CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,

                      kCCOptionPKCS7Padding | kCCOptionECBMode,

                      keyPtr, kCCBlockSizeAES128,

                      NULL,

                      [self bytes], dataLength,

                      buffer, bufferSize,

                      &numBytesDecrypted);

  if(cryptStatus == kCCSuccess){return[NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

 

  }free(buffer);

  returnnil;

}@end

2.拓展NSString,增加AES256加密方法,需要导入NSData+AES256.h

////NSString +AES256.h//#import <Foundation/Foundation.h>#import <CommonCrypto/CommonDigest.h>#import <CommonCrypto/CommonCryptor.h>#import"NSData+AES256.h"@interfaceNSString(AES256)-(NSString*) aes256_encrypt:(NSString*)key;

-(NSString*) aes256_decrypt:(NSString*)key;

 

@end////NSString +AES256.h//@implementationNSString(AES256)-(NSString*) aes256_encrypt:(NSString*)key

{constchar*cstr =[self cStringUsingEncoding:NSUTF8StringEncoding];

  NSData*data =[NSData dataWithBytes:cstr length:self.length];

  //对数据进行加密NSData*result =[data aes256_encrypt:key];

 

  //转换为2进制字符串if(result && result.length > 0){

 

    Byte *datas =(Byte*)[result bytes];

    NSMutableString*output =[NSMutableString stringWithCapacity:result.length *2];

    for(int i =0; i < result.length; i++){[output appendFormat:@"%02x", datas[i]];

    }return output;

  }returnnil;

}-(NSString*) aes256_decrypt:(NSString*)key

{//转换为2进制DataNSMutableData*data =[NSMutableData dataWithCapacity:self.length /2];

  unsignedchar whole_byte;

  char byte_chars[3]={'','',''};

  int i;

  for(i=0; i < [self length]/2; i++){

    byte_chars[0]=[self characterAtIndex:i*2];

    byte_chars[1]=[self characterAtIndex:i*2+1];

    whole_byte =strtol(byte_chars, NULL, 16);

    [data appendBytes:&whole_byte length:1];

  }//对数据进行解密NSData* result =[data aes256_decrypt:key];

  if(result && result.length > 0){return[[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding]autorelease];

  }returnnil;

}@end

原文地址:https://www.cnblogs.com/GhostKZShadow/p/5099702.html