0

サーバーとの通信に取り組んでおり、最終段階に到達しました。キーをネゴシエートしてセッションキーを設定した後、暗号化されたメッセージを送信すると、サーバーが応答します。
現在、AES-256 CBCを使用しており、ランダムなIVがサーバーに送信され、ローカルに保存されます。私が現在直面している問題は、サーバーから取得したデータを復号化するときです。

decryptCipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(cipher.getIV(), 0, 16));
//Get the array after the 7 bytes from the header
byte[] encrypted = Arrays.copyOfRange(sbResponse.toString().getBytes(), 7, sbResponse.toString().length());

その解析された配列を復号化しようとすると、次のいずれかが発生しますが、サーバーからの応答の長さや内容はまったく変わりません。

  • 次のエラーのため、復号化できません。

    javax.crypto.BadPaddingException: Given final block not properly padded
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)
    at javax.crypto.Cipher.doFinal(DashoA13*..)
    
  • 復号化できません。次のエラーが発生します。

    javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when   decrypting with padded cipher
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)
    at javax.crypto.Cipher.doFinal(DashoA13*..)
    
  • 私はそれを解読することができます、特定のブロックはうまくいきます、しかしそれらのいくつかはクリアテキストの中に奇妙な文字を持っています:

    k¤kC­²O©æÖ—Õw½QøX»ÌEXøÀWHÌËùtiÓaÚo at?the application
    
  • すべてがうまくいきます。

したがって、サーバーからクリーンな応答が得られるまで、大量の呼び出しを行う必要があります。

私が気付いたのは、サーバーがIVを最後に変更することですが、私の側では、暗号に要求したときにIVは常に同じであるため、他にどこを見ればよいかわかりません。

サーバーから応答を取得するコードの抜粋を次に示します。

StringBuilder sb = new StringBuilder();
while (ConnectionStatus.LISTENING.equals(status)) {

            if (in.ready()) {
                sb.append((char) in.read());
            } else {
                if (sb.length() > 0) {
                    status = ConnectionStatus.OPEN;
                }
            }
        }

        if (ConnectionStatus.TIMEOUT.equals(status)) {
            status = ConnectionStatus.OPEN;
            throw new TimeoutException();
        }

誰かが何が起こっているのかについて何か考えがありますか?

さらに詳細やコードなどが必要な場合はお知らせください。

4

1 に答える 1

1

問題は、バイナリデータをに格納することStringです。

がUTF-8を予期している場合、InputStreamReaderほとんどのバイナリストリームは有効なUTF-8ではないため、無効なデータが発生する可能性があります。リーダーが有効な文字ではないバイトのシーケンスに遭遇すると、データは失われます。

少なくとも2つまたは3つの解決策があります。

于 2012-12-18T07:48:10.327 に答える