填充块损坏错误解码Rijndael 256与BouncyCastle



这是我的解码类,它使用Bouncycastle,Rijndael 256解密。我在上有一个错误

mode.doFinal(decoded, bytesProcessed);

Stacktrace:

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";
    ?>

这是呼叫:

byte[] decoded;
decoded = decoder.decrypt(Base64.decodeBase64(encodedTextFromServer));

有人能帮我吗,为什么会发生这种事?

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;
}

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

创建缓冲块密码PKCS7填充

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

因此,请使用ZeroBytePadding,或者更好的方法,在PHP中实现PKCS#7填充。

我建议您尝试将字符串视为十六进制,而不是UTF-8。例如,您的IV是"81a577a68f9e94d6cc02fe23b6ee64a4"。这是16字节的十六进制或32字节的UTF-8。AES IV应该是16个字节以匹配块大小。我可以看到其他错误,但我会把它们留给你去发现,因为你说这是为一节课准备的。

最新更新