什么是IOS中最好的数据加密算法

时间:2012-02-28 08:14:07

标签: iphone ios

我试图在将数据发送到服务器之前对其进行加密,是否有任何高度安全的双向加密算法?哪一个最适合这个目的。

4 个答案:

答案 0 :(得分:2)

检查一次

这里,key是字符串变量,声明为全局变量。

为您的代码添加安全框架并导入

       #import <CommonCrypto/CommonDigest.h>
       #import <CommonCrypto/CommonCryptor.h>

     - (void)viewDidLoad
       {
          [super viewDidLoad];

          key=@"Your own key";

          // encoding
          NSString *encodingString=[[self encrypt:[@"Your String"           
                                       dataUsingEncoding:NSUTF8StringEncoding]    
                                       base64EncodedString];;

          //decoding
          NSData *data=[self decrypt:[NSData dataFromBase64String:encryptString]];
          NSString *decodingString = [[NSString alloc] initWithBytes:[data bytes] length:
                                     [data length] encoding: NSASCIIStringEncoding];

     }

   - (NSData *) encrypt:(NSData *) plainText {
        return [self transform:kCCEncrypt data:plainText];
     }

   - (NSData *) decrypt:(NSData *) cipherText {
       return [self transform:kCCDecrypt data:cipherText];
     }

   - (NSData *) transform:(CCOperation) encryptOrDecrypt data:(NSData *) inputData {

        // kCCKeySizeAES128 = 16 bytes
       // CC_MD5_DIGEST_LENGTH = 16 bytes
       NSData* secretKey = [ChipperObject md5:Key];

       CCCryptorRef cryptor = NULL;
       CCCryptorStatus status = kCCSuccess;

       uint8_t iv[kCCBlockSizeAES128];
       memset((void *) iv, 0x0, (size_t) sizeof(iv));

       status = CCCryptorCreate(encryptOrDecrypt, 
                               kCCAlgorithmAES128,kCCOptionPKCS7Padding,
                              [secretKey bytes], kCCKeySizeAES128, iv, &cryptor);

      if (status != kCCSuccess) {
           return nil;
      } 

      size_t bufsize = CCCryptorGetOutputLength(cryptor, (size_t)[inputData length], 
                                                true);

      void * buf = malloc(bufsize * sizeof(uint8_t));
      memset(buf, 0x0, bufsize);

      size_t bufused = 0;
      size_t bytesTotal = 0;

      status = CCCryptorUpdate(cryptor, [inputData bytes], (size_t)[inputData length],
                         buf, bufsize, &bufused);

     if (status != kCCSuccess) {
         free(buf);
         CCCryptorRelease(cryptor);
         return nil;
      }

      bytesTotal += bufused;

      status = CCCryptorFinal(cryptor, buf + bufused, bufsize - bufused, &bufused);

      if (status != kCCSuccess) {
           free(buf);
           CCCryptorRelease(cryptor);
           return nil;
      }

       bytesTotal += bufused;

       CCCryptorRelease(cryptor);

      return [NSData dataWithBytesNoCopy:buf length:bytesTotal];

}

答案 1 :(得分:1)

这是我的代码使用3des CCCrypt方法,从googlecode找到GTMBase64.h,https://code.google.com/p/google-toolbox-for-mac/source/browse/trunk/Foundation/GTMBase64.h?r=87

#import <CommonCrypto/CommonCryptor.h>
#import "GTMBase64.h"

- (NSData*)TripleDES:(NSData*)plainData encryptOrDecrypt:(CCOperation)encryptOrDecrypt key:(NSString*)key {

    const void *vplainText;
    size_t plainTextBufferSize;

    if (encryptOrDecrypt == kCCDecrypt)
    {
        NSData *EncryptData = [GTMBase64 decodeData:plainData];
        plainTextBufferSize = [EncryptData length];
        vplainText = [EncryptData bytes];
    }
    else
    {
        plainTextBufferSize = [plainData length];
        vplainText = (const void *)[plainData bytes];
    }

    CCCryptorStatus ccStatus;
    uint8_t *bufferPtr = NULL;
    size_t bufferPtrSize = 0;
    size_t movedBytes = 0;
    // uint8_t ivkCCBlockSize3DES;

    bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
    bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
    memset((void *)bufferPtr, 0x0, bufferPtrSize);
    // memset((void *) iv, 0x0, (size_t) sizeof(iv));

    //    NSString *key = @"123456789012345678901234";
    NSString *initVec = @"init Vec";
    const void *vkey = (const void *) [key UTF8String];
    const void *vinitVec = (const void *) [initVec UTF8String];

    ccStatus = CCCrypt(encryptOrDecrypt,
                       kCCAlgorithm3DES,
                       kCCOptionPKCS7Padding,
                       vkey, //"123456789012345678901234", //key
                       kCCKeySize3DES,
                       vinitVec, //"init Vec", //iv,
                       vplainText, //"Your Name", //plainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);
    //if (ccStatus == kCCSuccess) NSLog(@"SUCCESS");
    /*else if (ccStatus == kCC ParamError) return @"PARAM ERROR";
     else if (ccStatus == kCCBufferTooSmall) return @"BUFFER TOO SMALL";
     else if (ccStatus == kCCMemoryFailure) return @"MEMORY FAILURE";
     else if (ccStatus == kCCAlignmentError) return @"ALIGNMENT";
     else if (ccStatus == kCCDecodeError) return @"DECODE ERROR";
     else if (ccStatus == kCCUnimplemented) return @"UNIMPLEMENTED"; */

    NSData *result;

    if (encryptOrDecrypt == kCCDecrypt)
    {
        result = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
    }
    else
    {
        NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
        result = [GTMBase64 encodeData:myData];
    }

    return result;

}

用法

NSString *inputString = @"good";
//encode
NSData *inputData = [inputString dataUsingEncoding:NSUTF8StringEncoding];
NSData *encriptdata = [self TripleDES:inputData encryptOrDecrypt:kCCEncrypt key:@"ff68f8e82961489a8b14b345"];
NSString *encodeString = [GTMBase64 stringByEncodingData:encriptdata];
NSLog(@"encodeString : %@" ,encodeString);

//decode
NSData *encodeData = [GTMBase64 decodeString:encodeString];
NSData *decodeData = [self TripleDES:encodeData encryptOrDecrypt:kCCDecrypt key:@"ff68f8e82961489a8b14b345"];
NSString *decodeString =  [[NSString alloc] initWithBytes:[decodeData bytes] length:[decodeData length] encoding:NSUTF8StringEncoding];
NSLog(@"decodeString : %@" ,decodeString);

答案 2 :(得分:0)

公钥基础结构(PKI)为您提供了一种可靠的方法来加密两台计算机之间的数据。你可以尝试一下。

答案 3 :(得分:0)

您可以使用HTTPS,也可以使用RC6加密数据。