您的位置:首页 > 移动开发 > IOS开发

iOS开发各种加密方式

2017-11-30 15:28 260 查看
这里封装的是iOS使用到的各种加密方法,MD5加密,AES加密,Base64加密,DES加密,生成32UUID,类需要继承

<Foundation/Foundation.h>框架

注意:.m文件需要导入

#import <CommonCrypto/CommonDigest.h>

#import <CommonCrypto/CommonCryptor.h>

.h文件实现接口:

/**

 *  生成32位UUID,不带'-'

 *

 *  @return 32位UUID

 */

+ (NSString *)createUUID;

#pragma mark - MD5

/**

 *  md5加密

 *

 *  @param str 要加密的字符串

 *

 *  @return 32位md5字符串

 */

+ (NSString *)md5:(NSString *)input;

#pragma mark - SHA

/**

 *  sha1加密

 *

 *  @param input 要加密的字符串

 *

 *  @return 加密后的字符串

 */

+ (NSString *)sha1:(NSString *)input;

+ (NSString *)sha224:(NSString *)input;

+ (NSString *)sha256:(NSString *)input;

+ (NSString *)sha384:(NSString *)input;

+ (NSString *)sha512:(NSString *)input;

#pragma mark - DES

/**

 *  DES加密

 *

 *  @param key  密钥

 *  @param data 加密数据

 *

 *  @return 加密后的数据

 */

+ (NSData *)DESEncryptWithKey:(NSString *)key data:(NSData *)data;

/**

 *  DES解密

 *

 *  @param key  密钥

 *  @param data 解密数据

 *

 *  @return 解密后的数据

 */

+ (NSData *)DESDecryptWithKey:(NSString *)key data:(NSData *)data;

#pragma mark - AES

/**

 *  AES256加密

 *

 *  @param key  密钥

 *  @param data 加密数据

 *

 *  @return 加密后的数据

 */

+ (NSData *)AES256EncryptWithKey:(NSString *)key data:(NSData *)data;

/**

 *  AES256解密

 *

 *  @param key  密钥

 *  @param data 解密数据

 *

 *  @return 解密后的数据

 */

+ (NSData *)AES256DecryptWithKey:(NSString *)key data:(NSData *)data;

#pragma mark - Base64

/**

 *  NSData转Base64

 *

 *  @param data

 *

 *  @return

 */

+ (NSString *)base64EncodedStringWithData:(NSData *)data;

/**

 *  Base64转NSData

 *

 *  @param base64String

 *

 *  @return

 */

+ (NSData *)dataWithBase64EncodedString:(NSString *)base64String;

/**

 *  NSString转Base64

 *

 *  @param string

 *

 *  @return

 */

+ (NSString *)base64EncodedString:(NSString *)string;

/**

 *  Base64转NSString

 *

 *  @param base64String base64字符串

 *

 *  @return

 */

+ (NSString *)stringWithBase64Encoded:(NSString *)base64String;

.m文件实现接口:

static const
char encodingTable[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

+ (NSString *)createUUID

{

    NSUUID *uuid = [NSUUID
UUID];

    return [[uuid
UUIDString] stringByReplacingOccurrencesOfString:@"-"
withString:@""];

}

#pragma mark - MD5

+ (NSString *)md5:(NSString *)input

{

    const char *cStrValue = [input
UTF8String];

    if (cStrValue ==
NULL) {

        cStrValue = "";

    }

    unsigned
char r[CC_MD5_DIGEST_LENGTH];

    CC_MD5(cStrValue, (CC_LONG)strlen(cStrValue), r);

    return [NSString
stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",

            r[0], r[1], r[2], r[3], r[4], r[5],
r[6], r[7], r[8], r[9], r[10], r[11], r[12],
r[13], r[14], r[15]];

}

#pragma mark - SHA1

+ (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 < CC_SHA1_DIGEST_LENGTH; i++) {

        [hex appendFormat:@"%02x", digest[i]];

    }

    NSString *immutableHex = [NSString
stringWithString:hex];

    return immutableHex;

}

+ (NSString *)sha224:(NSString *)input

{

    const
char *cstr = [input
cStringUsingEncoding:NSUTF8StringEncoding];

    NSData *data = [NSData
dataWithBytes:cstr length:input.length];

    uint8_t digest[CC_SHA224_DIGEST_LENGTH];

    CC_SHA224(data.bytes, (CC_LONG)data.length, digest);

    NSMutableString* output = [NSMutableString
stringWithCapacity:CC_SHA224_DIGEST_LENGTH *
2];

    for(int i =
0; i < CC_SHA224_DIGEST_LENGTH; i++) {

        [output appendFormat:@"%02x", digest[i]];

    }

    return output;

}

+ (NSString *)sha256:(NSString *)input

{

    const
char *cstr = [input
cStringUsingEncoding:NSUTF8StringEncoding];

    NSData *data = [NSData
dataWithBytes:cstr length:input.length];

    uint8_t digest[CC_SHA256_DIGEST_LENGTH];

    CC_SHA256(data.bytes, (CC_LONG)data.length, digest);

    NSMutableString* output = [NSMutableString
stringWithCapacity:CC_SHA256_DIGEST_LENGTH *
2];

    for(int i =
0; i < CC_SHA256_DIGEST_LENGTH; i++) {

        [output appendFormat:@"%02x", digest[i]];

    }

    return output;

}

+ (NSString *)sha384:(NSString *)input

{

    const
char *cstr = [input
cStringUsingEncoding:NSUTF8StringEncoding];

    NSData *data = [NSData
dataWithBytes:cstr length:input.length];

    uint8_t digest[CC_SHA384_DIGEST_LENGTH];

    CC_SHA384(data.bytes, (CC_LONG)data.length, digest);

    NSMutableString* output = [NSMutableString
stringWithCapacity:CC_SHA384_DIGEST_LENGTH *
2];

    for(int i =
0; i < CC_SHA384_DIGEST_LENGTH; i++) {

        [output appendFormat:@"%02x", digest[i]];

    }

    return output;

}

+ (NSString *)sha512:(NSString *)input

{

    const
char *cstr = [input
cStringUsingEncoding:NSUTF8StringEncoding];

    NSData *data = [NSData
dataWithBytes:cstr length:input.length];

    uint8_t digest[CC_SHA512_DIGEST_LENGTH];

    CC_SHA512(data.bytes, (CC_LONG)data.length, digest);

    NSMutableString* output = [NSMutableString
stringWithCapacity:CC_SHA512_DIGEST_LENGTH *
2];

    for(int i =
0; i < CC_SHA512_DIGEST_LENGTH; i++) {

        [output appendFormat:@"%02x", digest[i]];

    }

    return output;

}

#pragma mark - DES

+ (NSData *)DESEncryptWithKey:(NSString *)key data:(NSData *)data

{

    char keyPtr[kCCKeySizeAES256+1];

    bzero(keyPtr,
sizeof(keyPtr));

    [key getCString:keyPtr
maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [data
length];

    size_t bufferSize = dataLength +
kCCBlockSizeAES128;

    void *buffer =
malloc(bufferSize);

    size_t numBytesEncrypted =
0;

    CCCryptorStatus cryptStatus =
CCCrypt(kCCEncrypt,
kCCAlgorithmDES,

                                          kCCOptionPKCS7Padding |
kCCOptionECBMode,

                                          keyPtr, kCCBlockSizeDES,

                                          NULL,

                                          [data bytes], dataLength,

                                          buffer, bufferSize,

                                          &numBytesEncrypted);

    if (cryptStatus ==
kCCSuccess) {

        return [NSData
dataWithBytesNoCopy:buffer
length:numBytesEncrypted];

    }

    free(buffer);

    return
nil;

}

+ (NSData *)DESDecryptWithKey:(NSString *)key data:(NSData *)data

{

    char keyPtr[kCCKeySizeAES256+1];

    bzero(keyPtr,
sizeof(keyPtr));

    [key getCString:keyPtr
maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [data
length];

    size_t bufferSize = dataLength +
kCCBlockSizeAES128;

    void *buffer =
malloc(bufferSize);

    size_t numBytesDecrypted =
0;

    CCCryptorStatus cryptStatus =
CCCrypt(kCCDecrypt,
kCCAlgorithmDES,

                                          kCCOptionPKCS7Padding |
kCCOptionECBMode,

                                          keyPtr, kCCBlockSizeDES,

                                          NULL,

                                          [data bytes], dataLength,

                                          buffer, bufferSize,

                                          &numBytesDecrypted);

    if (cryptStatus ==
kCCSuccess) {

        return [NSData
dataWithBytesNoCopy:buffer
length:numBytesDecrypted];

    }

    free(buffer);

    return
nil;

}

#pragma mark - AES256

+ (NSData *)AES256EncryptWithKey:(NSString *)key data:(NSData *)data

{

    char keyPtr[kCCKeySizeAES256 +
1];

    bzero(keyPtr,
sizeof(keyPtr));

    [key getCString:keyPtr
maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [data
length];

    size_t bufferSize = dataLength +
kCCBlockSizeAES128;

    void *buffer =
malloc(bufferSize);

    size_t numBytesDecrypted =
0;

    CCCryptorStatus cryptStatus =
CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,

                                          kCCOptionPKCS7Padding, keyPtr,

                                          kCCKeySizeAES256,
NULL,

                                          [data bytes], dataLength,

                                          buffer, bufferSize,

                                          &numBytesDecrypted);

    if (cryptStatus ==
kCCSuccess) {

        return [NSData
dataWithBytesNoCopy:buffer
length:numBytesDecrypted];

    }

    free(buffer);

    return
nil;

}

+ (NSData *)AES256DecryptWithKey:(NSString *)key data:(NSData *)data

{

    char keyPtr[kCCKeySizeAES256 +
1];

    bzero(keyPtr,
sizeof(keyPtr));

    [key getCString:keyPtr
maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [data
length];

    size_t bufferSize = dataLength +
kCCBlockSizeAES128;

    void *buffer =
malloc(bufferSize);

    size_t numBytesDecrypted =
0;

    CCCryptorStatus cryptStatus =
CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,

                                          kCCOptionPKCS7Padding, keyPtr,

                                          kCCKeySizeAES256,
NULL,

                                          [data bytes], dataLength,

                                          buffer, bufferSize,

                                          &numBytesDecrypted);

    if (cryptStatus ==
kCCSuccess) {

        return [NSData
dataWithBytesNoCopy:buffer
length:numBytesDecrypted];

    }

    free(buffer);

    return
nil;

}

#pragma mark - Base64

+ (NSString *)base64EncodedStringWithData:(NSData *)data

{

    if ([data length] <
1) {

        return nil;

    }

    char *characters =
malloc((([data length] +
2) / 3) * 4);

    if (characters ==
NULL)

        return nil;

    NSUInteger length =
0;

    

    NSUInteger i =
0;

    while (i < [data
length])

    {

        char buffer[3] = {0,0,0};

        short bufferLength =
0;

        while (bufferLength <
3 && i < [data length])

            buffer[bufferLength++] = ((char *)[data
bytes])[i++];

        

        //  Encode the bytes in the buffer to four characters, including padding "=" characters if necessary.

        characters[length++] = encodingTable[(buffer[0] &
0xFC) >> 2];

        characters[length++] = encodingTable[((buffer[0] &
0x03) << 4) | ((buffer[1] &
0xF0) >> 4)];

        if (bufferLength >
1)

            characters[length++] = encodingTable[((buffer[1] &
0x0F) << 2) | ((buffer[2] &
0xC0) >> 6)];

        else characters[length++] =
'=';

        if (bufferLength >
2)

            characters[length++] = encodingTable[buffer[2] &
0x3F];

        else characters[length++] =
'=';

    }

    return [[NSString
alloc] initWithBytesNoCopy:characters
length:length encoding:NSASCIIStringEncoding
freeWhenDone:YES];

}

+ (NSData *)dataWithBase64EncodedString:(NSString *)base64String

{

    if (base64String.length <
1) {

        return nil;

    }

    static char *decodingTable =
NULL;

    if (decodingTable ==
NULL)

    {

        decodingTable = malloc(256);

        if (decodingTable ==
NULL)

            return
nil;

        memset(decodingTable,
CHAR_MAX, 256);

        NSUInteger i;

        for (i = 0; i <
64; i++)

            decodingTable[(short)encodingTable[i]] = i;

    }

    

    const
char *characters = [base64String
cStringUsingEncoding:NSASCIIStringEncoding];

    if (characters ==
NULL)     //  Not an ASCII string!

        return nil;

    char *bytes =
malloc((([base64String length] +
3) / 4) * 3);

    if (bytes == NULL)

        return nil;

    NSUInteger length =
0;

    

    NSUInteger i =
0;

    while (YES)

    {

        char buffer[4];

        short bufferLength;

        for (bufferLength =
0; bufferLength < 4; i++)

        {

            if (characters[i] ==
'\0')

                break;

            if (isspace(characters[i]) || characters[i] ==
'=')

                continue;

            buffer[bufferLength] = decodingTable[(short)characters[i]];

            if (buffer[bufferLength++] ==
CHAR_MAX)      //  Illegal character!

            {

                free(bytes);

                return
nil;

            }

        }

        

        if (bufferLength ==
0)

            break;

        if (bufferLength ==
1)     
//  At least two characters are needed to produce one byte!

        {

            free(bytes);

            return
nil;

        }

        

        //  Decode the characters in the buffer to bytes.

        bytes[length++] = (buffer[0] <<
2) | (buffer[1] >>
4);

        if (bufferLength >
2)

            bytes[length++] = (buffer[1] <<
4) | (buffer[2] >>
2);

        if (bufferLength >
3)

            bytes[length++] = (buffer[2] <<
6) | buffer[3];

    }

    

    bytes = realloc(bytes, length);

    return [NSData
dataWithBytesNoCopy:bytes length:length];

}

+ (NSString *)base64EncodedString:(NSString *)string

{

    return [self
base64EncodedStringWithData:[string
dataUsingEncoding:NSUTF8StringEncoding]];

}

+ (NSString *)stringWithBase64Encoded:(NSString *)base64String

{

    return [[NSString
alloc] initWithData:[self
dataWithBase64EncodedString:base64String]
encoding:NSUTF8StringEncoding];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息