ios开发常用的加解密方法
一般来说,ios平台最常用的加解密有:MD5、AES等。
MD5是一种不可逆的运算,利用MD5算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等方面。但在加密一些简单文本方面安全性还是太差,有专门的网站就可以破解:http://www.cmd5.com,所以只适用于一些对安全性要求较低的应用。
要想使用MD5加密算法,需要先引入头文件,然后为NSString添加类别方法。
#import <CommonCrypto/CommonDigest.h>
头文件中提供的方法:CC_MD5可以获取MD5的16个字符的数组,再通过%02X的形式输出即可获取32位MD5值。以下是类别方法:
@implementation NSString (CCCryptUtil)
-(NSString*) md5 :(NSString *)str
{
const char *cStr = [str UTF8String];
unsigned char result[16];
CC_MD5(cStr, strlen(cStr), result); // This is the md5 call
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];}
@end
因为MD5加密的单向性,所以MD5只有加密方法,没有解密方法。
如果对应用的安全性要求比较高,可以使用AES算法,同样需要引入上面的头文件。先为NSData添加类别方法,包含加密与解密方法,以下是类别方法:
@implementation NSData (CCCryptUtil)
- (NSData*)AES256EncryptWithKey:(NSString*)key {
char keyPtr[kCCKeySizeAES256 + 1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
[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,
keyPtr, kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
[self bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
- (NSData*)AES256DecryptWithKey:(NSString*)key {
char keyPtr[kCCKeySizeAES256 + 1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[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,
keyPtr, kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
[self bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer); //free the buffer;
return nil;
}
@end
其中,AES256EncryptWithKey为加密方法,AES256DecryptWithKey为解密方法,加密和解密方法使用的参数密钥均为32位长度的字符串,所以可以将任意的字符串经过md5计算32位字符串作为密钥,这样可以允许客户输入任何长度的密钥,并且不同密钥的MD5值也不会重复。
结合上述代码,还可以为NSString添加类别方法:
@implementation NSString (CCCryptUtil)
// md5方法此处省略
+ (NSData*)AES256Encrypt:(NSString*)strSource withKey:(NSString*)key {
NSData *dataSource = [strSource dataUsingEncoding:NSUTF8StringEncoding];
return [dataSource AES256EncryptWithKey:[key md5]];
}
+ (NSString*)AES256Decrypt:(NSData*)dataSource withKey:(NSString*)key {
NSData *decryptData = [dataSource AES256DecryptWithKey:[key md5]];
return [[NSString alloc] initWithData:decryptData encoding:NSUTF8StringEncoding];
}
@end
我的腾讯微博:http://t.qq.com/zixincaoeq
------大道至简的lofter,期待你的来访。