前言
AES
(英文:Advanced Encryption Standard
)即 高级加密标准算法
,是一种 对称加密算法
,是美国联邦政府采用的一种区块加密标准,目前在实际应用中极为广泛。
AES
固定长度为 128Bit
,秘钥
长度则可以是 128/192/256Bit
。
AES 加密模式
AES
有多种加密模式,ECB、CBC、CFB、OFB
四种,至于选择那种,你需要和服务端人员协商好,要一致。
使用
- 导入头文件
1 2
| #import <CommonCrypto/CommonDigest.h> #import <CommonCrypto/CommonCrypto.h>
|
- 封装AES加解密方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| // AES加解密 - (NSData *)AES128Operation:(CCOperation)operation data:(NSData *)data key:(NSString *)key iv:(NSString *)iv{ // kCCKeySizeAES128 是加密位数,可以替换成192/256位的 char keyPtr[kCCKeySizeAES128 + 1]; /* memset(<#void *__b#>, <#int __c#>, <#size_t __len#>) 将 keyPtr 后面长度为 sizeof(keyPtr) 用 0 替换,返回新 keyPtr */ memset(keyPtr, 0, sizeof(keyPtr)); // NSString 转为 char * [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; // iv char ivPtr[kCCBlockSizeAES128 + 1]; // 等价memset bzero(ivPtr, sizeof(ivPtr)); [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; // 原数据大小 size_t bufferSize = [data length] + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesEncrypted = 0; // 设置加密参数 /* iOS默认是CBC,如果需要其他加密方式如 ECB,则在 kCCOptionPKCS7Padding 后面加上 kCCOptionECBMode 即 kCCOptionPKCS7Padding | kCCOptionECBMode,但是记得修改上边的偏移量,因为只有CBC模式有偏移量之说 */ CCCryptorStatus cryptorStatus = CCCrypt(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES128, ivPtr, [data bytes], [data length], buffer, bufferSize, &numBytesEncrypted); if (cryptorStatus == kCCSuccess) { NSLog(@"Success"); return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; }else { NSLog(@"Error"); } free(buffer); return nil; }
|
- 使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| // 客户端与服务端协商一致的 key NSString * AES_KEY = @"zj"; // 客户端与服务端协商一致的 iv(偏移量) NSString * AES_IV = @"zhangjian"; // 需要加密的字符串 NSString * str = @"需要加解密的字符串"; // 加密 NSData * data_str = [str dataUsingEncoding:NSUTF8StringEncoding]; NSData * encrypt_data = [self AES128Operation:kCCEncrypt data:data_str key:AES_KEY iv:AES_IV]; NSString * encrypt_str = [encrypt_data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];; NSLog(@"AES加密:%@",encrypt_str); // 解密 NSData * decrypt_data = [self AES128Operation:kCCDecrypt data:encrypt_data key:AES_KEY iv:AES_IV]; NSString * decrypt_str = [[NSString alloc] initWithData:decrypt_data encoding:NSUTF8StringEncoding]; NSLog(@"AES解密:%@",decrypt_str);
|