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 或十六进制等编码将字节转换为字符。

于 2013-06-09T17:44:58.020 回答