zoukankan      html  css  js  c++  java
  • 常见加密算法

    1、MD5   
    //因为是使用category,所以木有参数传入啦
    
    -(NSString *) stringFromMD5 {
        if(self == nil || [self length] == 0) {
            return nil;
        }
        const char *value = [self UTF8String];
        unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];
        CC_MD5(value, strlen(value), outputBuffer);
        NSMutableString *outputString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
        for(NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++){
            [outputString appendFormat:@"%02x",outputBuffer[count]];
        }
        return [outputString autorelease];
    }
    
    
    2、Base64
    
    + (NSString *) base64EncodeData: (NSData *) objData {
    const unsigned char * objRawData = [objData bytes];
    char * objPointer;
    char * strResult;
    
    // Get the Raw Data length and ensure we actually have data
    int intLength = [objData length];
    if (intLength == 0) return nil;
    
    // Setup the String-based Result placeholder and pointer within that placeholder
    strResult = (char *)calloc(((intLength + 2) / 3) * 4, sizeof(char));
    objPointer = strResult;
    
    // Iterate through everything
    while (intLength > 2) { // keep going until we have less than 24 bits
    *objPointer++ = _base64EncodingTable[objRawData[0] >> 2];
    *objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)];
    *objPointer++ = _base64EncodingTable[((objRawData[1] & 0x0f) << 2) + (objRawData[2] >> 6)];
    *objPointer++ = _base64EncodingTable[objRawData[2] & 0x3f];
    
    // we just handled 3 octets (24 bits) of data
    objRawData += 3;
    intLength -= 3;
    }
    
    // now deal with the tail end of things
    if (intLength != 0) {
    *objPointer++ = _base64EncodingTable[objRawData[0] >> 2];
    if (intLength > 1) {
    *objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)];
    *objPointer++ = _base64EncodingTable[(objRawData[1] & 0x0f) << 2];
    *objPointer++ = '=';
    } else {
    *objPointer++ = _base64EncodingTable[(objRawData[0] & 0x03) << 4];
    *objPointer++ = '=';
    *objPointer++ = '=';
    }
    }
    
    // Terminate the string-based result
    *objPointer = '';
    
        NSString *rstStr = [NSString stringWithCString:strResult encoding:NSASCIIStringEncoding];
        free(objPointer);
        return rstStr;
    }
    
    
    
    
    3、AES
    -(NSData*) EncryptAES: (NSString *) key {
        char keyPtr[kCCKeySizeAES256+1];
        bzero(keyPtr, sizeof(keyPtr));
    
        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
        NSUInteger dataLength = [self length];
    
        size_t bufferSize = dataLength + kCCBlockSizeAES128;
        void *buffer = malloc(bufferSize);
    
        size_t numBytesEncrypted = 0;
        CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,
                                              kCCOptionPKCS7Padding | kCCOptionECBMode,
                                              keyPtr, kCCBlockSizeAES128,
                                              NULL,
                                              [self bytes], dataLength,
                                              buffer, bufferSize,
                                              &numBytesEncrypted);
        if (cryptStatus == kCCSuccess) {
            return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
        }
    
        free(buffer);
        return nil;
    }
    
    
    4、RSA
    
    - (NSData *) encryptWithData:(NSData *)content {
        size_t plainLen = [content length];
        if (plainLen > maxPlainLen) {
            NSLog(@"content(%ld) is too long, must < %ld", plainLen, maxPlainLen);
            return nil;
        }
    
        void *plain = malloc(plainLen);
        [content getBytes:plain
                   length:plainLen];
    
        size_t cipherLen = 128; // currently RSA key length is set to 128 bytes
        void *cipher = malloc(cipherLen);
    
        OSStatus returnCode = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plain,
                                            plainLen, cipher, &cipherLen);
    
        NSData *result = nil;
        if (returnCode != 0) {
            NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode);
        }
        else {
            result = [NSData dataWithBytes:cipher
                                    length:cipherLen];
        }
    
        free(plain);
        free(cipher);
    
        return result;
    }
    
     
    
  • 相关阅读:
    鼠标拖拽窗口效果(不允许拖出屏幕的可视区域)
    react-context
    上下固定,中间自适应布局
    左右固定,中间自适应布局
    leetcode每日一题(2020-07-03):108. 将有序数组转换为二叉搜索树
    leetcode每日一题(2020-07-02):378. 有序矩阵中第K小的元素
    leetcode每日一题(2020-07-01):718. 最长重复子数组
    leetcode每日一题(2020-06-30):剑指 Offer 09. 用两个栈实现队列
    leetcode每日一题(2020-06-29):215. 数组中的第K个最大元素
    leetcode每日一题(2020-06-28):209. 长度最小的子数组
  • 原文地址:https://www.cnblogs.com/keyan1102/p/4513538.html
Copyright © 2011-2022 走看看