Нет описания

CommonUtil.m 5.8KB

    // // CommonUtil.m // PaiAi // // Created by mac on 16/7/21. // Copyright © 2016年 FFIB. All rights reserved. // #import "CommonUtil.h" #import <CommonCrypto/CommonDigest.h> #import <CommonCrypto/CommonCryptor.h> #include <ifaddrs.h> #include <arpa/inet.h> #include <net/if.h> #define IOS_CELLULAR @"pdp_ip0" #define IOS_WIFI @"en0" #define IP_ADDR_IPv4 @"ipv4" #define IP_ADDR_IPv6 @"ipv6" size_t const kKeySize = kCCKeySizeAES128; @implementation CommonUtil + (NSString *)md5:(NSString *)input { const char *cStr = [input UTF8String]; unsigned char digest[16]; CC_MD5( cStr, (int)strlen(cStr), digest ); // This is the md5 call NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) [output appendFormat:@"%02x", digest[i]]; NSString *outStr = [output uppercaseString]; return outStr; } + (NSString *)md5Data:(NSData *)data { const char *bytes = [data bytes]; unsigned char digest[16]; CC_MD5( bytes, (int)[data length], digest ); // This is the md5 call NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) [output appendFormat:@"%02x", digest[i]]; NSString *outStr = [output uppercaseString]; return outStr; } + (NSString *)sha1:(NSString *)input { const char *ptr = [input UTF8String]; int i =0; int len = (int)strlen(ptr); Byte byteArray[len]; while (i!=len) { unsigned eachChar = *(ptr + i); unsigned low8Bits = eachChar & 0xFF; byteArray[i] = low8Bits; i++; } unsigned char digest[CC_SHA1_DIGEST_LENGTH]; CC_SHA1(byteArray, len, digest); NSMutableString *hex = [NSMutableString string]; for (int i=0; i<20; i++) [hex appendFormat:@"%02x", digest[i]]; NSString *immutableHex = [NSString stringWithString:hex]; return immutableHex; } + (NSString *)AES128operation: (CCOperation)operation string:(NSString *)string{ if (string == nil || [string isEqualToString:@""]) { return nil; } NSString *key = @"i29g8au38U3dI8dj"; NSString *const iv = @"a2k49g8wJ3F3kf9k"; char keyPtr[kCCKeySizeAES128 + 1]; memset(keyPtr, 0, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSData *keyData; if (operation == kCCEncrypt) { keyData = [string dataUsingEncoding:NSUTF8StringEncoding]; }else{ keyData = [[NSData alloc]initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters]; } size_t bufferSize = string.length + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesEncrypted = 0; NSData *ivPtr = [iv dataUsingEncoding:NSUTF8StringEncoding]; CCCryptorStatus status = CCCrypt(operation, kCCAlgorithmAES, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES128, ivPtr.bytes, keyData.bytes, keyData.length, buffer, bufferSize, &numBytesEncrypted); if (status == kCCSuccess) { if (operation == kCCEncrypt) { return [[NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted] base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; }else{ return [[NSString alloc]initWithData:[NSData dataWithBytes:buffer length:numBytesEncrypted] encoding:NSUTF8StringEncoding]; } } free(buffer); return nil; } + (NSString *)aes128EncryptWithKey:(NSString *)input{ return [self AES128operation:kCCEncrypt string:input]; } + (NSString *)aes128DecryptWithKey:(NSString *)output{ return [self AES128operation:kCCDecrypt string:output]; } + (NSString *)getIPAddress:(BOOL)preferIPv4 { NSArray *searchArray = preferIPv4 ? @[ IOS_WIFI @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6 ] : @[ IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ; NSDictionary *addresses = [self getIPAddresses]; __block NSString *address; [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop) { address = addresses[key]; if(address) *stop = YES; } ]; return address ? address : @"0.0.0.0"; } + (NSDictionary *)getIPAddresses { NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8]; // retrieve the current interfaces - returns 0 on success struct ifaddrs *interfaces; if(!getifaddrs(&interfaces)) { // Loop through linked list of interfaces struct ifaddrs *interface; for(interface=interfaces; interface; interface=interface->ifa_next) { if(!(interface->ifa_flags & IFF_UP) || (interface->ifa_flags & IFF_LOOPBACK)) { continue; // deeply nested code harder to read } const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr; if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) { NSString *name = [NSString stringWithUTF8String:interface->ifa_name]; char addrBuf[INET6_ADDRSTRLEN]; if(inet_ntop(addr->sin_family, &addr->sin_addr, addrBuf, sizeof(addrBuf))) { NSString *key = [NSString stringWithFormat:@"%@/%@", name, addr->sin_family == AF_INET ? IP_ADDR_IPv4 : IP_ADDR_IPv6]; addresses[key] = [NSString stringWithUTF8String:addrBuf]; } } } // Free memory freeifaddrs(interfaces); } // The dictionary keys have the form "interface" "/" "ipv4 or ipv6" return [addresses count] ? addresses : nil; } @end