2

我正在尝试将 BouncyCastle 特定实现转换为通用实现,但由于我仍在努力学习基础知识,所以我很难做到。

这是之前有效的 BC 代码:

public int decrypt(SecurityToken token, byte[] dataToDecrypt, int inputOffset, 
      int inputLength, byte[] output, int outputOffset) {
  // Make new RijndaelEngine
  RijndaelEngine engine = new RijndaelEngine(128);

  // Make CBC blockcipher
  BufferedBlockCipher bbc = new BufferedBlockCipher(
      new CBCBlockCipher(engine));

  // find right decryption key and right initialization vector
  KeyParameter secret = new KeyParameter(
      token.getRemoteEncryptingKey());
  byte[] iv = token.getRemoteInitializationVector();

  // initialize cipher for decryption purposes
  bbc.init(false, new ParametersWithIV(secret, iv));
  decryptedBytes = bbc.processBytes(dataToDecrypt, inputOffset,
      inputLength, output, outputOffset);

  decryptedBytes += bbc.doFinal(output, outputOffset+decryptedBytes);
  return decryptedBytes;
}

这是我迄今为止的谦虚尝试:

SecretKeySpec spec = new SecretKeySpec(
    token.getRemoteEncryptingKey(),
    "AES");

cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, spec, new IvParameterSpec(token.getRemoteInitializationVector()));
decryptedBytes = cipher.update(dataToDecrypt, inputOffset,
    inputLength, output, outputOffset);
decryptedBytes += cipher.doFinal(output, outputOffset+decryptedBytes);
return decryptedBytes;

这使

javax.crypto.BadPaddingException: Given final block not properly padded

这是函数的输入:

decrypt: dataToDecrypt.length=1088 inputOffset=0 inputLength=1088 output.length=16384 outputOffset=1180
decrypt: token.getRemoteEncryptingKey()=lBjgFjfR3IilCyT5AqRnXQ==
decrypt: token.getRemoteInitializationVector()=0JFEdkuW6pMo0cwfKdZa3w==

我错过了什么?

E:输入数据

4

1 回答 1

1

通常BadPaddingException意味着:

  • 原始明文未使用您建议的填充算法填充。因此,当数据被加密时,可能没有使用 PKCS#5。

  • 您使用了错误的密钥进行解密。这导致解密完成后填充看起来不正确。

希望您可以查看您的环境并确定其中任何一个是否可能?查看您的 BouncyCastle 代码,我会假设您根本没有使用填充。尝试改变:

cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

到:

cipher = Cipher.getInstance("AES/CBC/NoPadding");
于 2012-11-16T16:27:42.950 回答