2013-03-26 5 views
1

J'essaie de crypter des données dans l'objectif c avec l'algorithme DES. Voici mon code. Je reçois mes données: <> et chiffré str: à partir de ce code. Quelqu'un peut-il dire ce qui ne va pas s'il vous plaît?Cryptage DES avec objectif c

NSString *token = @"hello world"; 
    const void *vplainText; 
    size_t plainTextBufferSize; 

    plainTextBufferSize = [token length]; 
    vplainText = (const void *) [token UTF8String]; 

    uint8_t *bufferPtr = NULL; 
    size_t bufferPtrSize = 0; 
    size_t *movedBytes; 

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

    NSString *key = [[NSString alloc] initWithString:@"12345678"]; 
    const void *vkey = (const void *) [key UTF8String]; 
    CCCryptorStatus cryptStatus =CCCrypt(
          kCCEncrypt,   /* kCCEncrypt, etc. */ 
          kCCAlgorithmDES,  /* kCCAlgorithmAES128, etc. */ 
          kCCOptionPKCS7Padding | kCCOptionECBMode, /*kCCOptionPKCS7Padding, etc. */ 
          vkey, 
          kCCKeySizeDES, 
          NULL,   /* optional initialization vector */ 
          vplainText,  /* optional per op and alg */ 
          plainTextBufferSize, 
          (void *)bufferPtr,   /* data RETURNED here */ 
          bufferPtrSize, 
          movedBytes); 

    NSString *result; 

    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes]; 
    NSLog(@"my data :%@",myData); 


    result = [self base64Encoding:myData]; 
    NSLog(@"enrypted str: %@",result); 
+0

Quelle erreur êtes-vous ?. – Vignesh

+0

Avez-vous regardé votre "cryptStatus"? – trumpetlicks

+0

Comment puis-je regarder mon "cryptStatus"? – user1765253

Répondre

2

Exemple de code ...

- (void) testDES 
{ 
    NSData * data = [OpenSSLProxy getRandomBytes:20]; // generate some random bytes 
    NSData * key = [OpenSSLProxy getRandomBytes:kCCKeySizeDES]; 
    NSData * enc = [self encryptDESByKey:key data:data]; 
    NSData *dec = [self decryptDESByKey:key data:enc]; 
    STAssertEqualObjects(data, dec, @""); 
} 

- (NSData *)encryptDESByKey:(NSData *)key data:(NSData *)data 
{ 
    size_t numBytesEncrypted = 0; 
    size_t bufferSize = data.length + kCCBlockSizeDES; 
    void *buffer = malloc(bufferSize); 

    CCCryptorStatus result = CCCrypt(kCCEncrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, 
            key.bytes, kCCKeySizeDES, 
            NULL, 
            data.bytes, data.length, 
            buffer, bufferSize, 
            &numBytesEncrypted); 
    NSData *output = [NSData dataWithBytes:buffer length:numBytesEncrypted]; 
    free(buffer); 
    if(result == kCCSuccess) 
    { 
     return output; 
    } else { 
     NSLog(@"Failed DES encrypt..."); 
     return nil; 
    } 
} 

- (NSData *) decryptDESByKey:(NSData *)key data:(NSData *)data 
{ 
    size_t numBytesEncrypted = 0; 

    size_t bufferSize = data.length + kCCBlockSizeDES; 
    void *buffer_decrypt = malloc(bufferSize); 
    CCCryptorStatus result = CCCrypt(kCCDecrypt , kCCAlgorithmDES, kCCOptionPKCS7Padding, 
            key.bytes, kCCKeySizeDES, 
            NULL, 
            data.bytes, data.length, 
            buffer_decrypt, bufferSize, 
            &numBytesEncrypted); 

    NSData *output = [NSData dataWithBytes:buffer_decrypt length:numBytesEncrypted]; 
    free(buffer_decrypt); 
    if(result == kCCSuccess) 
    { 
     return output; 
    } else { 
     NSLog(@"Failed DES decrypt ..."); 
     return nil; 
    } 
} 
+0

Je voulais juste noter que ce code fuit le tampon! Vous pouvez simplement utiliser un NSMutableData à la place du tampon void *. – casillic

+0

oui, merci. J'ai ajouté une déclaration gratuite. écrit pour un code de test il y a longtemps. Je pense que j'ai utilisé void * probablement parce que le CCCrypt accepte cela facilement. – karim