打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
iOS开发之Objective-c的AES加密和解密算法的实现

高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法。
以下实现代码中分别为NSData和NSString增加了一个Category。使用时直接调用即可。

需要注意的是,AES并不能作为HASH算法,加密并解密后的结果,并不一定与原文相同,使用时请注意进行结果验算。例如解密原文的长度,格式规则等。
NG实例

原文:170987350密码:170

Objective-c的AES加密和解密算法的具体实现代码如下:
1.拓展NSData,增加AES256加密方法


////NSData+AES256.h// #import <Foundation/Foundation.h>#import <CommonCrypto/CommonDigest.h>#import <CommonCrypto/CommonCryptor.h> @interface NSData(AES256)-(NSData *) aes256_encrypt:(NSString *)key;-(NSData *) aes256_decrypt:(NSString *)key;@end  ////NSData+AES256.m//#import "NSData+AES256.h" @implementation NSData(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);    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;}@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" @interface NSString(AES256) -(NSString *) aes256_encrypt:(NSString *)key;-(NSString *) aes256_decrypt:(NSString *)key; @end  ////NSString +AES256.h// @implementation NSString(AES256) -(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]autorelease]; } return nil;}@end
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
iOS常用加密方法(aes、md5、base64)
AES加密 - iOS与Java的同步实现
网络安全加密——DES、AES、RSA、Base64、MD5加密原理介绍,代码实现
iOS下的DES加密
IOS之sha加密、md5常规加密、md5二次加密详解及示例程序
基于OpenSLL的RSA加密应用(非算法)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服