Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用BouncyCastle解码Rijndael 256时,焊盘块损坏错误_Java_Encryption_Bouncycastle_Rijndael - Fatal编程技术网

Java 使用BouncyCastle解码Rijndael 256时,焊盘块损坏错误

Java 使用BouncyCastle解码Rijndael 256时,焊盘块损坏错误,java,encryption,bouncycastle,rijndael,Java,Encryption,Bouncycastle,Rijndael,这是我的解码类,它使用Bouncycastle,Rijndael 256解密。我在以下方面有一个错误: mode.doFinal(decoded, bytesProcessed); 堆栈跟踪: org.bouncycastle.crypto.InvalidCipherTextException: pad block corrupted at org.bouncycastle.crypto.paddings.PKCS7Padding.padCount(Unknown Source)

这是我的解码类,它使用Bouncycastle,Rijndael 256解密。我在以下方面有一个错误:

mode.doFinal(decoded, bytesProcessed);
堆栈跟踪:

org.bouncycastle.crypto.InvalidCipherTextException: pad block corrupted
    at org.bouncycastle.crypto.paddings.PKCS7Padding.padCount(Unknown Source)
    at org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher.doFinal(Unknown Source)
    at com.imocom.cryptography.Decoder.decrypt(Decoder.java:71)
    at TestingLauncher.main(TestingLauncher.java:46)
这是进行编码的php代码:

<?php 
    $string = "This is a sample string.";
    $secret = "1234567890987654321234567898765";

    $result = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256,
                                            $secret,
                                            $string,
                                            MCRYPT_MODE_CBC,
                                            "1234567890123455555555555555555"
                                           ));

    echo $result."\n";

    $back = mcrypt_decrypt(MCRYPT_RIJNDAEL_256,
                          $secret,
                          base64_decode($result),
                          MCRYPT_MODE_CBC,
                          "12345678999999999999999999999999");

    echo $back."\n";
    ?>
谁能帮帮我,为什么会这样

public class Decoder {

byte[] IV = null;
byte[] encryptionKey = null;
Cipher cipher;
SecretKeySpec key;
BlockCipher blockCipher;
ParametersWithIV _param;

PaddedBufferedBlockCipher mode;
int blockSize;

public Decoder() {

    Security.addProvider(new BouncyCastleProvider());

    try {

        IV = "1234543333333333333333333333333".getBytes("UTF-8");
        encryptionKey = "12222222222222222222222222222222".getBytes("UTF-8");

        blockCipher = new CBCBlockCipher(new RijndaelEngine(256));
        _param = new ParametersWithIV(new KeyParameter(encryptionKey), IV);
        mode = new PaddedBufferedBlockCipher(blockCipher);
        blockSize = blockCipher.getBlockSize();

    } catch (Exception e) {

    }

}

public byte[] decrypt(byte[] encodedText) {

    byte[] decoded = new byte[mode.getOutputSize(encodedText.length)];

    try {
        mode.init(false, _param);


        int bytesProcessed = mode.processBytes(encodedText, 0, encodedText.length, decoded, 0);

        mode.doFinal(decoded, bytesProcessed);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return decoded;
}

我建议您尝试将字符串视为十六进制而不是UTF-8。例如,您的IV是“81a577a68f9e94d6cc02fe23b6ee64a4”。即16字节的十六进制或32字节的UTF-8。AES IV应为16字节以匹配块大小。我可以看到其他错误,但我会留给您查找,因为您说这是针对类的。

来自Bouncy Castle中构造函数的JavaDoc
PaddedBufferedBlockCipher

创建缓冲块密码PKCS7填充

然而,PHP在默认情况下并不使用良好的填充模式,而是简单地添加零值字节,直到到达块的末尾。这在Bouncy Castle中称为
ZeroBytePadding


因此,请使用
ZeroBytePadding
,或者更好地使用PHP实现PKCS#7填充。

Hi:)谢谢您的帮助。我的块大小不是32字节吗?正如构造函数中声明的那样。哦,请让我知道你看到的其他问题。Rijndael!=AES。是允许的(包括32字节)。确切地说,我的是32字节长。“256”可能指块大小或密钥大小。用于加密消息的块/密钥大小是多少?Thx:)添加的StackTrace加密数据来自何处?你能发布生成它的代码吗?添加了php代码进行编码。你在Java代码中的什么地方对输入进行base64解码?另外,请在问题中添加PHP行的输出:
echo$result。“\n”.Hi:)我添加了所有信息,如果您还需要什么,请告诉我。谢谢!:)成功了。
public class Decoder {

byte[] IV = null;
byte[] encryptionKey = null;
Cipher cipher;
SecretKeySpec key;
BlockCipher blockCipher;
ParametersWithIV _param;

PaddedBufferedBlockCipher mode;
int blockSize;

public Decoder() {

    Security.addProvider(new BouncyCastleProvider());

    try {

        IV = "1234543333333333333333333333333".getBytes("UTF-8");
        encryptionKey = "12222222222222222222222222222222".getBytes("UTF-8");

        blockCipher = new CBCBlockCipher(new RijndaelEngine(256));
        _param = new ParametersWithIV(new KeyParameter(encryptionKey), IV);
        mode = new PaddedBufferedBlockCipher(blockCipher);
        blockSize = blockCipher.getBlockSize();

    } catch (Exception e) {

    }

}

public byte[] decrypt(byte[] encodedText) {

    byte[] decoded = new byte[mode.getOutputSize(encodedText.length)];

    try {
        mode.init(false, _param);


        int bytesProcessed = mode.processBytes(encodedText, 0, encodedText.length, decoded, 0);

        mode.doFinal(decoded, bytesProcessed);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return decoded;
}