1. 程式人生 > >iOS加密方法(整理)

iOS加密方法(整理)

以下程式碼源自網路,本人稍作整理,供各位參考,所有權歸原作者。

1、================= 3DES加密 / 解密 =================

1)加密

/**
 *  3DES加密
 *
 *  @param plainText 明文
 *  @param key       金鑰
 *
 *  @return 加密結果
 */
- (NSString *)encryptUseDES:(NSString *)plainText key:(NSString *)key
{
    NSString *ciphertext = nil;
    const char *textBytes = [plainText UTF8String];
    NSUInteger dataLength = [plainText length];
    unsigned char buffer[1024];
    memset(buffer, 0, sizeof(char));
    Byte iv[] = {1,2,3,4,5,6,7,8};
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmDES,
                                          kCCOptionPKCS7Padding,
                                          [key UTF8String],
                                          kCCKeySizeDES,
                                          iv,
                                          textBytes,
                                          dataLength,
                                          buffer,
                                          1024,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
        ciphertext = [[[NSString alloc] initWithData:[GTMBase64 encodeData:data] encoding:NSUTF8StringEncoding] autorelease];
    }
    
    return ciphertext;
}
2)解密
/**
 *  3DES解密
 *
 *  @param cipherText 密文
 *  @param key        金鑰
 *
 *  @return 解密結果
 */
- (NSString *)decryptUseDES:(NSString*)cipherText key:(NSString*)key
{
    NSData* cipherData = [GTMBase64 decodeString:cipherText];
    unsigned char buffer[1024];
    memset(buffer, 0, sizeof(char));
    size_t numBytesDecrypted = 0;
    Byte iv[] = {1,2,3,4,5,6,7,8};
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                          kCCAlgorithmDES,
                                          kCCOptionPKCS7Padding,
                                          [key UTF8String],
                                          kCCKeySizeDES,
                                          iv,
                                          [cipherData bytes],
                                          [cipherData length],
                                          buffer,
                                          1024,
                                          &numBytesDecrypted);
    NSString* plainText = nil;
    
    if (cryptStatus == kCCSuccess) {
        NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
        plainText = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
    }
    
    return plainText;
}

2、================= MD5加密 =================

1)32位MD5加密

/**
 *  32位MD5加密
 *
 *  @param string           加密字串
 *  @param LetterCaseOption 加密選項 {1:大寫;2:小寫}
 *
 *  @return 加密後的字串
 */
- (NSString *)encodeUsingMD5ByString:(NSString *)plainText letterCaseOption:(NSInteger)letterCaseOption{
    const char *cStr = [plainText UTF8String];
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5( cStr, strlen(cStr), digest );
    NSMutableString *encodeString = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    
    for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
        [encodeString appendFormat:@"%02x", digest[i]];
    
    NSString *cipherText = nil;
    
    if (letterCaseOption == 1) {
        cipherText = [encodeString uppercaseString];
    }else{
        cipherText = [encodeString lowercaseString];
    }
    
    return cipherText;
}

2)16位MD5加密

/**
 *  16位MD5加密
 *
 *  @param plainText        明文
 *  @param letterCaseOption 大小寫選項
 *
 *  @return 加密結果
 */
- (NSString *)encodeUsing16BitsMD5ByString:(NSString *)plainText letterCaseOption:(NSInteger)letterCaseOption{
    const char *cStr = [plainText UTF8String];
    unsigned char result[16];
    CC_MD5(cStr, strlen(cStr), result);
    
    NSString *encodeString = [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
                              result[0], result[1], result[2], result[3],
                              result[4], result[5], result[6], result[7],
                              result[8], result[9], result[10], result[11],
                              result[12], result[13], result[14], result[15]
                              ];
    
    NSString *cipherText = nil;
    
    if (letterCaseOption == 1) {
        cipherText = [encodeString uppercaseString];
    }else{
        cipherText = [encodeString lowercaseString];
    }
    
    return cipherText;
}

注:MD5加密不可逆,所以沒有MD5解密

3、================= Base64編碼 / 解碼 =================

/**
 *  Base64編碼
 *
 *  @param data 源資訊
 *
 *  @return 編碼結果
 */
- (NSString *)base64EncodedStringFromData:(NSData *)data
{
    if ([data length] == 0)
        return @"";
    
    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++];
        }
        
        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++] = '=';
        }
    }
    
    NSString *formatString = [[NSString alloc] initWithBytesNoCopy:characters
                                                            length:length
                                                          encoding:NSUTF8StringEncoding
                                                      freeWhenDone:YES];
    return formatString;
}

注:Base64不是一種加密方式,只是一種編碼規範,考慮到在加密 / 解密的過程中經常用到Base64,故新增到本文中。

(未完待續)