2012-02-28 45 views
0

我想在將數據發送到服務器之前使用我的數據進行加密,是否有任何高度安全的雙向加密算法?哪一個最適合這個目的。什麼是IOS中可用的最佳數據加密算法

+0

退房[此鏈接](http://stackoverflow.com/a/5564822/468724) – 2012-02-28 08:21:21

回答

0

公鑰基礎設施(PKI)爲您提供了一種值得信賴的方式來加密2臺機器之間的數據。你可以試試看。

0

您可以使用HTTPS,或者也可以使用RC6來加密您的數據。

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 = @"123456789"; 
    NSString *initVec = @"init Vec"; 
    const void *vkey = (const void *) [key UTF8String]; 
    const void *vinitVec = (const void *) [initVec UTF8String]; 

    ccStatus = CCCrypt(encryptOrDecrypt, 
         kCCAlgorithm3DES, 
         kCCOptionPKCS7Padding, 
         vkey, //"123456789", //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); 
+0

這是不工作時我想解密加密的數據。 – 2012-02-29 13:47:50

+0

user731077,如果你想解密,NSData * outData = [NSString TripleDES:data encryptOrDecrypt:kCCDecrypt key:@「f968f8e82961489a8b14b345」];發佈你已經加密的數據和你的密鑰的功能。你會得到結果,但我已經測試過了。 – carl 2012-02-29 14:38:11

+0

當我使用[NSString TripleDES:dataToEncode encryptOrDecrypt:kCCEncrypt key:@「f968f8e82961489a8b14b345」]它給,+ [NSString TripleDES:encryptOrDecrypt:key:]:無法識別的選擇器發送到類0x88ffd8 – 2012-03-01 08:11:28

2

檢查的部份一旦

在這裏,關鍵是字符串變量,聲明爲全局變量。

爲您的代碼

附加sequrity框架和進口

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

    - (void)viewDidLoad 
     { 
      [super viewDidLoad]; 

      [email protected]"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

此代碼複製來自http://stackoverflow.com/questions/10701590/aes-decryption-using-objectivec – DarkDust 2013-08-13 06:42:21

相關問題