2

元気ですか?

RNCryptor を使用して、iOS デバイスと Web サーバー間のトランザクションを暗号化しようとしています。そのために、私は iOS と PHP で RNCryptor を使用し、iOS から WebServer への通信には AFNetworking を使用しています。

JSON 応答オブジェクトに解析される前に、AFNetworking から受信したデータを復号化するにはどうすればよいですか?


合成するために、私は持っています:

  • Yii フレームワーク、サーバーサイド、PHP
  • AFNetwoling、クライアント側、Objective-C
  • RNCryptor、両面

iOS から PHP へ: データを使用する前に復号化できます。

PHP から iOS へ: AFNetworking はデータを使用する前に復号化しません。


私のPHPコードは次のようなものです:

RNCryptorHelper::init();
$encryptor = new \RNCryptor\Encryptor;

$data['Model1'] = Model1::model()->findAll();
$data['Model2'] = Model2::model()->findAll();

// EDITED TO REMOVE THIS HEADER
// header('Content-type: application/json');
echo $encryptor->encrypt(CJSON::encode($data), Yii::app()->params['cryptPassword']);
Yii::app()->end();

それはそのようなものを出力します:

AwFQ9+OfsHyXcSPynCrtveF7MQupQ+urd/VYeNMmt6OMxd6MhsDz4nxapvS1kVEHHbBZ4xLHqN7hTUDZos1LTWhB/CyeYoWpZSDhyFeHu9wNlHcRie6KTaHv/h14krvfb2/GHMt3GhIFqnyo7UKy/d06


私のObjective-Cコードは次のようなものです:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

[manager GET:[NSString stringWithFormat:@"%@/Sync", URL_ROOT]
  parameters:nil
     success:^(AFHTTPRequestOperation *operation, id responseObject) {

         NSLog(@"%@", [RNDecryptor decryptData:responseObject withPassword:CRYPT_PASSWORD error:nil]);

     }
     failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"Error: %@", error);
     }];

次のエラーが出力されます。

Error Domain=NSCocoaErrorDomain Code=3840 "The operation could not be completed. (Cocoa error 3840.)" (JSON テキストが配列またはオブジェクトで開始されておらず、フラグメントを許可するオプションが設定されていません。) UserInfo=0x15681970 {NSDebugDescription=JSON テキスト配列またはオブジェクトで開始されておらず、フラグメントを許可するオプションが設定されていません。}


ご協力いただきありがとうございます!!


編集1

コードを少し変更したところ、次の結果が得られました。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

[manager GET:[NSString stringWithFormat:@"%@/Sync", URL_ROOT]
  parameters:nil
     success:^(AFHTTPRequestOperation *operation, id responseObject) {

         NSData *decryptedData = [RNDecryptor decryptData:[[NSData alloc] initWithBase64EncodedData:responseObject options:NSDataBase64DecodingIgnoreUnknownCharacters]
                                             withPassword:CRYPT_PASSWORD
                                                    error:nil];

         id json = [NSJSONSerialization JSONObjectWithData:decryptedData
                                                   options:kNilOptions
                                                     error:nil];

     }
     failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"Error: %@", error);
     }];

その復号化を自動化する Response Serializer を作成する方法についてのヒントはありますか?

4

2 に答える 2

3

わかりました、解決策を見つけて、美しい方法で解決しました。復号化を処理する AF Response Serializer を作成しました。

RNCryptResponseSerializer.h

//
//  RNCryptResponseSerializer.h
//  Professor Virtual
//
//  Created by Caio Henrique Galli dos Santos on 18/06/14.
//  Copyright (c) 2014 sys10. All rights reserved.
//

#import "AFURLResponseSerialization.h"

@interface RNCryptResponseSerializer : AFJSONResponseSerializer

@end

RNCryptResponseSerializer.m

//
//  RNCryptResponseSerializer.m
//  Professor Virtual
//
//  Created by Caio Henrique Galli dos Santos on 18/06/14.
//  Copyright (c) 2014 sys10. All rights reserved.
//

#import "RNCryptResponseSerializer.h"
#import "RNDecryptor.h"

@implementation RNCryptResponseSerializer

#pragma mark - AFURLResponseSerialization

- (id)responseObjectForResponse:(NSURLResponse *)response
                           data:(NSData *)data
                          error:(NSError *__autoreleasing *)error
{

    NSData *dataFromBase64 = [[NSData alloc] initWithBase64EncodedData:data options:NSDataBase64DecodingIgnoreUnknownCharacters];
    NSData *dataDecrypted = [RNDecryptor decryptData:dataFromBase64
                                        withPassword:CRYPT_PASSWORD
                                               error:nil];

    return [super responseObjectForResponse:response data:dataDecrypted error:error];

}

@end

私のAFHTTPRequestOperationManagerで:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [RNCryptResponseSerializer serializer];

[manager GET:[NSString stringWithFormat:@"%@/Sync", URL_ROOT]
  parameters:nil
     success:^(AFHTTPRequestOperation *operation, id responseObject) {

         // Decrypted responseObject
         responseObject;

     }
     failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"Error: %@", error);
     }];
于 2014-06-19T13:46:49.310 に答える
1

応答ヘッダーで、返されるデータは JSON ('Content-type: application/json') になると言っていますが、そうではありません。かつては JSON であり、復号化後に再び使用できる暗号化されたバイトの集まりです。

ヘッダーを変更する (最適) か、ヘッダーを認識しない http 要求を使用して、JSON のシリアル化解除を自動的に試みます。AAFNetworking を調べて、rad データを返すだけのオプションまたは別のメソッドがあるかどうかを確認してください。

生データを取得し、復号化してから逆シリアル化する必要があります。

于 2014-06-18T23:31:46.613 に答える