1. ホーム
  2. iphone

[解決済み] iPhoneでNSStringをAES暗号化する方法

2022-08-15 20:53:13

質問

文字列を暗号化し、暗号化されたデータを別の文字列で返すことができるようにするための正しい方向性を誰か教えてください。(1つは暗号化するメッセージで、もう1つはそれを暗号化する「パスコード」です。パスコードが暗号化されたデータで供給された場合に逆転できる方法で、パスコードで暗号化キーを生成しなければならないと思います。このメソッドは、暗号化されたデータから作成された NSString を返す必要があります。

に詳述されているテクニックを試してみました。 この投稿の最初のコメント にあるテクニックを試してみましたが、今のところうまくいきません。アップルの 暗号化演習 は確かに何かを持っていますが、私はそれを理解することができません...。という言及をたくさん見かけました。 CCCrypt への参照をたくさん見ましたが、私が使用したすべてのケースで失敗しました。

暗号化された文字列を復号化することもできなければならないが、それがkCCEncrypt/kCCDecryptと同じくらい単純であることを望む。

どのように解決するのですか?

コードを投稿していないので、あなたが遭遇している問題を正確に知ることは困難です。しかし、リンク先のブログ投稿は、かなりまともに動作しているように見えます...。 CCCrypt() への各呼び出しに余分なカンマがあり、コンパイル エラーが発生したことを除けば、です。

その投稿に対する後のコメントには この適応されたコード があり、これは私のために動作し、もう少し簡単なようです。NSData カテゴリ用の彼らのコードを含めると、次のように書くことができます: (Note: The printf() の呼び出しは、さまざまな点でのデータの状態を示すためだけのものです。実際のアプリケーションでは、このような値を表示することは意味がありません)。

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSString *key = @"my password";
    NSString *secret = @"text to encrypt";

    NSData *plain = [secret dataUsingEncoding:NSUTF8StringEncoding];
    NSData *cipher = [plain AES256EncryptWithKey:key];
    printf("%s\n", [[cipher description] UTF8String]);

    plain = [cipher AES256DecryptWithKey:key];
    printf("%s\n", [[plain description] UTF8String]);
    printf("%s\n", [[[NSString alloc] initWithData:plain encoding:NSUTF8StringEncoding] UTF8String]);

    [pool drain];
    return 0;
}

このコードと、暗号化されたデータが常にNSStringにうまく変換されるとは限らないという事実を考えると、必要な機能をラップする2つのメソッドを順方向と逆方向で書く方が便利かもしれません...。

- (NSData*) encryptString:(NSString*)plaintext withKey:(NSString*)key {
    return [[plaintext dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptWithKey:key];
}

- (NSString*) decryptData:(NSData*)ciphertext withKey:(NSString*)key {
    return [[[NSString alloc] initWithData:[ciphertext AES256DecryptWithKey:key]
                                  encoding:NSUTF8StringEncoding] autorelease];
}

これは間違いなく Snow Leopard で動作しますし ボズ は、CommonCrypto が iPhone の Core OS の一部であることを報告しています。10.4 と 10.5 の両方には /usr/include/CommonCrypto の man ページがありますが、10.5 では CCCryptor.3cc のマニュアルページがあり、10.4 にはないので、YMMV です。


EDITです。 参照 このフォローアップの質問 をご覧ください。暗号化されたデータのバイトを文字列として表現するためにBase64エンコーディングを使用し、安全で可逆的な変換を行います。