Java 实现bouncy castle aes 256
我正在开发聊天应用程序。主要功能是以加密的形式发送消息,当消息到达目的地时,可以对其进行解密。我遇到的问题是消息在目的地没有被解密,但是它们以加密的形式到达目的地 代码的工作原理:Java 实现bouncy castle aes 256,java,aes,bouncycastle,Java,Aes,Bouncycastle,我正在开发聊天应用程序。主要功能是以加密的形式发送消息,当消息到达目的地时,可以对其进行解密。我遇到的问题是消息在目的地没有被解密,但是它们以加密的形式到达目的地 代码的工作原理: 客户端A向客户端B发送消息“Hello” 当客户端A单击“发送消息”按钮时,我将该文本保存在一个字符串中,然后该字符串与密钥和iv一起传递给方法Encrypt,如下所示 en=enc.encrypt(msg.getBytes(), key.getBytes(), iv.getBytes()); 我将该字节(en)转
en=enc.encrypt(msg.getBytes(), key.getBytes(), iv.getBytes());
我将该字节(en
)转换为字符串,并将其发送给另一个客户端Bpackage 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);
}
}
您正在定期使用
String.getBytes()
。这几乎肯定是你犯错误的地方getBytes()
依赖于平台,因此您可能会在不同的系统上获得不同的字节。此外,并非所有字节都是有效的字符编码。因此,如果您的密钥/IV由安全的随机字节组成(它们应该是这样的),那么您的解密将失败……有时
一般的答案是使用指定的字符编码(如UTF-8)将字符转换为字节,使用base-64或十六进制等编码将字节转换为字符。您的问题是一个非常不具体的“通过编写代码来修复代码,使其正常工作”。你的问题格式很差,这让我觉得你没有花太多时间。你对省略号的过度使用也让我觉得你太过分了。在办公时间尽可能多地与导师/助教在一起,但你可能仍然会因为落后太多而无法赶上。我刚刚测试了你的加密/解密代码,它可以工作。你的问题一定在别处。因此,我投票结束了这个问题。注意:您真的应该在发布代码示例之前测试它。我花了两分钟才弄明白代码是否正常工作。关于样式的旁注:不要从方法中抛出
异常
,而只抛出必要的已检查异常(IllegalStateException,InvalidCipherTextException
)。我测试了代码伴侣,它工作正常。。。。。但是当我在我的项目中使用这个代码时,我得到了错误,字符串是加密的,但它没有解密。。。。我将必须加密的字符串传递到此程序,然后在接收客户端,我将加密的字符串传递给解密的方法,但它不起作用…@SyedHassaanAli我们无法为您调试整个程序。试着缩小范围,找出哪里出了问题。也许你的网络发送代码有问题?首先尝试发送明文,然后再尝试密文。谢谢你的帮助,伙计我用这个代码替换了那个代码,它成功了…………你可能会从那边接受的答案中得到一些提示,特别是关于字符编码/解码,但那里的代码不安全。当然不要使用ECB模式。试试我的答案。