iOS开发之Objective-c的AES加密和解密算法的实现
2016-01-22 14:53
579 查看
原文链接
高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法。 以下实现代码中分别为NSData和NSString增加了一个Category。使用时直接调用即可。
需要注意的是,AES并不能作为HASH算法,加密并解密后的结果,并不一定与原文相同,使用时请注意进行结果验算。例如解密原文的长度,格式规则等。 NG实例
Objective-c的AES加密和解密算法的具体实现代码如下: 1.拓展NSData,增加AES256加密方法
2.拓展NSString,增加AES256加密方法,需要导入NSData+AES256.h
高级加密标准(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 |
// //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 |
相关文章推荐
- Objective-C:模拟按钮点击事件理解代理模式
- Objective-C中的@property和@synthesize用法
- Caused by: java.lang.ClassNotFoundException: net.sf.json.JSONObject
- JSONObject 解析json
- Git Unlink of file '.git/objects/pack/pack-***.pack' failed. 问题解决
- Objective-C新特性__nonnull和__nullable
- java Obect 转map map 转Object 工具类
- iOS开发笔记--Objective-C中根据函数名调用函数
- 轻松学习之一--Objective-C消息转发
- Passing Objects Between Android Activities
- 基于Fundation框架的简单管理系统
- android ValueAnimator ObjectAnimator
- 浅析C# 中object sender与EventArgs e
- Android属性动画欣赏——ObjectAnimator与动画监听事件
- Git背后的object
- Objective-C 类属性和方法的訪问权限
- Error using * LAPACK loading error: dlopen: cannot load any more object with static TLS
- Objective-C你了解吗--如何编写高质量有效的OC代码
- Objective-C研究院之第一个iPhone应用程序
- objective-C: NSString应该用initWithFormat? 还是 stringWithFormat?