標籤:des c class blog code a
////EncryptAndDecrypt.h#import <Foundation/Foundation.h>@class NSString;@interface NSData (Encryption)- (NSData *)AES256EncryptWithKey:(NSData *)key; //加密- (NSData *)AES256DecryptWithKey:(NSData *)key; //解密- (NSString *)newStringInBase64FromData; //追加64編碼+ (NSString*)base64encode:(NSString*)str; //同上64編碼+(NSData*)stringToByte:(NSString*)string;+(NSString*)byteToString:(NSData*)data;@end
///EncryptAndDecrypt.m#import "EncryptAndDecrypt.h"#import <CommonCrypto/CommonCrypto.h>static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";@implementation NSData (Encryption)- (NSData *)AES256EncryptWithKey:(NSData *)key //加密{ //AES256加密,密鑰應該是32位的 const void * keyPtr2 = [key bytes]; char (*keyPtr)[32] = keyPtr2; //對於塊密碼編譯演算法,輸出大小總是等於或小於輸入大小加上一個塊的大小 //所以在下邊需要再加上一個塊的大小 NSUInteger dataLength = [self length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding/*這裡就是剛才說到的PKCS7Padding填充了*/| kCCOptionECBMode, [key bytes], kCCKeySizeAES256, NULL,/* 初始化向量(可選) */ [self bytes], dataLength,/*輸入*/ buffer, bufferSize,/* 輸出 */ &numBytesEncrypted); if (cryptStatus == kCCSuccess) { return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; } free(buffer);//釋放buffer return nil;}- (NSData *)AES256DecryptWithKey:(NSData *)key //解密{ //同理,解密中,密鑰也是32位的 const void * keyPtr2 = [key bytes]; char (*keyPtr)[32] = keyPtr2; //對於塊密碼編譯演算法,輸出大小總是等於或小於輸入大小加上一個塊的大小 //所以在下邊需要再加上一個塊的大小 NSUInteger dataLength = [self length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesDecrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding/*這裡就是剛才說到的PKCS7Padding填充了*/| kCCOptionECBMode, keyPtr, kCCKeySizeAES256, NULL,/* 初始化向量(可選) */ [self bytes], dataLength,/* 輸入 */ buffer, bufferSize,/* 輸出 */ &numBytesDecrypted); if (cryptStatus == kCCSuccess) { return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; } free(buffer); return nil; }- (NSString *)newStringInBase64FromData //追加64編碼{ NSMutableString *dest = [[NSMutableString alloc] initWithString:@""]; unsigned char * working = (unsigned char *)[self bytes]; int srcLen = [self length]; for (int i=0; i<srcLen; i += 3) { for (int nib=0; nib<4; nib++) { int byt = (nib == 0)?0:nib-1; int ix = (nib+1)*2; if (i+byt >= srcLen) break; unsigned char curr = ((working[i+byt] << (8-ix)) & 0x3F); if (i+nib < srcLen) curr |= ((working[i+nib] >> ix) & 0x3F); [dest appendFormat:@"%c", base64[curr]]; } } return dest; }+ (NSString*)base64encode:(NSString*)str{ if ([str length] == 0) return @""; const char *source = [str UTF8String]; int strlength = strlen(source); char *characters = malloc(((strlength + 2) / 3) * 4); if (characters == NULL) return nil; NSUInteger length = 0; NSUInteger i = 0; while (i < strlength) { char buffer[3] = {0,0,0}; short bufferLength = 0; while (bufferLength < 3 && i < strlength) buffer[bufferLength++] = source[i++]; characters[length++] = base64[(buffer[0] & 0xFC) >> 2]; characters[length++] = base64[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)]; if (bufferLength > 1) characters[length++] = base64[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)]; else characters[length++] = ‘=‘; if (bufferLength > 2) characters[length++] = base64[buffer[2] & 0x3F]; else characters[length++] = ‘=‘; } NSString *g = [[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSASCIIStringEncoding freeWhenDone:YES]; return g; }+(NSData*)stringToByte:(NSString*)string{ NSString *hexString=[[string uppercaseString] stringByReplacingOccurrencesOfString:@" " withString:@""]; if ([hexString length]%2!=0) { return nil; } Byte tempbyt[1]={0}; NSMutableData* bytes=[NSMutableData data]; for(int i=0;i<[hexString length];i++) { unichar hex_char1 = [hexString characterAtIndex:i]; ////兩位16進位數中的第一位(高位*16) int int_ch1; if(hex_char1 >= ‘0‘ && hex_char1 <=‘9‘) int_ch1 = (hex_char1-48)*16; //// 0 的Ascll - 48 else if(hex_char1 >= ‘A‘ && hex_char1 <=‘F‘) int_ch1 = (hex_char1-55)*16; //// A 的Ascll - 65 else return nil; i++; unichar hex_char2 = [hexString characterAtIndex:i]; ///兩位16進位數中的第二位(低位) int int_ch2; if(hex_char2 >= ‘0‘ && hex_char2 <=‘9‘) int_ch2 = (hex_char2-48); //// 0 的Ascll - 48 else if(hex_char2 >= ‘A‘ && hex_char2 <=‘F‘) int_ch2 = hex_char2-55; //// A 的Ascll - 65 else return nil; tempbyt[0] = int_ch1+int_ch2; ///將轉化後的數放入Byte數組裡 [bytes appendBytes:tempbyt length:1]; } return bytes;}+(NSString*)byteToString:(NSData*)data{ Byte *plainTextByte = (Byte *)[data bytes]; NSString *hexStr=@""; for(int i=0;i<[data length];i++) { NSString *newHexStr = [NSString stringWithFormat:@"%x",plainTextByte[i]&0xff];///16進位數 if([newHexStr length]==1) hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr]; else hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr]; } return hexStr;}@end
使用
-(void)Jiami{ NSString *plainText = @"AES中國";//明文 NSData *plainTextData = [plainText dataUsingEncoding:NSUTF8StringEncoding]; NSString *keyStr = @"12345678901234567890123456789012"; NSData *keyDataStr = [keyStr dataUsingEncoding:NSUTF8StringEncoding]; NSData *cipherTextData = [plainTextData AES256EncryptWithKey:keyDataStr]; NSString *hexStr = [NSData byteToString:cipherTextData]; NSLog(@"密文:%@",hexStr); [self Jiemi:hexStr]; }-(void)Jiemi:(NSString *)hexString{ NSString *keyStr = @"12345678901234567890123456789012"; NSData *keyDataStr = [keyStr dataUsingEncoding:NSUTF8StringEncoding]; NSData *data = [NSData stringToByte:hexString]; ///////////////// NSData *datas = [data AES256DecryptWithKey:keyDataStr]; NSLog([[NSString alloc]initWithData:datas encoding:NSUTF8StringEncoding]);}
轉自:http://blog.csdn.net/zzzili/article/details/8610060