2012-03-13 1 views
2

iPhone用のアプリケーションをXcode 3.1で開発しています。Xcode 3.1はアルゴリズムAES 128ビット(CBC)の16進数形式の暗号化されたテキストを安らかなWebサービスから受け取ります。アルゴリズムは初期化ベクトル+秘密鍵を使用します。このテキストをどのように復号化するのですか?私が与えることに成功するヒントの皆様に感謝します。Objective-C decrypt AES 128 cbc 16進文字列

EDIT: RESTサーバーからの応答が16進数形式で暗号化されているため、このコードで試してみますが、常に不正なエラーが発生します。エラーを見つけるのを助けてくれますか? 私はまず文字列レスポンスをバイナリ形式に変換できますか?

 NSString *response = [request responseString]; 

     NSData *encryptedData = [response dataUsingEncoding: NSASCIIStringEncoding]; 
     NSString *key = @"32charlength"; 
     NSString *iv = @"16charlength"; 
     NSData *unencryptedData = NULL; 
     size_t unencryptedLength = [unencryptedData length]; 
     CCCryptorStatus ccStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0, key, kCCKeySizeAES128, iv, [encryptedData bytes], [encryptedData length], unencryptedData, [encryptedData length], &unencryptedLength);  
     NSString *output = [[NSString alloc] initWithBytes:unencryptedData length:unencryptedLength encoding:NSUTF8StringEncoding]; 

     if (ccStatus == kCCSuccess) risultato.text = @"SUCCESS"; 
     else if (ccStatus == kCCParamError) risultato.text = @"BAD PARAM"; 
     else if (ccStatus == kCCBufferTooSmall) risultato.text = @"BUFFER TOO SMALL"; 
     else if (ccStatus == kCCMemoryFailure) risultato.text = @"MEMORY FAILURE"; 
     else if (ccStatus == kCCAlignmentError) risultato.text = @"ALIGNMENT"; 
     else if (ccStatus == kCCDecodeError) risultato.text = @"DECODE ERROR"; 
     else if (ccStatus == kCCUnimplemented) risultato.text = @"UNIMPLEMENTED"; 

EDIT2: この機能復号化されたデータを割り当て、右バッファサイズを持っていないので、BAD PARAMを返します。私はこの作業方法で関数を編集します:

 NSData *encryptedData = [response dataUsingEncoding: NSASCIIStringEncoding]; 
     const void *key = @"32charlength; 
     uint8_t *iv  = @"16charlength"; 
     char buffer[4*4096]; 
     memset(buffer, '\0', sizeof(buffer)); 
       size_t size = sizeof(buffer); 
     CCCryptorStatus ccStatus = CCCrypt(kCCDecrypt, 
             kCCAlgorithmAES128, 
             0, 
             key, 
             kCCKeySizeAES128, 
             iv, 
             [encryptedData bytes], 
             [encryptedData length], 
             buffer, 
             sizeof(buffer), 
             &size); 

この機能は私のために働く..ありがとう。

EDIT 3月23日------

今のシステムの仕事は、16バイトのキーサイズで私を形成します。今私は質問がある、私は32バイトのキーサイズを実装するために何ができますか?本当にありがとう。

答えて

2

これは、<CommonCrypto/CommonCryptor.h>ヘッダーに含まれるCCCryptor機能を使用して可能です。あなたは、受信したデータを復号化するためにCCCrypt()への単一の呼び出しを使用することができますようにあなたのケースでは、それが聞こえる、血みどろの詳細についてはman CCCryptorを確認してください:

CCCryptorStatus 
CCCrypt(CCOperation op, CCAlgorithm alg, CCOptions options, const void *key, size_t keyLength, 
    const void *iv, const void *dataIn, size_t dataInLength, void *dataOut, size_t dataOutAvailable, 
    size_t *dataOutMoved); 

はあなたのような何かを試みることができるNSData *encryptedDataで復号するデータを持っていると仮定すると:

char * key = "shouldbe16chars."; 
NSUInteger dataLength = [encryptedData length]; 
uint8_t unencryptedData[dataLength + kCCKeySizeAES128]; 
size_t unencryptedLength; 

CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0, key, kCCKeySizeAES128, NULL, [encryptedData bytes], dataLength, unencryptedData, dataLength, &unencryptedLength); 
NSString *output = [[NSString alloc] initWithBytes:unencryptedData length:unencryptedLength encoding:NSUTF8StringEncoding]; 

これはテストされ、あなたがエラーのCCCryptの戻り値をチェックしてください。詳細については、ヘッダーファイルをチェックしてください、それはよく文書化されています。

+0

私は初心者です、どのように私はvarを初期化できますか?私はこれを試してください: NSString * hex = [NSString stringWithFormat:@ "%@"、レスポンス]; CCOperation * op = "decrypt"; CCAlgorithm * alg = @ "AES"; CCOptions * options = NULL; const void * key = "xxxx"; size_t * keyLength = [キーの長さ]; const void * iv = @ "xxxxxxxx-x-xxxxx"; size_t dataInLength = [16進数の長さ]; void * dataOut = response; size_t dataOutAvailable = 10000; size_t * dataOutMoved = NULL; CCCrypt(op、alg、options、key、keyLength、iv、hex、dataInLength、dataOut、dataOutAvailable、dataOutMoved); – pasqui86

+0

これはCレベルのAPIで、オブジェクトの種類と列挙型をすべて混在させています。私は上記の例を追加しました。どのようなタイプのパラメータを与えるべきかを知りたければ、Cmdキーを押しながら関数名をクリックしてヘッダファイルに行き、パラメータタイプについても同様にオプションを見てください。 – Tark

+0

は16バイトのキーサイズで動作するようになりました。私は32バイトのキーサイズを使用するために何ができますか? – pasqui86

関連する問題