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バイトのキーサイズを実装するために何ができますか?本当にありがとう。
私は初心者です、どのように私は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
これはCレベルのAPIで、オブジェクトの種類と列挙型をすべて混在させています。私は上記の例を追加しました。どのようなタイプのパラメータを与えるべきかを知りたければ、Cmdキーを押しながら関数名をクリックしてヘッダファイルに行き、パラメータタイプについても同様にオプションを見てください。 – Tark
は16バイトのキーサイズで動作するようになりました。私は32バイトのキーサイズを使用するために何ができますか? – pasqui86