2016-03-25 74 views
1

AES128'e bir anahtar ve 16 baytlık bir AES bloğuyla IV bir 16 bayt veri bloğu şifrelemesi gerekir.CCCrypt için NSData anahtarı ve IV nasıl gönderilir

Gördüğüm her CCCrypt örneği, anahtar ve IV için (NSString *) içeriyor. Anahtarım ve IV NSData 16 bayttır. NSData'yı hex dizelerine dönüştürdüm, ancak sonuç doğru değil. Bunu yaptığımda 32 baytlık bir AES bloğu alıyorum.

Benim sorum şu, NSData'nın CCCrypt'e const void * olarak okunmasını sağlamak için ne yapmalıyım?

- (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

Sen PKCS7 Geciktirme belirtiyorsanız. PKCS7 en az 1 bayt dolgu ekler, böylece 16 bayt şifrelemek sizi 2 bayt 16 bayta = 32 bayt şifrelenmiş veriye itecektir. –

+0

Teşekkürler. Üzgünüm, bunu test etmek için koydum. Dolgu yokken 16 bayt aldım. Ben 16 byte NSData ivPtr ve keyPtr için const void * girişi dönüştürmek için nasıl dönüştürüyorum. – Scott

+0

ECB modu bir IV kullanmaz, belki de varsayılan olan CBC moduna ihtiyacınız vardır. – zaph

cevap

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

Teşekkürler Zaph ama hala 32 byte sonuç alıyor. DataIn, anahtar ve IV'ün tümü 16 bayttır. AES ve AES128'i denedim, PKS7Padding'e sahibim ve bu bir CBC bloğu. Tüm 16 baytlık veriyi geçtiğinizde 16 baytlık bir çıkış yapmanız gerektiğini düşündüm. – Scott

+0

Dolgu kullanıldığında, bazı dolguların her zaman eklenmesi gerekir, böylelikle bir blok bloğunun çoklu blok büyüklüğündeki veriler geçtiğinde eklenmelidir. Bakınız: [PKCS # 7 dolgu] (https://en.wikipedia.org/wiki/Padding_ (kriptografi) # PKCS7). – zaph

+0

Bu gerçekten @zaph'a yardım etti. Şifrelemek ve şifresini çözen bir servise göndermek zorundayım. CBC ve PKCS7padding kullanıyorlardı ama sadece 16 bayt bekliyorlardı söylendi. Dolgu seçeneğini eklediğimde 32 bana verdi, ancak gönderdiğimde çözüldü. Cevabınızı oylarım, ancak bir temsilcim yok. Tekrar teşekkürler. – Scott