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 に答える