利用系统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
- 利用系统API实现AES加解密功能
- [MFC]Crypto API 实现 AES 加解密
- c 实现aes加解密
- C#实现AES加解密
- Java实现AES加解密
- java实现AES加解密
- OpenSSL之AES加解密API使用
- 利用openssl中AES进行加解密
- C#实现AES加解密方法
- OpenSSL 实现RSA AES加解密
- AES加解密算法Qt实现
- Java实现的AES加解密程序
- 使用Crypto++实现AES加解密
- 用java实现AES加解密算法
- C#实现AES加解密方法
- C#实现AES加解密方法
- 完整的AES分组与文件的加解密功能程序实现
- java实现AES加密解密--数据加解密
- AAC音频格式简析
- java获取网页上邮箱地址存放到.txt文件
- 深度卷积网络CNN与图像语义分割
- git与github入门
- 22种web内嵌编辑器
- 利用系统API实现AES加解密功能
- shell 排序
- enum用法
- socket编程(一)---- 套接字
- 二进制中1的个数
- recv函数返回值说明
- Android Studio 导入Github项目错误解决
- 苹果手机app应用显示未受信任打不开怎么办
- 用java实现编译器之有限状态机驱动的整形,浮点型数值识别器