3

OS X CommonCrypto API を使用して暗号化されたデータを復号化する Python コードを取得しようとしています。CommonCrypto が使用する正確なオプションに関するドキュメントはほとんどまたはまったくないため、PyCrypto で設定するオプションを理解するのに助けが必要です。

具体的には、私の CommonCrypto 復号化セットアップ呼び出しは次のとおりです。

CCCryptorCreateWithMode(kCCDecrypt, kCCModeCFB, kCCAlgorithmAES128, ccDefaultPadding, NULL, key, keyLength, NULL, 0, 0, 0, &mAESKey);

私の主な質問は次のとおりです。

  1. kCCModeCFB と kCCModeCFB8 の両方があるため、CommonCrypto の CFB モードの定義は何ですか?セグメント サイズなどは?
  2. CommonCrypto AES128 が使用しているブロックサイズは? 16か128?
  3. デフォルトのパディングとは何ですか?CFB モードでも問題になりますか?

現在、segment_size を 16 に設定している限り、データの最初の 4 バイトは PyCrypto で正常に復号化されています。

アイデア?

4

1 に答える 1

2

CommonCrypto または PyCrypto を知らなくても、いくつかの部分的な回答:

  • AES (3 つのバリアントすべて) のブロック サイズは 128 ビット (16 バイト) です。

  • CFB (暗号フィードバック モード) は、実際にはパディングなし (つまり、部分的な最後のブロック) で機能します。これは、暗号文が平文とキーストリーム ブロックの XOR として作成されるためです。これは、前のブロックにのみ依存します。(必要なパディングは引き続き使用できます。)

    既知のデータで実験できる場合は、まず暗号文のサイズを確認してください。それが完全なブロックの倍数でない場合 (および平文 + IV と同じ場合)、パディングがない可能性が非常に高くなります。

    それ以外の場合は、noPadding モードで復号化し、結果を見て、さまざまな既知のパディング モードと比較してください。

    ソースコードを見ると、PKCS#5-padding である可能性があります。

  • CFB8 は、各ブロック暗号呼び出し出力の上位 8 ビット (= 1 バイト) のみを使用する CFB の変形です (暗号文 (または IV) の前の 128 ビット (= 16 バイト) を入力として受け取ります)。これには 16 倍のブロック暗号呼び出しが必要ですが、ブロック境界を気にせずにストリームを部分的に送信できます。

  • セグメント サイズを含む CFB の別の定義があります。ここで、セグメント サイズは、各暗号出力から使用されるビット (またはバイト) の数です。この定義では、「プレーンな」CFB は 128 ビット (= 16 バイト) のセグメント サイズを持ち、CFB8 は 8 ビット (1 バイト) のセグメント サイズを持ちます。

于 2011-12-23T22:02:05.737 に答える