IOS加密 AES 256演算法(EncryptAndDecrypt.h)[轉載]

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.