2

問題が 1 つあります。私のアプリケーションでは、AES 暗号化と復号化を使用しています。データを暗号化してサーバー側に送信すると、暗号化されたデータにジャンク文字が追加されているように見えます。しかし、どのように?

実はこの暗号化されたデータは、私の側では完全に復号化されているのですが、サーバーで受信するとジャンク文字が入っています。

これが私の暗号化コードです:

public static  byte[] encrypt( byte[] keyData, byte[] data )
throws CryptoException, IOException
{
    // Create the AES key to use for encrypting the data.
    // This will create an AES key using as much of the keyData
    // as possible.

    AESKey key = new AESKey( keyData );

    // Now, we want to encrypt the data.
    // First, create the encryptor engine that we use for the actual
    // encrypting of the data.
    AESEncryptorEngine engine = new AESEncryptorEngine( key );

    // Since we cannot guarantee that the data will be of an equal block
    // length we want to use a padding engine (PKCS5 in this case).
    PKCS5FormatterEngine fengine = new PKCS5FormatterEngine( engine );

    // Create a BlockEncryptor to hide the engine details away.
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    BlockEncryptor encryptor = new BlockEncryptor( fengine, output );

    encryptor.write( data );

    encryptor.close();
    output.close();

    return output.toByteArray();
}

サーバー上の復号化ロジックにアクセスできないことに注意してください。

4

2 に答える 2

3

サーバー側で復号化しているのか、元のデータよりも多くのバイトがあるという理由だけでジャンク文字と呼んでいるのかは完全にはわかりません. 追加されるのが常に 16 バイト以下の場合、それはデータを暗号のブロック サイズで割り切れるようにするために使用される PKCS5 パディングです。デクリプターがパッドを自動的に削除するため、復号化後には表示されません。

ただし、Blackberry のドキュメントを見ると、BlockEncryptor はデフォルトで ECB モードになっているため、暗号化を変更することをお勧めします。これは、平文に関する情報が非常に簡単に漏洩する操作モードです。代わりに、 CBCEncryptorEngine などの BlockEncryptor のサブクラスを選択してください。このモデルの後半で復号化するために、暗号文とともに IV を送信する必要があります。

Blackberry が提供するような構成を使用して暗号化を実装する場合は、非常に注意してください。(ECB の使用など) 非常に間違いを犯しやすく、結果として得られる暗号文は、根本的に壊れていても問題ないように見える場合があります。

于 2013-07-25T13:15:49.837 に答える
0

もちろん、問題はおそらく復号化コードにありますが、表示されていません。復号化中にパディング モードを使用しない可能性があります。このため、パディングされた文字はプレーン テキストのように扱われます。おそらく、次のようなバイト値が含まれます。

01
0202
030303

これはPKCS#5 パディング または PKCS#7 パディングとして知られています。暗号化時に指定されています ( PKCS5FormatterEngine)。

これらは、復号化後にサーバー側で削除する必要があります。可能であれば、ライブラリを使用してこれを行います。PKCS#5 パディングは常に追加されるため、パディング バイトを自分で削除するのも非常に簡単です。印刷できない文字


回答のコメントで示したように、サーバー側を変更できない場合は、クライアント側を変更してzero byte paddingを使用する必要があります。これは、プレーンテキストをブロックサイズで分割できるようになるまで、プレーンテキストにゼロバイトを追加するだけです。これはおそらく手動で行う必要があります。サーバー側は単純にプレーンテキストを復号化したようで、おそらくヌルで終了する文字列を使用するか、プレーンテキストを「トリム」して空白 (終了文字を含む) を削除します。次に暗号化しますがPKCS5FormatterEngine、もちろん使用しません。


PKCS#5 やゼロ バイトのパディングは信頼性や整合性を追加しないことに注意してください。この種のパディングで ECB/CBC 暗号化を使用すると、オラクル攻撃のパディングに対して脆弱になる可能性があります。平文の 1 バイトあたり 128 回の試行での平文の取得。

于 2013-08-06T13:32:40.727 に答える