【问题标题】:implementing bouncy castle aes 256实施充气城堡 aes 256
【发布时间】:2013-06-08 12:31:11
【问题描述】:

我正在开发一个聊天应用程序。主要功能是以加密形式发送消息,当它们到达目的地时,它们可以被解密。我遇到的问题是消息没有在目的地被解密,但是它们以加密形式到达目的地。

代码的工作原理:

  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);
  }
}

【问题讨论】:

  • 您的问题是一个非常不具体的“通过编写代码来修复我的代码,使其正常工作”。你的问题格式很差,这让我觉得你没有花太多时间在上面。你过度使用省略号也让我觉得你太过分了。尽可能多地在办公时间与您的讲师/助教一起度过,但您仍然可能因落后太远而无法赶上。
  • 我刚刚测试了你的加密/解密代码,它可以工作。你的问题一定在别处。因此,我投票结束了这个问题。
  • 注意:您确实应该在发布代码示例之前对其进行测试。我花了两分钟才弄清楚代码是否正常工作。关于风格的旁注:不要从方法中抛出 Exception,而只抛出必要的检查异常 (IllegalStateException, InvalidCipherTextException)。
  • 我测试了代码伙伴,它工作正常.....但是当我在我的项目中使用此代码时出现错误,字符串被加密但它没有解密......我将必须加密的字符串传递给该程序,然后在接收客户端我将加密的字符串传递给解密的方法,但它不起作用....
  • @SyedHassaanAli 我们无法为您调试整个程序。尝试缩小范围以找出问题所在。也许您的网络发送代码有问题?先尝试以明文发送,然后再尝试密文。

标签: java aes bouncycastle


【解决方案1】:

您经常使用String.getBytes()。这几乎是你犯错误的一个地方。 getBytes() 依赖于平台,因此您可能会在不同的系统上获得不同的字节。此外,并非所有字节都是有效的字符编码。因此,如果您的密钥/IV 包含安全的随机字节(它们应该如此),那么您的解密将失败......有时。

一般的答案是使用明确指定的字符编码(例如 UTF-8)将字符转换为字节,并使用 base-64 或十六进制等编码将字节转换为字符。

【讨论】:

  • 谢谢你的帮助,我用这个stackoverflow.com/questions/10303767/…替换了那个代码,它工作了......
  • 您可能会从那里接受的答案中得到一些提示,特别是关于字符编码/解码,但那里的代码并不安全。当然不要使用ECB模式。试试我的回答here
猜你喜欢
  • 2011-06-12
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多