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,故添加到本文中。

(未完待续)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS中使用AES加密可以使用CommonCrypto库提供的API实现。具体步骤如下: 1. 引入头文件: ```objective-c #import <CommonCrypto/CommonCryptor.h> ``` 2. 定义加密/解密方法: ```objective-c // 加密方法 + (NSString *)encrypt:(NSString *)content key:(NSString *)key iv:(NSString *)iv { char keyPtr[kCCKeySizeAES256 + 1]; memset(keyPtr, 0, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCBlockSizeAES128 + 1]; memset(ivPtr, 0, sizeof(ivPtr)); [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding]; NSUInteger dataLength = [data length]; int bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesEncrypted = 0; CCCryptorStatus status = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCBlockSizeAES128, ivPtr, [data bytes], dataLength, buffer, bufferSize, &numBytesEncrypted); if (status == kCCSuccess) { NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; return [resultData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; } free(buffer); return nil; } // 解密方法 + (NSString *)decrypt:(NSString *)content key:(NSString *)key iv:(NSString *)iv { char keyPtr[kCCKeySizeAES256 + 1]; memset(keyPtr, 0, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCBlockSizeAES128 + 1]; memset(ivPtr, 0, sizeof(ivPtr)); [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; NSData *data = [[NSData alloc] initWithBase64EncodedString:content options:NSDataBase64DecodingIgnoreUnknownCharacters]; NSUInteger dataLength = [data length]; int bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesDecrypted = 0; CCCryptorStatus status = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCBlockSizeAES128, ivPtr, [data bytes], dataLength, buffer, bufferSize, &numBytesDecrypted); if (status == kCCSuccess) { NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding]; } free(buffer); return nil; } ``` 3. 调用加密/解密方法: ```objective-c NSString *key = @"1234567890123456"; NSString *iv = @"1234567890123456"; NSString *content = @"hello, world"; NSString *encryptedContent = [self encrypt:content key:key iv:iv]; NSLog(@"加密后:%@", encryptedContent); NSString *decryptedContent = [self decrypt:encryptedContent key:key iv:iv]; NSLog(@"解密后:%@", decryptedContent); ``` 需要注意的是,在ECB模式下,iv的值不会被使用,但是仍然需要传入一个长度为16的字符串。另外,加密后的结果需要使用base64编码才能转换为字符串,解密前需要先对密文进行base64解码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值