1、AES
.h文件
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface AESTool : NSObject
//NSData加密
+(NSData *)encryptWithData:(NSData *)data;
//NSData解密
+(NSData *)decryptWithData:(NSData *)data;
//NSSting加密
+(NSString *)encryptWithSting:(NSString *)string;
//NSSting解密
+(NSString *)decryptWithSting:(NSString *)string;
@end
NS_ASSUME_NONNULL_END
.m文件
#import "AESTool.h"
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonCryptor.h>
//AES对称加密,加密解密用相同秘钥
#define AESKey @"AESKey"
@implementation AESTool
#pragma mark - Data-AES加密解密
+(NSData *)encryptWithData:(NSData *)data{
return [self cryptWithCCOperation:kCCEncrypt data:data];
}
+(NSData *)decryptWithData:(NSData *)data{
return [self cryptWithCCOperation:kCCDecrypt data:data];
}
+(NSData *)cryptWithCCOperation:(uint32_t)operation data:(NSData *)data{
char keyLength[kCCKeySizeAES256 + 1];
bzero(keyLength, sizeof(keyLength));
[AESKey getCString:keyLength
maxLength:sizeof(keyLength)
encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
size_t dataSize = dataLength + kCCBlockSizeAES128;
void *dataOut = malloc(dataSize);
size_t outSize = 0;
CCCryptorStatus status = CCCrypt(operation,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyLength,
kCCBlockSizeAES128,
NULL,
[data bytes],
dataLength,
dataOut,
dataSize,
&outSize);
if (status == kCCSuccess) {
return [NSData dataWithBytesNoCopy:dataOut
length:outSize];
}
free(dataOut);
return nil;
}
#pragma mark - String-AES加密解密
+(NSString *)encryptWithSting:(NSString *)string{
//避免字符串中包含中文造成的加密解密出错,先将字符串转成base64后再进行操作
NSString *base64String = [self base64WithString:string];
const char *cString = [base64String cStringUsingEncoding:NSUTF8StringEncoding];
//对字符串加密处理同样需要先将字符串转成data类型,再进行加密
NSData *data = [NSData dataWithBytes:cString length:base64String.length];
NSData *result = [self encryptWithData:data];
//转换为2进制字符串
if (result && result.length > 0) {
Byte *bytes = (Byte *)[result bytes];
NSMutableString *output = [NSMutableString stringWithCapacity:result.length * 2];
for(int i = 0; i < result.length; i++){
[output appendFormat:@"%02x", bytes[i]];
}
return output;
}
return nil;
}
+(NSString *)decryptWithSting:(NSString *)string{
//转换为2进制Data
NSMutableData *data = [NSMutableData dataWithCapacity:string.length / 2];
unsigned char bytes;
char byteChars[3] = {'\0','\0','\0'};
for (int i = 0; i < [string length] / 2; i++) {
byteChars[0] = [string characterAtIndex:i * 2];
byteChars[1] = [string characterAtIndex:i * 2 + 1];
bytes = strtol(byteChars, NULL, 16);
[data appendBytes:&bytes length:1];
}
//解密
NSData *result = [self decryptWithData:data];
if (result && result.length > 0) {
//把base再转化为字符串
NSString *base64String = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
return [self stringWithBase64:base64String];
}
return nil;
}
+(NSString *)base64WithString:(NSString *)string{
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64 = [data base64EncodedStringWithOptions:0];
return base64;
}
+(NSString *)stringWithBase64:(NSString *)base64{
NSData *data = [[NSData alloc]initWithBase64EncodedString:base64 options:0];
NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
return string;
}
@end
2、MD5
.h文件
#import <Foundation/Foundation.h>
@interface LYMD5 : NSObject
+(NSString *)md5:(NSString *)string;
@end
.m文件
#import "LYMD5.h"
#import "CommonCrypto/CommonDigest.h"
@implementation LYMD5
+(NSString *)md5:(NSString *)string{
//32位小写
const char *input = [string UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(input, (CC_LONG)strlen(input), result);
NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[digest appendFormat:@"%02x", result[i]];
}
return digest;
// //32位大写
// const char *input = [string UTF8String];
// unsigned char result[CC_MD5_DIGEST_LENGTH];
// CC_MD5(input, (CC_LONG)strlen(input), result);
//
// NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
// for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
// [digest appendFormat:@"%02X", result[i]];
// }
//
// return digest;
// //16位小写
// NSString *md5Str = [self md5HashToLower32Bit];
//
// NSString *string;
// for (int i=0; i<24; i++) {
// string = [md5Str substringWithRange:NSMakeRange(8, 16)];
// }
//
// return string;
// //16位大写
// NSString *md5Str = [self md5HashToUpper32Bit];
//
// NSString *string;
// for (int i=0; i<24; i++) {
// string = [md5Str substringWithRange:NSMakeRange(8, 16)];
// }
//
// return string;
}
@end
网友评论