ios加密算法汇总

把相关算法的代码也贴一下吧 (其实使用一些成熟的第三方库或许会来得更加简单,不过自己写,自由点)。注,这里的大部分加密算法都是参考一些现有成熟的算法,或者直接拿来用的。
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 =  '\0' ;

     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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值