Java &引用;解密中的最后一个块未完成”;涉及PHP和Base64的BouncyCastle问题
我目前正在用Java编写一个程序,它将接受来自PHP的字符串,并根据需要对它们进行加密或解密。加密机制是AES-256,我正在使用BouncyCastleAPI来实现。为了确保来回传输数据时问题更少,我使用Base64对字符串进行编码。我遇到的问题是,随机地,我不能解密一个字符串,一些字符串可以被解密,其他的不能。我在stackoverflow找到了一篇很棒的文章,我想这会有所帮助 但我真的看不出它如何适合我的情况(我不是加密专家)。这是我目前的密码。谢谢你的帮助Java &引用;解密中的最后一个块未完成”;涉及PHP和Base64的BouncyCastle问题,java,php,aes,bouncycastle,Java,Php,Aes,Bouncycastle,我目前正在用Java编写一个程序,它将接受来自PHP的字符串,并根据需要对它们进行加密或解密。加密机制是AES-256,我正在使用BouncyCastleAPI来实现。为了确保来回传输数据时问题更少,我使用Base64对字符串进行编码。我遇到的问题是,随机地,我不能解密一个字符串,一些字符串可以被解密,其他的不能。我在stackoverflow找到了一篇很棒的文章,我想这会有所帮助 但我真的看不出它如何适合我的情况(我不是加密专家)。这是我目前的密码。谢谢你的帮助 class AES { pr
class AES {
private final BlockCipher AESCipher = new AESEngine();
private PaddedBufferedBlockCipher pbbc;
private KeyParameter key;
AES()
{
init();
}
private void init()
{
try
{
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(256);
SecretKey sk = kg.generateKey();
key=new KeyParameter(sk.getEncoded());
pbbc=new PaddedBufferedBlockCipher(AESCipher, new PKCS7Padding());
}
catch (Exception e)
{
//Take care of later
}
}
private byte[] processing(byte[] input, boolean encrypt)
throws DataLengthException, InvalidCipherTextException {
pbbc.init(encrypt, key);
byte[] output = new byte[pbbc.getOutputSize(input.length)];
int bytesWrittenOut = pbbc.processBytes(
input, 0, input.length, output, 0);
pbbc.doFinal(output, bytesWrittenOut);
return output;
}
private byte[] _encrypt(byte[] input)
throws DataLengthException, InvalidCipherTextException {
return processing(input, true);
}
private byte[] _decrypt(byte[] input)
throws DataLengthException, InvalidCipherTextException {
return processing(input, false);
}
public String Encrypt(String input)
{
try
{
byte[] ba = input.getBytes("UTF-8");
byte[] encr = _encrypt(ba);
byte[] encryptedByteValue = new Base64().encode(encr);
String encryptedValue = new String(encryptedByteValue);
return encryptedValue;//+" and decrypted is "+Decrypt(encryptedValue);
}
catch (Exception e)
{
return "ENCRYPT_ERROR "+e.getMessage();
}
}
public String Decrypt(String input)
{
try
{
byte[] decodedValue = new Base64().decode(input.getBytes());
byte[] retr = _decrypt(decodedValue);
return new String(retr, "UTF-8").replaceAll("\\u0000", "");
}
catch (Exception e)
{
return "DECRYPT_ERROR "+e.getMessage();
}
}
我发现问题出在哪里,这是双重的。这就是我最后要做的: 1) 我使用cURL在Java和PHP之间通信字符串,并将加密文本编码为Base64。由于加号在Base64中有效,并且不由cURL处理(至少在较旧的版本中是如此),因此我会弄乱字符串,从而导致错误。我切换到十六进制编码 2) 我必须从进入Java层的字符串中删除回车(\r\n)字符 希望这对别人有帮助