//
|
// Copyright © 2018年 dahua. All rights reserved.
|
//
|
|
#import "NSString+SHA256.h"
|
#import <CommonCrypto/CommonDigest.h>
|
#import <CommonCrypto/CommonCrypto.h>
|
|
@implementation NSString (SHA256)
|
- (NSString *)sha256 {
|
const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
|
NSData *data = [NSData dataWithBytes:cstr length:self.length];
|
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
|
CC_SHA1(data.bytes, (CC_LONG)data.length, digest);
|
NSMutableString* result = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH *2];
|
for(int i =0; i < CC_SHA256_DIGEST_LENGTH; i++) {
|
[result appendFormat:@"%02x", digest[i]];
|
}
|
return result;
|
}
|
|
- (NSData *)lc_MD5Data
|
{
|
const char* input = [self UTF8String];
|
unsigned char result[CC_MD5_DIGEST_LENGTH];
|
CC_MD5(input, (CC_LONG)strlen(input), result);
|
NSData *data = [NSData dataWithBytes:result length:CC_MD5_DIGEST_LENGTH];
|
|
return data;
|
}
|
|
- (NSData *)lc_SHA256Data
|
{
|
const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
|
NSData *data = [NSData dataWithBytes:cstr length:self.length];
|
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
|
CC_SHA1(data.bytes, (CC_LONG)data.length, digest);
|
NSData *result = [NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH];
|
|
return result;
|
}
|
|
//将十六进制的字符串转换成NSString
|
- (NSString *)lc_convertHexStrToString {
|
if (!self || [self length] == 0) {
|
return nil;
|
}
|
|
NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:8];
|
NSRange range;
|
if ([self length] % 2 == 0) {
|
range = NSMakeRange(0, 2);
|
} else {
|
range = NSMakeRange(0, 1);
|
}
|
for (NSInteger i = range.location; i < [self length]; i += 2) {
|
unsigned int anInt;
|
NSString *hexCharStr = [self substringWithRange:range];
|
NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];
|
|
[scanner scanHexInt:&anInt];
|
NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];
|
[hexData appendData:entity];
|
|
range.location += range.length;
|
range.length = 2;
|
}
|
NSString *string = [[NSString alloc]initWithData:hexData encoding:NSUTF8StringEncoding];
|
return string;
|
}
|
|
//将NSString转换成十六进制的字符串则可使用如下方式:
|
- (NSString *)lc_convertStringToHexString {
|
if (!self || [self length] == 0) {
|
return @"";
|
}
|
NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
|
NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];
|
|
[data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
|
unsigned char *dataBytes = (unsigned char*)bytes;
|
for (NSInteger i = 0; i < byteRange.length; i++) {
|
NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
|
if ([hexStr length] == 2) {
|
[string appendString:hexStr];
|
} else {
|
[string appendFormat:@"0%@", hexStr];
|
}
|
}
|
}];
|
|
return string;
|
}
|
- (NSString *)lc_AESEncryptStringForkey:(NSString *)key {
|
|
char keyPtr[kCCKeySizeAES256 + 1];
|
bzero(keyPtr, sizeof(keyPtr));
|
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
|
|
NSData *sourceData = [self dataUsingEncoding:NSUTF8StringEncoding];
|
NSUInteger dataLength = [sourceData length];
|
size_t buffersize = dataLength + kCCBlockSizeAES128;
|
void *buffer = malloc(buffersize);
|
size_t numBytesEncrypted = 0;
|
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCBlockSizeAES128, NULL, [sourceData bytes], dataLength, buffer, buffersize, &numBytesEncrypted);
|
|
if (cryptStatus == kCCSuccess) {
|
NSData *encryptData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
|
//对加密后的二进制数据进行base64转码
|
return [encryptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
|
}else {
|
free(buffer);
|
return nil;
|
}
|
}
|
|
- (NSString *)lc_AESDecryptStringForkey:(NSString *)key {
|
|
//先对加密的字符串进行base64解码
|
NSData *decodeData = [[NSData alloc] initWithBase64EncodedString:self options:NSDataBase64DecodingIgnoreUnknownCharacters];
|
|
char keyPtr[kCCKeySizeAES256 + 1];
|
bzero(keyPtr, sizeof(keyPtr));
|
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
|
|
NSUInteger dataLength = [decodeData length];
|
size_t bufferSize = dataLength + kCCBlockSizeAES128;
|
void *buffer = malloc(bufferSize);
|
size_t numBytesDecrypted = 0;
|
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCBlockSizeAES128, NULL, [decodeData bytes], dataLength, buffer, bufferSize, &numBytesDecrypted);
|
if (cryptStatus == kCCSuccess) {
|
NSData *data = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
|
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
|
return result;
|
}else {
|
free(buffer);
|
return nil;
|
}
|
}
|
|
@end
|