15

入力されたNSStringをCCCrypt(AES256)とプレーンテキストキーを使用して暗号化するiPhoneアプリがあります。文字列とキーは、NSDataオブジェクトを返す暗号化メソッドに渡されます。

[データの説明]をリクエストすると、「data」は暗号化された文字列データで、「<0b368353 a707e7de 3eee5992 ee69827e e3603dc2 b0dbbc0b 861ca87d f39ce72a>」のようなNSStringが得られますが、これをNSStringに変換しようとすると、「(null)」になります。

NSStringをユーザーに返す必要があります。これは、同じプレーンテキストキーを使用して元の文字列に復号化するために使用できます。NSDataオブジェクトの'description'プロパティが文字列を返すことができる場合、 "(null)"を取得せずにNSDataオブジェクトからNSStringを生成する方法はありますか?

更新:混乱した文字列を生成するためにBase64エンコーディングを使用することを提案してくれたQuinnに感謝します。私が理解していることから、Base64エンコーディングは単に文字を交換するのではなく、文字交換は位置に依存するので、それで問題ありません。

私の唯一の懸念は、メッセージを「パスフレーズ」で暗号化し、混乱した文字列をデコードする必要があるときに同じパスフレーズを入力する必要があることです-これを実装する方法を誰かが提案できますか?

4

3 に答える 3

33

まず、そのような目的で NSString を作成するために使用しないでください。(デバッグ出力として-[NSData description]扱うのが最善です。以前の回答が誤解を招いた場合は申し訳ありません。NSDataを暗号化および復号化できることを示すために説明を印刷しただけです。)代わりに、NSStringのおよびメソッドを使用してNSDataとNSStringの間で変換します。これらを使用しても、AES で暗号化されたデータはそのままでは文字列にうまく変換されない可能性が高いことに注意してください — 一部のバイト シーケンスは適切に再生されないため、文字列を作成する前にデータをエンコードすることをお勧めします。-description-dataUsingEncoding:-initWithData:encoding:

Base64 データは常に ASCII 文字列として表現できるため、NSData のBase64 エンコードを試すことをお勧めします。(もちろん、これを行う場合、復号化する前に Base64 から復号化する必要があります。)

ここにいくつかの役立つリソースがあります...


編集:これを、 NSStringオブジェクトのAES暗号化に関する以前の質問に対する私の回答と組み合わせると想定していました。データを Base64 としてエンコードしても、データ自体に制限はありません。AES で暗号化されたデータ自体であることは間違いありません。文字列の入力と出力だけが必要な場合は、次のようにします。

  • 暗号化
    • 暗号化する NSString と、暗号化に使用するパスフレーズを指定します。
    • 文字列を NSData に変換し、AES 暗号化を実行します (前の質問を参照)。
    • NSData を Base64 エンコードし、エンコードされた出力の NSString を作成して返します。
  • 復号化
    • 暗号化およびエンコードされた文字列と、復号化に使用するパスフレーズを提供します。
    • 最初の文字列から NSData を作成し、データを Base64 デコードします。
    • データに対して AES 復号化を実行し、NSString を作成して返します。

2つのパートをつなぎ合わせて、途中で逆に演奏するだけです。私の以前の回答からencryptString:withKey:、最後のステップを実行して文字列を返すように変更し、2 つの文字列を受け入れるように変更decryptData:withKey:できます。decryptString:withKey:それはかなり簡単です。

于 2009-09-13T15:05:07.570 に答える
2

文字列に AES256 暗号化を提供するために、NSData と NSString のカテゴリの完全なバンドルをまとめました。

詳細については、「元の」質問に対する私の回答をご覧ください。

于 2011-02-22T13:04:35.887 に答える