2013-01-10 10 views
7

私のメソッドは、Webサービスに送信するJSON文字列を暗号化/復号化するためにRNCryptorを使用する方法です。私は悪い習慣かもしれない静的なIV変数を使用していますが、それに集中しないでください。 (ページの一番下にある)hereを見つけましたが、私はhello worldのような文字列を使用する場合、それは正常に動作しますRNCryptorがJSON文字列で動作しない

-(NSString*)encryptString:(NSString*)plaintext withKey:(NSString*)key error:(NSError**)error{ 
    NSData *data = [plaintext dataUsingEncoding:NSUTF8StringEncoding]; 
    NSData *encryptionKey = [NSData dataFromBase64String:key]; 
    NSData *IV = [NSData dataFromBase64String:ENCRYPTION_IV]; 

    RNCryptorEngine *engine = [[RNCryptorEngine alloc] initWithOperation:kCCEncrypt settings:kRNCryptorAES256Settings key:encryptionKey IV:IV error:error]; 
    [engine addData:data error:error]; 
    NSData *encryptedData = [engine finishWithError:error]; 

    NSString *based64Encrypted = [encryptedData base64EncodedString]; 
    NSLog(@"Encrytped: %@", based64Encrypted); 
    return based64Encrypted; 
} 
-(NSString*) decryptString:(NSString*)cipherText withKey:(NSString*)key error:(NSError**)error;{ 
    NSData *data = [NSData dataFromBase64String:cipherText]; 
    NSData *encryptionKey = [NSData dataFromBase64String:key]; 
    NSData *IV = [NSData dataFromBase64String:ENCRYPTION_IV]; 

    RNCryptorEngine *engine = [[RNCryptorEngine alloc] initWithOperation:kCCDecrypt settings:kRNCryptorAES256Settings key:encryptionKey IV:IV error:error]; 
    [engine addData:data error:error]; 
    NSData *decryptedData = [engine finishWithError:error]; 
    NSString *decryptedString = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding]; 
    NSLog(@"Decrypted: %@", decryptedString); 
    return decryptedString; 
} 

私はマット・ギャラガーさんのNSData + Base64のカテゴリを使用しています:

注:ここで私はそれをやっている方法です。 {"username":"developer","password":"abcdefG*12"}のような文字列を使用すると、エンコーディングと何か関係がありますが、実際に何を使用するのか分かります。

私はその文字列を暗号化するときにbase64文字列を取得し、それを解読しようとすると空の文字列が得られます。

UPDATE

、それが原因でJSON文字列で :の失敗ているように見えます。 JSON形式の文字列でしか失敗するのは、:だと思ったのですが、最初に試してみましたが、さらに調査すると、JSON要件のいずれかが破られた場合,{}は停止しましたワーキング。しかし、それはRNEncryptorと一緒に働くので、何が間違っているのか分かりません。

NSDictionary *credentials = @{@"username":@"developer",@"password":@"abcdefG*12"}; 
NSString *jsonString = [ credentials JSONStringWithOptions:JKSerializeOptionNone error:&error]; 
NSLog(@"json string: %@", jsonString); //OUTPUTS: {"username":"developer","password":"abcdefG*12"} 
CCGEncryption *encryptionObject = [[CCGEncryption alloc] init]; //THIS IS THE OBJECT WHERE THE encrypt/decrypt methods are 

NSString *encrypted = [encryptionObject encryptString:jsonString withKey:ENCRYPTION_KEY error:&error]; 
if(error){ 
    NSLog(@"Error:%@", error); //NO ERROR 
} 
NSString *decrypted = [encryptionObject decryptString:encrypted withKey:ENCRYPTION_KEY error:&error]; 
if(error){ 
    NSLog(@"Error:%@", error); //NO ERROR 
} 
NSLog(@"decrypted: %@", decrypted); //OUTPUT: decrypted: 
+0

「私はその文字列をエンコードします。私はbase64文字列を取得し、デコードしようとするとnull値を取得します。暗号化と解読を意味していますか?投稿されたコードから、私はあなたの平文がUTF8エンコーディングを使用しているのを見て、あなたの暗号文はBase64を使用していません。復号関数が 'null'を返す場合、おそらく' error'値が返されます。それは何の価値ですか? – jbtule

+0

@jbtule私はそれらのメソッドを使うコードを追加しました。私はJSONKitを使ってNSStringをNSStringにシリアライズしています。 – mkral

+0

@jbtuleとはい、暗号化/復号化を意味しました。投稿を編集しました – mkral

答えて

3

あなたはaddData:によって返されたデータを収集していない:私はこれらのメソッドを呼び出す午前ところいずれにせよ、私たちは電流の流れを再設計かもしれないと思う。ここ

UPDATE 2

です。エンジンは暗号化/復号化を行うので、平文と暗号文全体をメモリに保持する必要はありません。それは、(パディング理由のために)必要がない限り、データを蓄積しません。私は、働いているテストが、そうでないものとは異なる長さのものであると思う。

固定IVを使用するのが悪いことは間違いありません。複数のメッセージで同じIVとキーを使用すると、攻撃者は暗号文を比較することでメッセージの一部を回復することができます。ランダムIVとHMACなしでAES-CBCを使用している場合、AESはいくつかの点で安全ではありません。これは、RNCryptorが問題に対処するために構築されたもので、データフォーマットがそのように見える理由です。

@jbtuleは、人々がエンジンを直接使用することを特に意識するものではなく、それを大きく文書化していないということは間違いありませんが、それを使用する上で問題はありません。つまり、エンジン自体は非常にシンプルです。私は、暗号化と復号化の間でコードを共有する方法として作成しました。 RNCryptorを使用する理由はほとんどありませんが、それが提供するセキュリティのほとんどをバイパスすることになります。上記のコードでは、ワンショットをCCCrypt()と呼ぶほうがずっと簡単です。

+0

非常にはっきりと説明してくれたRobに感謝します。バックグラウンド開発者にランダムIVを実装する方法について話します。私が持っていた1つの質問は、何らかの標準を使用しているData-Formatですか?最終的にアンドロイドに移動して今すぐやりたいと思っています。 – mkral

+0

IV、塩、HMACを含むことができることを私が知っている単純な標準フォーマットはないので、新しいものを巻かなければならなかった。解読形式は近いですが、ランダムな塩を提供することはできません(また、標準のPBKDFは使用しません)。実際にAESを正しくエンコードすることができる唯一の標準フォーマットはCMSですが、大部分はより複雑で、主に証明書署名付きメッセージであり、対称暗号化ではありません。私はサポートするフォーマットを積極的に探していますが、安全でなければなりません。最もよく知られている "標準"はOpenSSLですが、そのAES形式はいくつかの点で壊れています。 –

+0

よかった、説明をありがとう! – mkral

関連する問題