2

我目前正在用 Java 编写一个程序,它将接受来自 PHP 的字符串,并根据需要对它们进行加密或解密。加密机制是 AES-256,我使用 BouncyCastle API 来做。为了确保在来回传输数据时出现更少的问题,我使用 Base64 对字符串进行编码。我遇到的问题是随机的,我不能解密一个字符串——一些字符串可以解密,其他的不能。我在 stackoverflow 上找到了一篇很棒的文章,我认为这里可以提供帮助。

但我真的看不出它如何适合我的情况(我不是加密专家)。这是我当前的代码。谢谢你的帮助。

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

1 回答 1

2

我弄清楚问题出在哪里,它是两个方面的。这就是我最终要做的事情:

1) 我使用 cURL 在 Java 和 PHP 之间传递字符串,并将加密文本编码为 Base64。由于加号在 Base64 中有效并且不由 cURL 处理(至少由旧版本),我会损坏字符串,从而导致错误。我切换到十六进制编码。

2) 我必须从进入 Java 层的字符串中删除回车 (\r\n) 字符。

希望这可以帮助某人。

于 2012-10-24T04:13:01.480 回答