AES加密和解密

来源:互联网 发布:python 冒号的作用 编辑:程序博客网 时间:2024/05/22 00:39

1.256和128几本一样,只是数组长度那一行一个是128一个是256

2.加解密几本一样,一个是numBytesEncrypted 一个是 numBytesDecrypted

下面是转载的。-----------------------------------------------------------------------------------

高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法。 以下实现代码中分别为NSData和NSString增加了一个Category。使用时直接调用即可。

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

原文:170987350密码:170

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

 
////NSData+AES256.h// #import <Foundation/Foundation.h>#import <CommonCrypto/CommonDigest.h>#import <CommonCrypto/CommonCryptor.h> @interface NSData(AES256)-(NSData *) aes256_encrypt:(NSString *)key;-(NSData *) aes256_decrypt:(NSString *)key;@end  ////NSData+AES256.m//#import "NSData+AES256.h" @implementation NSData(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);  return nil;}  - (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);  return nil;}@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" @interface NSString(AES256) -(NSString *) aes256_encrypt:(NSString *)key;-(NSString *) aes256_decrypt:(NSString *)key; @end  ////NSString +AES256.h// @implementation NSString(AES256) -(NSString *) aes256_encrypt:(NSString *)key{  const char *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;  }  return nil;} -(NSString *) aes256_decrypt:(NSString *)key{     //转换为2进制Data  NSMutableData *data = [NSMutableData dataWithCapacity:self.length / 2];  unsigned char whole_byte;  char byte_chars[3] = {'\0','\0','\0'};  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];  }  return nil;}@end
0 0
原创粉丝点击