2016-03-25 6 views
1

Ich muss AES128 einen 16-Byte-Block von Daten mit einem Schlüssel und einem IV zu einem 16-Byte-AES-Block verschlüsseln.So senden Sie NSData als Schlüssel und IV für CCCrypt

Jedes CCCrypt-Beispiel, das ich gesehen habe, nimmt (NSString *) für Schlüssel und IV auf. Mein Schlüssel und IV sind NSData 16 Bytes. Ich habe die NSData in Hexadezimalstrings umgewandelt, aber das Ergebnis ist nicht korrekt. Ich bekomme einen AES-Block von 32 Bytes, wenn ich es so mache.

Also meine Frage ist, was muss ich tun, um NSData in CCCrypt als const void * gelesen zu bekommen?

- (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv theData:(NSData *)theData 
{ 
    char keyPtr[kCCKeySizeAES128 + 1]; 
    bzero(keyPtr, sizeof(keyPtr)); 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    char ivPtr[kCCBlockSizeAES128 + 1]; 
    bzero(ivPtr, sizeof(ivPtr)); 
    if (iv) { 
     [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; 
    } 

    NSUInteger dataLength = [theData length]; 
    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesEncrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(operation, 
              kCCAlgorithmAES128, 
              kCCOptionECBMode, 
              keyPtr, 
              kCCBlockSizeAES128, 
              ivPtr, 
              [theData bytes], 
              dataLength, 
              buffer, 
              bufferSize, 
              &numBytesEncrypted); 


    if (cryptStatus == kCCSuccess) { 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 
    } 
    free(buffer); 
    return nil; 
} 
+1

Sie angeben PKCS7 Padding. PKCS7 fügt mindestens 1 Byte Padding hinzu, so dass die Verschlüsselung von 16 Bytes Sie in 2 Blöcke von 16 Bytes = 32 Byte verschlüsselter Daten versetzt. –

+0

Danke. Tut mir leid, ich habe das nur zum Testen eingegeben. Ich habe 16 Bytes bekommen, als das Padding nicht da war. Ich frage, wie man 16 Byte NSData in den const void * Eingang für ivPtr und keyPtr konvertiert. – Scott

+0

ECB-Modus verwendet keine IV, vielleicht brauchen Sie den CBC-Modus, der die Standardeinstellung ist. – zaph

Antwort

0
+ (NSData *)AES128:(NSData *)dataIn 
     operation:(CCOperation)operation // kCC Encrypt, Decrypt 
       key:(NSData *)key 
      options:(CCOptions)options  // kCCOption PKCS7Padding, ECBMode, 
       iv:(NSData *)iv 
      error:(NSError **)error 
{ 
    CCCryptorStatus ccStatus = kCCSuccess; 
    size_t   cryptBytes = 0; 
    NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128]; 

    ccStatus = CCCrypt(operation, 
         kCCAlgorithmAES, 
         options, 
         key.bytes, key.length, 
         iv.bytes, 
         dataIn.bytes, dataIn.length, 
         dataOut.mutableBytes, dataOut.length, 
         &cryptBytes); 

    if (ccStatus == kCCSuccess) { 
     dataOut.length = cryptBytes; 
    } 
    else { 
     if (error) { 
      *error = [NSError errorWithDomain:@"kEncryptionError" 
             code:ccStatus 
            userInfo:nil]; 
     } 
     dataOut = nil; 
    } 

    return dataOut; 
} 
+0

Danke Zaph, aber immer noch ein 32-Byte-Ergebnis. Die Daten, Schlüssel und IV sind alle 16 Bytes. Ich habe versucht AES und AES128, ich habe PKS7Padding in und das ist ein CBC-Block. Ich dachte, wenn man alle 16-Byte-Daten übergibt, soll man 16 Bytes raus bekommen. – Scott

+0

Bei der Verwendung von Padding muss immer ein Padding hinzugefügt werden, wenn Daten, die ein Vielfaches der Blockgröße sind, in einem Block Padding übergeben werden. Siehe: [PKCS # 7-Padding] (https://en.wikipedia.org/wiki/Padding_ (Kryptographie) # PKCS7). – zaph

+0

Das hat @zaph sehr geholfen. Ich muss verschlüsseln und an einen Dienst senden, der entschlüsselt. Mir wurde gesagt, dass sie CBC und PKCS7padding benutzten, aber nur 16 Bytes erwarteten. Als ich die Padding-Option hinzugefügt habe, gab es mir 32, aber es löste sich, als ich es sendete. Ich würde deine Antwort abstimmen, aber ich habe nicht genug Rep! Danke noch einmal. – Scott

Verwandte Themen