【发布时间】:2013-06-08 12:31:11
【问题描述】:
我正在开发一个聊天应用程序。主要功能是以加密形式发送消息,当它们到达目的地时,它们可以被解密。我遇到的问题是消息没有在目的地被解密,但是它们以加密形式到达目的地。
代码的工作原理:
- 客户端 A 向客户端 B 发送消息“Hello”...
-
当客户端 A 单击“发送消息”按钮时,我将该文本保存在一个字符串中,然后将该字符串与密钥和 iv 一起传递给方法 Encrypt 像这样...
en=enc.encrypt(msg.getBytes(), key.getBytes(), iv.getBytes());我将该字节 (
en) 转换为字符串并将其发送给另一个客户端 B。 当我打开另一个接收消息的类时,我得到字符串 (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