【问题标题】:Pad block corrupted error decoding Rijndael 256 with BouncyCastle使用 BouncyCastle 解码 Rijndael 256 的垫块损坏错误
【发布时间】:2013-07-07 00:00:40
【问题描述】:

这是我的解码类,它使用 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";
    ?>

这是电话:

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

【问题讨论】:

  • 谢谢 :) 添加了堆栈跟踪
  • 加密数据从何而来?你能发布产生它的代码吗?
  • 添加了进行编码的php代码。
  • 您在 Java 代码的哪个位置对输入进行 base64 解码?另外,您能否将 PHP 行的输出添加到您的问题中:echo $result."\n";
  • 嗨 :) 我添加了所有信息,如果您需要其他信息,请告诉我。

标签: java encryption bouncycastle rijndael


【解决方案1】:

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

创建缓冲分组密码 PKCS7 填充

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

所以请使用ZeroBytePadding,或者更好,在 PHP 中实现 PKCS#7 填充。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 嗨 :) 谢谢你的帮助。我的块大小不是 32 字节吗?如构造函数中声明的那样。哦,请告诉我您看到的其他问题。
    • Rijndael != AES。允许More block sizes(包括 32 个字节)。
    • 没错,我的是 32 字节长。
    • “256”可以指块大小或密钥大小。用于加密消息的块/密钥大小是多少?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2012-08-11
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多