利用系统API实现AES加解密功能

来源:互联网 发布:自动注音的软件 编辑:程序博客网 时间:2024/05/04 15:06
     

 AES(高级加密算法)本身是一个比较复杂的加密算法,就算法本身而言,我曾经看过加密原理,但是能力有限,实在是看不懂。这里只是贴出使用iOS自带的API实现的加解密功能代码。作为标记,以免下次用到时,找不到。

       在实际使用过程中,为了方便实用,采用了对NSData、NSString类进行扩展的方式,具体代码如下:

       1、NSData的扩展

             本例是使用128位的密钥        

#import "NSData+AES128.h"#import <CommonCrypto/CommonCrypto.h>@implementation NSData(AES128)- (NSData *)encrypt:(NSString *)key {    char keyPtr[kCCKeySizeAES128 + 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, kCCOptionECBMode | kCCOptionPKCS7Padding, keyPtr, kCCBlockSizeAES128, NULL, [self bytes], dataLength, buffer, bufferSize, &numBytesEncrypted);  //因Java服务端使用的是ECB模式和PKCS5填充方式,个人感觉iOS里面的PKCS7填充方式和Java里面的PKCS5是一样的,但没有实际证据    if (cryptStatus == kCCSuccess) {        NSData *cryptData = [NSData dataWithBytes:buffer length:numBytesEncrypted];        free(buffer);        return cryptData;    }        free(buffer);    return nil;}- (NSData *)decrypt:(NSString *)key {    char keyPtr[kCCKeySizeAES128 + 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, kCCOptionECBMode | kCCOptionPKCS7Padding, keyPtr, kCCBlockSizeAES128, NULL, [self bytes], dataLength, buffer, bufferSize, &numBytesDecrypted);    if (cryptStatus == kCCSuccess) {        NSData *decryptData = [NSData dataWithBytes:buffer length:numBytesDecrypted];        free(buffer);        return decryptData;    }        free(buffer);    return nil;}

       2、NSString的扩展

            直接调用NSData里面的扩展方法实现,更简单

       

#import "NSString+AES128.h"#import "NSData+AES128.h"#import "Base64.h"@implementation NSString(AES128)- (NSString *)encrypt:(NSString *)key {    NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];    NSData *encryptData = [data encrypt:key];        return [Base64 encode:encryptData];}- (NSData *)decrypt:(NSString *)key {    NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];    NSData *decryptData = [data decrypt:key];        return decryptData;}@end

     经常在网上碰到有人问,为什么Java加密的iOS解密不了,或者反之。个人感觉就是因为没有了解加密算法里面的分组模式和填充方法,导致Java服务器端和iOS端不一致,加解密不了。另,里面用到的Base64转码的网上到处都是,此处不贴了。

0 0
原创粉丝点击