iOS开发--AES加密中的那些坑
2017-05-17 00:00
393 查看
在开发中经常会遇到数据的加密,常见的有base64、DES、AES、RSA等,有与AES的用法相对简单一些,在公司的项目中,我们使用的是AES加密。但是遇到一个大坑就是后台使用了AES的128/CBC/NoPadding加密模式,很可悲的是iOS中只有PKCS7Padding和PKCS5Padding这两种模式,没有NoPadding模式。经过各种百度、谷歌后,终于发现了一篇文章解决了这个问题。
下面是参考文章的链接:http://www.cnblogs.com/wanyakun/p/3403352.html
.m文件
测试打印的结果如下:
Snip20170505_2.png
Demo下载链接:
http://code.cocoachina.com/view/134974
下面是参考文章的链接:http://www.cnblogs.com/wanyakun/p/3403352.html
下面是我在项目中用到的一些核心代码:
.h文件// // AES_SecurityUtil.h // AES加解密(后台使用AES+CBC+NoPadding模式) // // Created by 一介布衣 on 2017/5/5. // Copyright © 2017年 HUAMANLOU. All rights reserved. // #import <Foundation/Foundation.h> @interface AES_SecurityUtil : NSObject /** 加密 @param plaintext 明文 @return 返回密文是十六进制的字符串 */ + (NSString *)aes128EncryptWithContent:(NSString *)plaintext; /** 解密 @param ciphertext 密文 @return 返回明文的十六进制的字符串 */ + (NSString *)aes128DencryptWithContent:(NSString *)ciphertext; @end
.m文件
// // AES_SecurityUtil.m // AES加解密(后台使用AES+CBC+NoPadding模式) // // Created by 一介布衣 on 2017/5/5. // Copyright © 2017年 HUAMANLOU. All rights reserved. // #import "AES_SecurityUtil.h" #import <CommonCrypto/CommonCryptor.h> #import "GTMBase64.h" #import "BinHexOctUtil.h" /** 说明 * SecretKey:@"16位长度的字符串" //自行修改 * gIv: @"16位长度的字符串" //自行修改 */ #define SecretKey @"zkrj001234567890" //! 加解密的密钥 #define gIv @"zkrj001234567890" //! 初始向量的值 @implementation AES_SecurityUtil //!MARK:- 加密 + (NSString *)aes128EncryptWithContent:(NSString *)plaintext { char keyPtr[kCCKeySizeAES128+1]; memset(keyPtr, 0, sizeof(keyPtr)); [SecretKey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCBlockSizeAES128+1]; memset(ivPtr, 0, sizeof(ivPtr)); [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; NSData* data = [plaintext dataUsingEncoding:NSUTF8StringEncoding]; NSUInteger dataLength = [data length]; int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128); int newSize = 0; if(diff > 0) { newSize = (int)dataLength + diff; } char dataPtr[newSize]; memcpy(dataPtr, [data bytes], [data length]); for(int i = 0; i < diff; i++) { dataPtr[i + dataLength] = 0x00; } size_t bufferSize = newSize + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); memset(buffer, 0, bufferSize); size_t numBytesCrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, 0x0000, //No padding keyPtr, kCCKeySizeAES128, ivPtr, dataPtr, sizeof(dataPtr), buffer, bufferSize, &numBytesCrypted); if (cryptStatus == kCCSuccess) { NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted]; return [BinHexOctUtil convertDataToHexStr:resultData]; } free(buffer); return nil; } //!MARK:- 解密 + (NSString *)aes128DencryptWithContent:(NSString *)c 7fe0 iphertext { NSData *data1 = [BinHexOctUtil convertHexStrToData:ciphertext]; ciphertext = [GTMBase64 stringByEncodingData:data1]; char keyPtr[kCCKeySizeAES128 + 1]; memset(keyPtr, 0, sizeof(keyPtr)); [SecretKey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCBlockSizeAES128 + 1]; memset(ivPtr, 0, sizeof(ivPtr)); [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; NSData *data = [GTMBase64 decodeData:[ciphertext dataUsingEncoding:NSUTF8StringEncoding]]; NSUInteger dataLength = [data length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesCrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0x0000, //No padding keyPtr, kCCBlockSizeAES128, ivPtr, [data bytes], dataLength, buffer, bufferSize, &numBytesCrypted); if (cryptStatus == kCCSuccess) { NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted]; return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding]; } free(buffer); return nil; } @end
测试打印的结果如下:
Snip20170505_2.png
Demo下载链接:
http://code.cocoachina.com/view/134974
相关文章推荐
- iOS开发--AES加密中的那些坑
- iOS开发--AES加密中的那些坑
- iOS开发之----常用加密方法(AES、MD5、Base64)
- IOS开发之—— 各种加密的使用(MD5,base64,DES,AES)
- iOS开发-Objective-c的AES加密和解密算法的实现
- IOS开发之----常用加密方法(AES、MD5、Base64)
- iOS开发(93)之常用加密方法(aes、md5、base64)
- IOS开发之----常用加密方法(AES、MD5、Base64)
- iOS开发之Objective-c的AES加密和解密算法的实现
- iOS开发——AES加密(128 CBC/ECB NoPadding/PKCS7Padding)
- iOS开发之Objective-c的AES加密和解密算法的实现
- iOS开发之算法加密md5,sha1,AES,base64
- iOS开发之Objective-c的AES加密和解密算法的实现
- 关于iOS开发中使用到的AES加密和SHA256加密的使用
- iOS开发之Objective-c的AES加密和解密算法的实现
- iOS开发之常用加密方法(aes、md5、base64)
- IOS开发之----常用加密方法(AES、MD5、Base64)
- iOS开发那些-如何打包iOS应用程序
- ios源码推荐:AES轻松加密数据
- 开源中国iOS客户端学习——(十一)AES加密