高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法
Objective-c的AES加密和解密算法的具体实现代码如下: 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 |