2

Jim Dovey による NSData+AESCrypt カテゴリと、Michael Sedlaczek (2011-02-22) による NSString+AESCrypt を使用しています。

そしてPHPには簡単なスクリプトがあります:

<?php
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = '01234567890123456789012345678901';
$plaintext = "myworda";

$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, MCRYPT_MODE_ECB);
$base64encoded_ciphertext = base64_encode($ciphertext);
echo "ciphertext: ".$base64encoded_ciphertext."<br/>";
?>

ObjC で:

NSString *key = @"01234567890123456789012345678901";
NSString *plaintext = [@"+l56Ia4yyK19D2x2+oCXuw==" AES256DecryptWithKey: key];
NSLog(@"plaintext: %@", plaintext);

PHP で変数 $plaintext を変更し、スクリプトを実行し、output-cipher をコピーして Objective-c に貼り付けて復号化します。

と:

  1. 「myword」は「+l56Ia4yyK19D2x2+oCXuw==」を提供し、iOS で復号化して「myword」を取得します [OK]

  2. 「おはよう」で「5UdImsV1pQs60ovXmH74HQ==」が返され、iOS で復号化して「おはよう」を取得 [OK]

  3. "Schröder" は "KqNSCE8nGsYUYVdGZ2tnMw==" を返し、iOS で復号化して "Schröder" を取得します [OK]
  4. "Schröder" は "KqNSCE8nGsYUYVdGZ2tnMw==" を返し、iOS で復号化して "Schröder" を取得します [OK]
  5. 「非常に長いテキスト」で「lsa+QF3IHQnAFiOjl2Heyg==」が返され、iOS で復号化して「非常に長いテキスト」を取得する [OK]
  6. 「非常に非常に長いテキスト」で「kl/TheEyuyUMmKSqU4/fJSzzJOyvsXrGRt5/zsnqjQww=」が表示され、iOS で復号化できません [FAIL]

なぜ#5は失敗するのですか?Xcode を使用して「非常に非常に長いテキスト」を暗号化しようとすると、「kl/TheEyuyUMmKSqU4/fJS90UZoJ73S4gox2uCoWoIL8=」というメッセージが表示されます。

さらに、Xcode で「おはよう」を暗号化すると、「hVq1AuR8PAXSOztK26pmMw==」が返され、PHP は「5UdImsV1pQs60ovXmH74HQ==」が返されますが、Xcode は同じキーを使用して両方を「おはよう」に復号化します。

助けてください。

4

2 に答える 2

4

PHP コードは ECB モードを使用しています。ObjC でモードを設定している場所がわかりません。おそらく、デフォルトモードを使用しています。ObjC のデフォルト モードが ECB ではなく、CBC である可能性があります。また、平文が 16 バイト以下 (つまり 1 ブロック以下) の場合はいつでも、復号化が機能することに注意してください。16 バイトより大きい (つまり、2 番目のブロックに拡張されている) 場合、失敗します。

ObjC のデフォルトは、IV がゼロの CBC モードであると思われます。これは、最初のブロックのみで ECB であるかのように機能し、2 つ目以降のブロックでは異なります。

ECB モードは安全ではなく、情報が漏洩します。代わりに、指定された IV で CBC モードを使用してください。少なくとも、ECB モードではなく CBC モードを使用するように PHP コードを変更してください。

于 2011-11-26T11:23:50.743 に答える
-3

を使用してメッセージを暗号化するMCRYPT_RIJNDAEL_128と、128 ビットまたは 16 バイトのブロック サイズが得られます。very very very very long text16 バイトより大きいことがわかります。

したがって、iOSでの復号化では異なるブロックサイズを使用していると思います。私は ios に詳しくありませんがAES256DecryptWithKey、256 ビットのブロック サイズを使用しているようです。

PHPコードで使用してみるMCRYPT_RIJNDAEL_256か、使用するiosコードを変更してくださいAES128DecryptWithKey(それが存在するかどうかはわかりませんが、iosはわかりません)

于 2011-11-26T11:21:00.420 に答える