文档章节

iOS开发之AES+Base64数据混合加密与解密

海二少
 海二少
发布于 2016/05/03 17:53
字数 1258
阅读 42
收藏 1
下面我将用代码来阐述其使用方法。 首先我们创建一个NSData的类扩展,命名为AES,创建完如果对的话应该是这样的NSData+AES然后导入如下头文件
#import <CommonCrypto/CommonDigest.h>#import <CommonCrypto/CommonCryptor.h>
再增加加解密的方法,方便外部文件的调用,写完.h文件如下
#import <Foundation/Foundation.h> #import <CommonCrypto/CommonDigest.h> #import <CommonCrypto/CommonCryptor.h> @interface NSData (AES)//加密 - (NSData *) AES256_Encrypt:(NSString *)key;//解密 - (NSData *) AES256_Decrypt:(NSString *)key;//追加64编码 - (NSString *)newStringInBase64FromData;//同上64编码 + (NSString*)base64encode:(NSString*)str;@end
.m文件中依次实现这几个方法,具体如下
#import "NSData+AES.h" static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";@implementation NSData (AES)//加密 - (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;
}//追加64编码 - (NSString *)newStringInBase64FromData            {    NSMutableString *dest = [[NSMutableString alloc] initWithString:@""];    unsigned char * working = (unsigned char *)[self bytes];    int srcLen = (int)[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  = (int)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;

}@end
AES+Base64的加密方式到此已经结束了,下面讲一下单纯的AES字符串加密的。
和上面的基本上差不多,写一个NSString的类扩展,命名为AES,创建完如果对的话应该是这样的NSString+AES导入如下头文件
#import "NSData+AES.h"
同样的把加解密的方法写在.h文件中,写完如下
#import <Foundation/Foundation.h> #import "NSData+AES.h" @interface NSString (AES)//加密 - (NSString *) AES256_Encrypt:(NSString *)key;//解密 - (NSString *) AES256_Decrypt:(NSString *)key;@end
.m实现方法
//加密- (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];
    }    return nil;
}
到此我们加密的文件基本上都已经OK了,下面我们来简单的的使用一下,具体如下:
#import "ViewController.h" #import "NSString+AES.h" @interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {
    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib. 
    //字符串加密     NSString *key = @"12345678";//Key是和后台约定的key哦,不然无法解密.... 
    NSString *secret = @"aes Bison base64";    NSLog(@"字符串加密---%@",[secret AES256_Encrypt:key]);    //字符串解密     NSLog(@"字符串解密---%@",[[secret AES256_Encrypt:key] AES256_Decrypt:key]);


    //NSData加密+base64 
    NSData *plain = [secret dataUsingEncoding:NSUTF8StringEncoding];    NSData *cipher = [plain AES256_Encrypt:key];    NSLog(@"NSData加密+base64++++%@",[cipher newStringInBase64FromData]);    //解密 
    plain = [cipher AES256_Decrypt:key];    NSLog(@"NSData解密+base64++++%@", [[NSString alloc] initWithData:plain encoding:NSUTF8StringEncoding]);

}@end
运行得到打印的结果如下:
2016-03-30 17:31:55.686 AES_256[14242:198853] 字符串加密---07815ca46d20acc3ba4e43d6930c7537496e851a36dbeac34fa30c5796089b02
2016-03-30 17:31:55.687 AES_256[14242:198853] 字符串解密---aes Bison base64
2016-03-30 17:31:55.687 AES_256[14242:198853] NSData加密+base64++++B4FcpG0grMO6TkPWkwx1N0luhRo22+rDT6MMV5YImwI
2016-03-30 17:31:55.687 AES_256[14242:198853] NSData解密+base64++++aes Bison base64
##值得注意的是Key是和后台约定的key哦,不然无法解密….
demo下载地址  https://github.com/AllLuckly/LBAES/tree/master


本文转载自:http://allluckly.cn/aes/AES

下一篇: NSString与NSData
海二少
粉丝 0
博文 87
码字总数 48854
作品 0
程序员
私信 提问
aes256 java 加密, IOS解密

@Nic_Sun 你好,想跟你请教个问题:我看了你的例子,自己写了一遍,Java可以加密,解密, ios也可以加密,解密,但是, java加密出来的byte[]类型的数据,怎么传到ios端,用json吗, 如果是j...

zhuguoqiang
2014/08/06
833
2
IOS RSA解密 用私钥还是公钥

做app后台对接,用RSA加解密。后台返回数据用私钥加密,然后IOS端会用公钥解密。但是IOS的哥们说他用公钥解密有问题,要用私钥来解密。可我认为,RSA在服务端存私钥,如果在客户端也存私钥,...

安静的敲代码
2016/04/11
1K
7
JAVA和IOS对接RSA加密问题

公司开发IOS APP,跟JAVA后台对接。在加密方面,使用的是RSA。在JAVA端生成的公钥和私钥,通过BASE64转成字符串。然后在IOS端,如果直接拿着这个转化的字符串密钥(通过BASE64解密后)去做RSA...

安静的敲代码
2016/03/31
534
1
关于AES256算法java端加密,ios端解密出现无法解密问题的解决方案

我想关于AES算法大家应该都已经了解了,我就不多介绍了。这是本人第一次写技术博文,如果有不对之处欢迎大家指正,共同讨论,一起学习! 之前在项目上用到AES256加密解密算法,刚开始在java端...

Sun1009
2012/12/13
29.6K
32
怎么在ios进行rsa公钥加密,java做rsa私钥解密

需求是这样的: 密钥对通过java生成; IOS进行rsa公钥加密生成密文; JAVA后台对密文做秘钥解密验证; JAVA生成的公钥给到IOS,IOS能进行rsa加密吗?如何实现

刘成万
2016/06/14
687
3

没有更多内容

加载失败,请刷新页面

加载更多

分布式协调服务zookeeper

ps.本文为《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之一 ZooKeeper ZooKeeper曾是Apache Hadoop的一个子项目,是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它...

ls_cherish
今天
4
0
redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
昨天
2
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
昨天
4
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
昨天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
昨天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部