iOS AES和MD5加密

1、AES

.h文件

#import 

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 
#import 

//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 

@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

你可能感兴趣的:(iOS AES和MD5加密)