2012-01-13 7 views
0

私は自分の暗号化クラスをソートしたと思っていましたが、問題が発生しました。暗号化ロジックに問題がありますか?

私のクライアント/サーバーモデルはシンプルです。クライアントはサーバーに接続し、メッセージキュー内のメッセージを送信して切断します。

送信される最初のメッセージは絶対に問題ありませんが、最初のブロック(文字列の最初の16文字)が間違っているように見えるメッセージが送信されます。奇妙なことは、他のすべてのブロックがきれいであるように見えることです。これはCBCのように非常に奇妙です。

暗号化設定:

encryptionAlgorithm = "AES"; 
encryptionBitCount = 256; 
encryptionMessageLength = 176; 
hashingAlgorithm = "PBEWithSHA256And256BitAES-CBC-BC"; 
hashingCount = //some number; 
cipherTransformation = "AES/CBC/PKCS7Padding"; 
salt = //some bytes; 
クライアントのための私のロジックは、次のように動作

  • 初期暗号経由:cipher.init(Cipher.ENCRYPT_MODE, cipherInitKey);
  • 接続サーバー

に各メッセージのためのメッセージでありますキュー

  • を経由してソケットにIVを生成し、書き込み:stream.write(cipher.doFinal(message));ため

エンド

  • 外し

のための私のロジック:経由でソケットに書き込み暗号文を生成stream.write(cipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV());

  • サーバーは次のように動作します。

    各メッセージのため

    ソケット(16バイト)から

    • 読むIVを受けました。
    • 暗号を初期化します。cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
    • メッセージをソケットから読み込みます(固定サイズ)。 (176bytes)
    • 解読メッセージ

      奇妙なことのためにcipher.doFinal(message)

    エンドを経由して、それはJavaクライアントとサーバと完全にローカルで動作することです。しかし、サーバーを私のVPSに置き、andriodクライアントを持っていれば、それは壊れます。

    更新:メッセージの冒頭に余分なブロックが追加されている可能性があります。

  • +0

    メッセージを文字列またはバイト配列として送信しますか? Stringの場合は、おそらくエンコーディングの問題ですか? – fge

    +0

    バイト配列として送信します。 UTF-8でのエンコードとデコード – Cheetah

    +0

    実際、私は最初に余分なブロックを取得している可能性があります。 – Cheetah

    答えて

    0

    おそらく最初にIVが表示されます。最初のバイトをIVとして使用し、キーと指定されたIVで復号化する必要があります。これは一般的な手法であり、記述しているとおりに問題を正確に表示します。最初の出力ブロックをスキップして、単純に次のブロックをプレーンテキストとして使用することもできます(ハッキングと呼ばれます)。 1つのことは確信しています:あなたの最初のブロックがゴミであれば、prolbemはIVです。

    +0

    これはBenさんにとってうまくいきましたか? –

    +0

    IVが問題でした。私はメッセージの長さを間違えたところで非常にばかげたミスをしていました。だから、2回目以降の読書から、私が読んでいたIVは、実際には前のメッセージの最後の16バイトでした。 – Cheetah