2016-03-25 9 views
1

AES128は16バイトのデータブロックをキーを使って暗号化し、IVを16バイトのAESブロックに暗号化する必要があります。CCCryptのキーとしてNSDataを送る方法

私が見たすべてのCCCryptの例は、キーとIVの(NSString *)を取り入れています。私のキーとIVはNSData 16バイトです。 NSDataを16進文字列に変換しましたが、結果は正しくありません。このようにすると32バイトのAESブロックが得られます。

私の質問は、NSDataをconst void *としてCCCryptに読み込むためには何が必要なのですか?

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

あなたはPKCS7パディングを指定しています。 PKCS7は少なくとも1バイトのパディングを追加するので、16バイトを暗号化すると2ブロックの16バイト= 32バイトの暗号化されたデータになります。 –

+0

ありがとうございます。申し訳ありません、私はそれをテストに入れました。パディングがなければ16バイトを出しました。私は16バイトのNSDataをivPtrとkeyPtrのconst void *入力に変換する方法を尋ねています。 – Scott

+0

ECBモードではIVが使用されません。デフォルトのCBCモードが必要です。 – zaph

答えて

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

Zaphに感謝しますが、依然として32バイトの結果が得られます。 dataIn、key、およびIVはすべて16バイトです。私はAESとAES128を試しました、私はPKS7Paddingがあり、これはCBCブロックです。私はあなたが16バイトのデータをすべて渡したとき、16バイトを出すと考えていました。 – Scott

+0

パディングを使用すると、ブロックサイズの倍数であるデータが1ブロックのパディングに渡されるときに追加する必要があるパディングが常に追加される必要があります。参照:[PKCS#7パディング](https://en.wikipedia.org/wiki/Padding_(暗号化)#PKCS7)。 – zaph

+0

これは本当に@zaphを助けました。暗号化して復号化するサービスに送信する必要があります。私は彼らがCBCとPKCS7パディングを使っていると言われましたが、16バイトしか期待していませんでした。私がパディングオプションを追加したとき、それは私に32を与えたが、それを送ったときに解決した。私はあなたの回答を投票するつもりですが、私は十分な担当者がいません!再度、感謝します。 – Scott