The problem is in DecryptToBytes()
.
byte[] newKey = keyDerivationFunction.GetBytes(aesManaged.KeySize >> 3);
byte[] newIv = keyDerivationFunction.GetBytes(aesManaged.BlockSize >> 3);
ICryptoTransform decryptor = aesManaged.CreateDecryptor(newKey, newIv);
You are creating the decryptor with a different key and initialization vector than you used for encryption; you are requesting new bytes from the same key derivation function you used for deriving the key and initialization vector for encryption. Because encryption and decryption keys don't match decryption yields corrupted data and especially corrupted padding. Replace the three lines with the following one and it will work.
ICryptoTransform decryptor = aesManaged.CreateDecryptor();
Note that I did not look any closer at the code and "it will work" only means that this bug will be resolved, it does not imply that other parts of the implementation are okay, too.