美文网首页
iOS AES和MD5加密

iOS AES和MD5加密

作者: 邓布利多教授 | 来源:发表于2020-01-20 10:32 被阅读0次

    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
    

    相关文章

      网友评论

          本文标题:iOS AES和MD5加密

          本文链接:https://www.haomeiwen.com/subject/pxfmactx.html