简体   繁体   中英

javax.crypto.BadPaddingException: pad block corrupted

I'm trying to encrypt something, and decrypt it. I'm failing on the decryption - I get the exception above. I tried changing ctLength and ptLength, but to no avail. What am I doing wrong?
I'm trying to encrypt: 0 0 0 0 0 0 0 0

private Cipher encrypt(byte[] input)
{
    try
    {
        SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");

        // encryption pass
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
        int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
        ctLength += cipher.doFinal(cipherText, ctLength);
        FileOutputStream fs = new FileOutputStream(savedScoresFileName);
        fs.write(cipherText);

        return cipher;
    }
    catch (Exception e)
    {
        Log.e("encrtypt", "Exception", e);
    }

    return null;
}

private String decrypt()
{
    try
    {
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");

        SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
        byte[] cipherText = new byte[32];

        FileInputStream fl = new FileInputStream(savedScoresFileName);
        fl.read(cipherText);

        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] plainText = new byte[cipher.getOutputSize(32)];
        int ptLength = cipher.update(cipherText, 0, 32, plainText, 0);
        ptLength += cipher.doFinal(plainText, ptLength);

        return new String(plainText).substring(0, ptLength);
    }
    catch (Exception e)
    {
        Log.e("decrypt", "Exception", e);
    }

    return null;
}

This code was copied from this , which worked.

Your code has a number of issues, but your problem is caused by your file reading code and your strange method of performing the encryption and decryption.

Don't use the update() method, just use doFinal() and correct your file writing/reading code. Eg your decryption method should look something like:

try {
  Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");

  SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

  // Here you need to accurately and correctly read your file into a byte
  // array. Either Google for a decent solution (there are many out there)
  // or use an existing implementation, such as Apache Commons commons-io.
  // Your existing effort is buggy and doesn't close its resources.      
  byte[] cipherText = FileUtils.readFileToByteArray(new File(savedScoresFileName));


  cipher.init(Cipher.DECRYPT_MODE, key);

  // Just one call to doFinal
  byte[] plainText = cipher.doFinal(cipherText);

  // Note: don't do this. If you create a string from a byte array,
  // PLEASE pass a charset otherwise your result is platform dependent.
  return new String(plainText);
} catch (Exception e) {
  e.printStackTrace();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM