3

私はチャットアプリケーションに取り組んでいます。主な機能は、メッセージを暗号化された形式で送信することであり、宛先に到達すると復号化できます。私が抱えている問題は、メッセージが宛先で復号化されていないが、暗号化された形式で宛先に到達することです。

コードの仕組み:

  1. クライアント A はクライアント B にメッセージ「Hello」を送信します...
  2. クライアントAが「メッセージを送信」ボタンをクリックすると、そのテキストを文字列に保存し、その文字列をキーとivとともにメソッドEncryptに渡します...

    en=enc.encrypt(msg.getBytes(), key.getBytes(), iv.getBytes());
    

    そのバイト ( en) を文字列に変換して、他のクライアント B に送信します。

  3. メッセージを受信する他のクラスを開くと、文字列 (en) を取得し、それを再びバイトに変換して Decrypt メソッドに渡します。しかし、プロジェクトを実行するたびに機能しません。try catch でそれを実行しようとしましたが、うまくいきませんでした。おそらく、すでに大きな try catch ステートメントに含まれているため、さらに混乱しています。

私のコード:

package com.socket;

import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;

public class Encrypt {

  public Encrypt() {
  }

  public static byte[] cipherData(PaddedBufferedBlockCipher cipher, byte[] data)
      throws Exception {
    int minSize = cipher.getOutputSize(data.length);

    byte[] outBuf = new byte[minSize];

    int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0);

    int length2 = cipher.doFinal(outBuf, length1);

    int actualLength = length1 + length2;

    byte[] result = new byte[actualLength];

    System.arraycopy(outBuf, 0, result, 0, result.length);

    return result;
  }

  public static byte[] decrypt(byte[] cipher, byte[] key, byte[] iv)
      throws Exception {

    PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(
        new CBCBlockCipher(new AESEngine()));

    CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv);

    aes.init(false, ivAndKey);

    return cipherData(aes, cipher);
  }

  public byte[] encrypt(byte[] plain, byte[] key, byte[] iv) throws Exception {

    PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(
        new CBCBlockCipher(

        new AESEngine()));

    CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv);

    aes.init(true, ivAndKey);

    return cipherData(aes, plain);
  }
}
4

1 に答える 1

3

String.getBytes()定期的にご利用いただいております。それは、間違いを犯すほぼ確実な場所です。getBytes()はプラットフォームに依存するため、異なるシステムでは異なるバイトを取得する場合があります。さらに、すべてのバイトが有効な文字エンコーディングであるとは限りません。そのため、キー/IV が安全なランダム バイトで構成されている場合 (そうすべきです)、復号化に失敗することがあります。

一般的な答えは、適切に指定された文字エンコーディング (UTF-8 など) を使用して文字をバイトに変換し、base-64 や 16 進数などのエンコーディングを使用してバイトを文字に変換することです。

于 2013-06-09T17:44:58.020 に答える