私は自分の暗号化クラスをソートしたと思っていましたが、問題が発生しました。暗号化ロジックに問題がありますか?
私のクライアント/サーバーモデルはシンプルです。クライアントはサーバーに接続し、メッセージキュー内のメッセージを送信して切断します。
送信される最初のメッセージは絶対に問題ありませんが、最初のブロック(文字列の最初の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クライアントを持っていれば、それは壊れます。
更新:メッセージの冒頭に余分なブロックが追加されている可能性があります。
メッセージを文字列またはバイト配列として送信しますか? Stringの場合は、おそらくエンコーディングの問題ですか? – fge
バイト配列として送信します。 UTF-8でのエンコードとデコード – Cheetah
実際、私は最初に余分なブロックを取得している可能性があります。 – Cheetah